Pythonのテレグラムボット

最近、私は自分のために新しいIT会社でインターンシップを取得しました。私たちの(私のチームの)プロジェクトは、人事マネージャーの作業の一部を自動化する電報ボットでした。最初の週は、私たちが必要と考えるものは何でも自習するために私たちに与えられました(そして私は何かを学ぶための最良の方法は練習であると確信しています)、それで私は行動し始めました。プログラミング言語はPythonを選択したので(おそらくカバーからその理由は明らかです)、この記事ではそれを使って例を分析します。





BotFather

ケーブルボットを作成するには、ユーザー@BotFatherコマンド/ newbotを記述します。将来のボットの名前と@usernameを要求します。ここでは複雑なことは何もありません-すべてを教えてくれます(主なことは、@ usernameはビジーでなく、「bot」で終わるということです)。BotFatherはHTTPAPIトークンを送信します。これは、ボットの操作に使用します。





ボットの作成
ボットの作成

TelebotとPythonの力

ボットの作成はそれほど簡単ではないようにいつも私には思えました。正直、長い間やってみたかったのですが、時間が足りなかった(一晩以上かかると思った)か、技術が選べなかった(どういうわけかc#のチュートリアルを見た)、しかし、おそらくそれはただの怠惰でした。しかし、それから私はそれが機能する必要があったので、私はそれをもう延期しませんでした。





python . , , . ( ) 6 (!) . :





import telebot
bot = telebot.TeleBot('1111105161:AAHIjyAKY4fj62whM5vEAfotuixC5syA-j8')
@bot.message_handler(commands=['start'])
def start_command(message):
    bot.send_message(message.chat.id, "Hello!")
bot.polling()
      
      



最初のメッセージ

/start, . : telebot ( pyTelegramBotAPI pip install pyTelegramBotAPI



( pip install telebot



!), , , BotFather. , ( “/start”), , , “Hello!”. , , , . - , "" .





Flask & Requests

Telebot, , , “”. , hr- (), / / . , . python - flask. , 5000- (http://localhost:5000/):





from flask import Flask
 
app = Flask(__name__)


@app.route("/", methods=["GET"])
def index():
    return "Hello, World!"
 
 
if __name__ == "__main__":
    app.run()
      
      



, . (habr), . , “Hello!” :





from flask import Flask, request
import requests

app = Flask(__name__)


def send_message(chat_id, text):
    method = "sendMessage"
    token = "1111105161:AAHIjyAKY4fj62whM5vEAfotuixC5syA-j8"
    url = f"https://api.telegram.org/bot{token}/{method}"
    data = {"chat_id": chat_id, "text": text}
    requests.post(url, data=data)


@app.route("/", methods=["POST"])
def receive_update():
    chat_id = request.json["message"]["chat"]["id"]
    send_message(chat_id, "Hello!")
    return "ok"


if __name__ == "__main__":
    app.run()
      
      



, . , . , , . telegram API setWebhook. , url, ( http://localhost:5000/). , : " localhost", localhost . , setWebhook https url-. ngrok, . ngrok, “ngrok http 5000”. :





ngrok
ngrok

setWebhook, , postman. post https://api.telegram.org/bot<>/setWebhook url. :





setWebhook
setWebhook

telebot, . , flask’e, . ? -, send_message . :





from flask import Flask, request
import telebot

app = Flask(__name__)
 
bot = telebot.TeleBot('1111105161:AAHIjyAKY4fj62whM5vEAfotuixC5syA-j8')


@app.route("/", methods=["POST"])
def receive_update():
    chat_id = request.json["message"]["chat"]["id"]
    bot.send_message(chat_id, "Hello!")
    return "ok"


if __name__ == "__main__":
    app.run()
      
      



, , , , @bot.message_handler - , (, , , . .). , flask , telebot. bot.polling(), “ ”. , - . , :





from flask import Flask, request
import telebot

bot = telebot.TeleBot('1111105161:AAHIjyAKY4fj62whM5vEAfotuixC5syA-j8')
bot.set_webhook(url="https://8c6f687b75c9.ngrok.io")
app = Flask(__name__)


@app.route('/', methods=["POST"])
def webhook():
    bot.process_new_updates(
        [telebot.types.Update.de_json(request.stream.read().decode("utf-8"))]
    )
    return "ok"


@bot.message_handler(commands=['start'])
def start_command(message):
    bot.send_message(message.chat.id, 'Hello!')


if __name__ == "__main__":
    app.run()
      
      



ここでは、以前にpostmanを使用して行ったのと同様に、set_webhookメソッドを使用し、空のルートで「小さな魔法」を記述して、ボットの更新を正常に受信します。もちろん、これはあまり良い方法ではありません。将来的には、受信メッセージを処理する機能を自分で作成することをお勧めします。しかし、最初に、これが最善の解決策だと思います。





結論

Pythonでテレグラムボットを書くのはそれほど難しいことではありませんが、この記事で話そうとした落とし穴もあります。もちろん、これはほんの始まりに過ぎませんが、最後のコードはサーバー側のテンプレートとして使用でき、テレグラムボットで機能します。その後、あなたの裁量で機能を増やすことだけが残ります。








All Articles