TelegramとPythonを使った初心者向けチャットボットの作り方

あらすじ

Telegramはクラウドベースの携帯とデスクトップ向けメッセージアプリのことです。Telegramではあなた自身のボットを作ることができ、それこそこのアプリの最も優れた点です。

本チュートリアルではPythonを使用し、スタートコマンドに応じてユーザーに反応し、ユーザーが送信した文章を大文字に変換して返信するボットを作ってみます。

最終的に作ったボットはHeroku上で作動させてみましょう。

ボットとは?

ボットは私たちに代わって様々なタスクを自動的に行うプログラムのことです。例えばeCommerceのウェブサイトで商品の最安値を調べることができます。

ボットがなければ自分でeCommerceのウェブサイトを開いて商品を検索し、そして商品を選択して結果を得る必要があります。

ボットがあれば検索を行うだけで結果を得ることができます。早くて簡単でしょう?

基本設定

ボットを構成する前にTelegramで利用登録することが求められます。Telegram web clientを利用すれば、素早く自分のブラウザでボットをテストすることができます。

Telegramのアプリを開き、@BotFatherを検索してチャットを開始してください。それから/newbotと入力すると、名前とユーザーネームを記入するように求められます。

それらを入力するとあなたのaccess TOKENとドキュメンテーションへのリンクが得られます。

ドキュメンテーションへ移動するとボットのAPI URL―https://api.telegram.org/bot<token>/METHOD_NAMEがあるので、このURLをボットとの会話のために使います。

このURLから返答をもらってみましょう。上記のURLをコピーし、<token>の部分をあなたのaccess TOKENに変更し、METHOD_NAMEをgetMeに変更してください。

GetMeメソッドはあなたが作ったボットの詳細を見るために用います。こうすれば、下記の形式でJSONレスポンスが得られます:

{
  "ok": true,
  "result": {
    "id": YOUR_BOT_ID,
    "is_bot": true,
    "first_name": "YOUR_BOT_NAME",
    "username": "YOUR_BOT_USERNAME"
  }
}

これでTelegramでのボットの設定は完成です。次は、python-telegram-bot libraryをインストールしてください:

pip install python-telegram-bot

python-telegram-bot libraryはTelegramボットAPI用の純粋なPythonインターフェイスを提供し、ボットの発達を容易で単純なものにするアブストラクションをいくつか持っています。

このライブラリーは私たちのAPI URLにメッセージを送信し、そのURLから返信を受け取ることを手助けします。

これで基本設定は完成です。

コードを書いてみましょう

python-telegram-bot libraryにはtelegram.extというサブモジュールがあるので、これをボットに使用しましょう。

telegram.extモジュールにはいくつかのクラスがあって、これから使用するものはUpdater、Dispatcher、CommandHandler、MessageHandlerと Filtersです。

Updaterの役割はアップデートを受信してそれをDispatcherへと送ることです。Dispatcherにはコマンドか普通のメッセージかによって適切に対応するハンドラーが付け加えられます。

まずは、Updaterのオブジェクトを作り、TOKENをあなたのボットのtokenに書き換えます。

from telegram.ext import Updater
updater = Updater(token='TOKEN')

先ほど作ったUpdaterのオブジェクトとDispatcherを接続します。接続方法は以下のようになります:

dispatcher = updater.dispatcher

そして具体的なアップデートのファンクションを記入します。

def start(bot, update):
  update.message.reply_text("I'm a bot, Nice to meet you!")

次にCommand Handlerを書き加えます。

from telegram.ext import CommandHandler
start_handler = CommandHandler('start', start)
dispatcher.add_handler(start_handler)

それではボットを起動してみましょう。以下のように起動します。

updater.start_polling()

今までに記入したスクリプトの全体はこのようになります。

# - *- coding: utf- 8 - *-
from telegram.ext import Updater, CommandHandler

def start(bot, update):
  update.message.reply_text("I'm a bot, Nice to meet you!")

def main():
  # Create Updater object and attach dispatcher to it
  updater = Updater(TOKEN)
  dispatcher = updater.dispatcher
  print("Bot started")

  # Add command handler to dispatcher
  start_handler = CommandHandler('start',start)
  dispatcher.add_handler(start_handler)

  # Start the bot
  updater.start_polling()

  # Run the bot until you press Ctrl-C
  updater.idle()

if __name__ == '__main__':
  main()

あなたのスクリプトを実行してみてください。全て正しくできていたら、/startと入力すればボットが反応するはずです。

Dispatcherに追加の指示を記入したCommand Handlerを付け足すことによってより多くの動作を行うことができます。

コードの追加

ここまではうまく出来ましたが、今のままではボットはStartコマンドにしか対応できないので、ランダムの文章やコマンドがない場合ボットは反応しなくなります。それではMessageHandlerを駆使してこの問題を解決しましょう。

MessageHandlerは全てのコマンドが無いメッセージに対応します。ユーザーがボットにコマンドの無いメッセージを送ったら、大文字に変換されたメッセージで返信してくれます。

以下のようにMessage Handlerを追加してください。

from telegram.ext import MessageHandler
upper_case = MessageHandler(Filters.text, upper_case)
dispatcher.add_handler(upper_case)

Handlerではテキストをランダムに部分的に切り取ったようなノンコマンドメッセージを除外するためにFilters.textを用い、それからそこにupper_caseメソッドを書き加えます。

それではノンコマンドメッセージに対処するファンクションを記入しましょう:

def upper_case(bot, update):
  update.message.reply_text(update.message.text.upper())

最終的にこのようなスクリプトが書けましたね:

# - *- coding: utf- 8 - *-
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters

def start(bot, update):
  update.message.reply_text("I'm a bot, Nice to meet you!")
  
def convert_uppercase(bot, update):
  update.message.reply_text(update.message.text.upper())

def main():
  # Create Updater object and attach dispatcher to it
  updater = Updater(TOKEN)
  dispatcher = updater.dispatcher
  print("Bot started")

  # Add command handler to dispatcher
  start_handler = CommandHandler('start',start)
  upper_case = MessageHandler(Filters.text, convert_uppercase)
  dispatcher.add_handler(start_handler)
  dispatcher.add_handler(upper_case)

  # Start the bot
  updater.start_polling()

  # Run the bot until you press Ctrl-C
  updater.idle()

if __name__ == '__main__':
  main()

もう一度自分のスクリプトを実行してみてください。

全てうまくできていたらスタートコマンドでボットがあなたに挨拶し、ノンコマンドメッセージには大文字に変換されたメッセージを返します。

これで完成?

ここまで出来れば、スタートコマンドによって「ハロー」と答え、ノンコマンドメッセージには大文字に変換したメッセージを返すボットの完成です。

このリンクにはより詳しい情報やボットに他の機能を追加する方法が載せられています。

しかし、まだ手を付けていない問題が一つあります。それは、Pythonスクリプトを停止させたらボットも反応を停止してしまうということです。

どうにかしてスクリプトを例えば(Heroku)のようなプラットフォームで作動させ続けなければなりません。

次の章ではスクリプトを部分的に繰り返し作動させなくてもいいように、Telegramボットをプラットフォームで作動させる方法をお教えします。

Herokuとは?

HerokuとはPaaS (Platform as a Service) と呼ばれるプラットフォームサービスです。

これはインフラストラクチャ(サービス)の管理が不要で、スケーリング、デプロイメント、メンテナンスをクラウド内で処理してくれるので開発者はアプリケーションのコードを書く事に専念できます。

それではボットのデプロイをスタートしましょう。

注意:WindowsではなくLinuxか類似システムの使用を想定しています。

設定

まず初めに、ローカルレポジトリにコードを書きます。

ターミナルから以下のコマンドを実行して下さい。

cd telegram-bot
git init

これによりtelegram-bot という名前の空のgit レポジトリがイニシャライズされます。telegram-bot ディレクトリの中にあなたのスクリプトを入れて下さい。そして以下の様に、あなたのスクリプトをローカルレポジトリに追加してください。

git add .
git commit -m "added final bot script"

Herokuにアカウントを作り、このリンクからheroku-cilをインストールしてください。

これで基本の設定が完了しました。

メインの作業

telegram-botディレクトリ内で作業していることを確認して下さい。

Herokuでのデプロイ過程で使用する、Procfilereqauirements.txtという2つのファイルを作ります。

早速1番目のファイルを作り、Procfileと名付けましょう。

注意:.txt   の様な拡張子はつけません。Procfileだけです。

Procfileの中に以下を入力したら保存します。

worker: python .py

デプロイされたらProcfileはHerokuに何をするかを指示します。私達はここでHerokuにボットのスクリプトを実行するように指示しています。

次にrequirments.txtを作ります。そのためにはpipをインストールする必要があります。もしあなたがpipをインストールしていなければ、このリンクからできます。

pip をインストールしたらpipを使いpipreqsをインストールします。

pip install pipreqs

そして以下のコマンドを実行します

pwd
pipreqs 

上記の作業によりtelegram-botディレクトリの中にrequirements.txtが生成されます。requirement.txtはボットのスクリプトのために使われるディペンデンシー(依存性)のリストを含み、Herokuがそれらのディペンデンシーをクラウドにインストールするために使われます。

さて、二つのファイルが作成されました。これを以下の様にローカルgitレポジトリに追加します。

git add Procfile requirements.txt
git commit -m "added heroku config files"

最終ステップ

ターミナルからインストールしたheroku-cli を使い、ボットをデプロイします。

heroku login

heroku-cliがあなたのHerokuアカウントのユーザーネームとパスワードを聞いてくるので入力して、以下の様にタイプしてください

heroku create

するとHerokuクラウドの中にスクリプトを実行するLinuxの仮想マシンが作られます。

Herokuはherokuという名前のリモートgitレポジトリも作ります。 そこにコードをプッシュします。以下の様にタイプしてください。

git push heroku master

上記を行うと、ローカルマシンからHerokuクラウドにコードがプッシュされます。これによりHerokuはスクリプトの実行を開始します。

これまでの手順を正しく行えば、あなたのボットと会話ができます。

ブラウザのテレグラムを開きボットとお喋りをはじめましょう ボットは対応し、あなたはスクリプトの実行をローカルで何度も繰り返す必要はありません。

ありがとうございました!

原文

https://chatbotslife.com/your-first-chatbot-using-telegram-and-python-part-1-796894016ba8
https://chatbotslife.com/your-first-chatbot-using-telegram-and-python-part-2-c28035cee70a

チャットボットライフとの提携により、翻訳し掲載しています。
チャットボットライフとは、最新のボット、AI、NLP、ツール等を扱うメディアです。