ConversationHandler
ボットの動作に関するいくつかのパラメーターと設定をユーザーに求めるために使用する Telegram ボットを構築しています。この情報は、プログラム内のさまざまな関数で使用および編集できる必要があるため、いくつかのグローバル変数に保存されます。すべてのグローバル変数は、各ユーザーが独自の値に関連付けられているディクショナリです。次に例を示します。
language = {123456: 'English', 789012: 'Italian'}
ここで123456
、 とは、各関数内789012
から取得したユーザー IDです。update.message.from_user.id
必要な情報をすべて受信して保存した後、ボットは Web ページから取得したテキストを含むメッセージを送信する必要があります。Web ページのテキストは常に更新されるため、ユーザーがコマンドを送信するまで、60 秒ごとにメッセージを編集し、新しいテキストで更新する必要があります/stop
。
これを達成するために頭に浮かんだ最初の解決策は、次のようなものでした
info_message = bot.sendMessage(update.message.chat_id, text = "This message will be updated...")
...
def update_message(bot, update):
while True:
url = "http://example.com/etc/" + language[update.message.from_user.id]
result = requests.get(url).content
bot.editMessageText(result, chat_id = update.message.chat_id, message_id = info_message.message_id)
time.sleep(60)
もちろん、それはまったくうまくいきませんし、本当に悪い考えです。JobQueue拡張機能が必要であることがわかりました。しかし、私には理解できないことがあります。
JobQueue では、ジョブのコールバック関数を設定する必要があります。私の場合、関数は
def update_message(bot, job):
url = "http://example.com/etc/" + language[update.message.from_user.id]
result = requests.get(url).content
bot.editMessageText(result, chat_id = update.message.chat_id, message_id = info_message.message_id)
60秒ごとに呼び出されます。ただし、これも機能しません。実際、update
ユーザー設定に従ってページをフェッチし、メッセージを正しい chat_id に送信するには、関数内でパラメーターが必要です。そのパラメータを とともに関数に渡す必要がありますbot, job
が、それは不可能のようです。
そうでなければupdate
、グローバル変数を作成する必要がありますが、もっと良い解決策があるに違いないと思いました。何かご意見は?ありがとう。