30分でPythonのシンプルな電報ボット

Habréでは、それだけでなく、ボットについてあまりにも多くのことが言われているので、あまりにも多すぎます。 しかし、数週間前にこのトピックに興味を持ったので、私は普通の資料を見つけることができませんでした。すべての記事はダミーのものであり、ユーザーメッセージへの応答としてメッセージを送信するか、無関係でした。 これにより、私のような初心者に、多かれ少なかれ意味のあるボットを作成して起動する方法を説明する記事を書くようになりました(機能を拡張する可能性があります)。



パート1:ボットを登録する



最も単純で最も説明されている部分。 非常に簡単に: @BotFatherボットを見つけ、彼に/ start 、または/ newbotを書き込み 、彼が要求するフィールド(ボット名と短縮名)を入力し、ボットトークンとドキュメントへのリンクを含むメッセージを取得する必要があります。 トークンは、できれば信頼できるものとして保存する必要があります。これは、これがボットを認証して対話するための唯一のキーだからです。



パート2:コードを記述する準備



タイトルですでに述べたように、ボットをPythonで記述します。 この記事では、PyTelegramBotAPI(Telebot)ライブラリの使用方法について説明します。 Pythonがインストールされていない場合、最初にこれを行う必要があります。Linuxターミナルでは、次のように入力する必要があります。



sudo apt-get install python python-pip
      
      





Windowsを使用している場合は、公式サイトからPythonをダウンロードする必要があります。



その後、LinuxターミナルまたはWindowsコマンドプロンプトで、次を入力します。



 pip install pytelegrambotapi
      
      





これで、コードを作成する準備がすべて整いました。



パート3:メッセージを受信して​​「こんにちは」と言う



小さな余談。 テレグラムは、ボットにユーザーアクションについて2つの方法で伝えることができます。サーバー要求への応答(ロングポール)、およびテレグラムサーバー自体がボットに書き込んだメッセージを送信するWebhookを介して。 2番目の方法は明らかに良く見えますが、専用IPアドレスが必要で、サーバーにSSLがインストールされています。 この記事では、サーバーをセットアップするのではなく、ボットを作成することについてお話したいので、Long Pollを使用します。



お気に入りのテキストエディターを開き、ボットコードを記述しましょう。



最初に行うことは、ライブラリをインポートし、ボットトークンを接続することです。



 import telebot; bot = telebot.TeleBot('% %');
      
      





テキストメッセージを受信するメソッドを宣言します。



 @bot.message_handler(content_types=['text']) def get_text_messages(message):
      
      





コードのこのセクションでは、テキストメッセージのリスナーとそれらを処理するメソッドを宣言しました。 content_typesフィールドは、1つだけでなく、さまざまな値を取ることができます。たとえば、



 @bot.message_handler(content_types=['text', 'document', 'audio'])
      
      





テキストメッセージ、ドキュメント、音声に応答します。 詳細は公式ドキュメントに記載されています。



メソッドにいくつかの機能を追加します。ユーザーが「Hello」と書いた場合、「Hello、どうすれば手伝うことができますか?」と言い、「/ help」コマンドを書いたら、ユーザーに「Hello」と書くように伝えます。



 if message.text == "": bot.send_message(message.from_user.id, ",     ?") elif message.text == "/help": bot.send_message(message.from_user.id, " ") else: bot.send_message(message.from_user.id, "   .  /help.")
      
      





このコードは、私には思えるので、コメントを必要としません。 ここで、コードに1行だけ追加する必要があります(すべてのメソッドの外側)。



 bot.polling(none_stop=True, interval=0)
      
      





ボットは、Telegramサーバーに「誰かが私に書いたのですか?」と絶えず尋ねます。ボットに書き込むと、Telegramはメッセージを送信します。 ファイル全体を保存し、コンソールに書き込みます



 python bot.py
      
      





bot.pyは、ファイルの名前です。



これで、ボットを作成して結果を確認できます。



画像






パート4:ボタンとメッセージスレッド



メッセージを送信することは間違いなく楽しいですが、ユーザーと対話することはさらに楽しいです。ユーザーに質問し、それらに対する回答を得ることができます。 ボットがユーザーに名前、姓、年齢を順番に尋ねるとします。 これを行うには、ボットのregister_next_step_handlerメソッドを使用します。



 name = ''; surname = ''; age = 0; @bot.message_handler(content_types=['text']) def start(message): if message.text == '/reg': bot.send_message(message.from_user.id, "  ?"); bot.register_next_step_handler(message, get_name); #  –  get_name else: bot.send_message(message.from_user.id, ' /reg'); def get_name(message): #  global name; name = message.text; bot.send_message(message.from_user.id, '   ?'); bot.register_next_step_handler(message, get_surnme); def get_surname(message): global surname; surname = message.text; bot.send_message('  ?'); bot.register_next_step_handler(message, get_age); def get_age(message): global age; while age == 0: #    try: age = int(message.text) #,     except Exception: bot.send_message(message.from_user.id, ', '); bot.send_message(message.from_user.id, ' '+str(age)+' ,   '+name+' '+surname+'?')
      
      





そして、ユーザーデータを記録しました。 この例は非常に単純化された例を示しています。良い例として、データベースに中間データとユーザー状態を保存する必要がありますが、今日はデータベースではなくボットを使用しています。 最後の仕上げ-すべてが正しく入力されていることを確認するようユーザーに求めますが、そのようにではなく、ボタンで入力してください! これを行うには、get_ageメソッドのコードを少し編集します



 def get_age(message): global age; while age == 0: #    try: age = int(message.text) #,     except Exception: bot.send_message(message.from_user.id, ', '); keyboard = types.InlineKeyboardMarkup(); #  key_yes = types.InlineKeyboardButton(text='', callback_data='yes'); # «» keyboard.add(key_yes); #    key_no= types.InlineKeyboardButton(text='', callback_data='no'); keyboard.add(key_no); question = ' '+str(age)+' ,   '+name+' '+surname+'?'; bot.send_message(message.from_user.id, text=question, reply_markup=keyboard)
      
      





そして今、ボットはキーボードを送信しますが、クリックしても何も起こりません。 ハンドラーメソッドを作成しなかったからです。 書きましょう:



 @bot.callback_query_handler(func=lambda call: True) def callback_worker(call): if call.data == "yes": #call.data  callback_data,       .... #  ,    bot.send_message(call.message.chat.id, ' : )'); elif call.data == "no": ... #
      
      





ファイルの先頭に1行追加するだけです。



 from telebot import types
      
      





これですべて、ボットを保存して実行できます。



画像







All Articles