2016-12-11 13 views
0

ConversationHandlerを使用するTelegramボットを構築して、ボットの動作に関するいくつかのパラメータと設定をユーザーに促します。この情報は、プログラム内のさまざまな機能によって使用可能であり、編集可能である必要があるため、いくつかのグローバル変数に格納されます。すべてのグローバル変数は、各ユーザーが独自の値に関連付けられている辞書です。ここでの例は次のとおりJobQueueを使用してメッセージを継続的に更新する

123456789012各関数内 update.message.from_user.idから得られたユーザIDである
language = {123456: 'English', 789012: 'Italian'} 

すべての必要な情報を受信して​​保存した後、ボットはWebページから取得したテキストを含むメッセージを送信する必要があります。 Webページ上のテキストは常に更新されるので、ユーザーがコマンド/stopを送信するまで、メッセージを60秒ごとに編集して新しいテキストで更新します。

これを達成するために、私の心に来た最初のソリューションは、まったく動作しないでしょう。もちろん、

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秒ごとに呼び出されます。しかし、これはどちらもうまくいかないでしょう。実際には、ユーザー設定に従ってページをフェッチし、正しいchat_idにメッセージを送信するために、関数内にupdateパラメータが必要です。私はbot, jobと一緒に関数にそのパラメータを渡す必要がありますが、それは可能ではないようです。

そうでなければ、updateをグローバル変数にする必要がありますが、より良い解決策が必要だと思いました。何かご意見は?ありがとう。

答えて

1

私は同じ問題がありました。 docsを少し掘り下げて、contextというジョブオブジェクトを渡すことができ、コールバック関数によってjob.contextという名前でアクセスできることが明らかになりました。

コンテキスト(オプション[オブジェクト]) - コールバック関数に必要な追加データ。コールバックのjob.contextからアクセスできます。既定値はなし

global language 
language = {123456: 'English', 789012: 'Italian'} 
j=updater.job_queue 

context={"chat_id":456754, "from_user_id":123456, "message_id":111213} 

update_job = job(update_message, 60, repeat=True, context=context) 
j.put(update_job, next_t=0.0) 

def update_message(bot, job): 
    global language 
    context=job.context 
    url = "http://example.com/etc/" + language[context["from_user_id"]] 
    result = requests.get(url).content 
    bot.editMessageText(result, 
        chat_id = context["chat_id"], 
        message_id = context["message_id"]) 
関連する問題