2016-12-11 28 views
0

我正在构建一个电报机器人,它使用ConversationHandler来提示用户有关机器人应该如何工作的几个参数和设置。这些信息存储在一些全局变量中,因为它需要被程序内部的不同功能所使用和编辑。每个全局变量都是一个字典,其中每个用户都与自己的值相关联。下面是一个例子:使用JobQueue不断刷新消息

language = {123456: 'English', 789012: 'Italian'} 

其中123456789012update.message.from_user.id每个功能内所获得的用户ID。

在收到并存储了所有必需的信息后,机器人应发送一条消息,其中包含从网页中提取的文本;网页上的文本会不断刷新,所以我希望每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一个全局变量,但我认为必须有一个更好的解决方案。有什么想法吗?谢谢。

回答

1

我有同样的问题。稍微深入docs就会发现,您可以传递作业对象参数context,然后可以通过回调函数job.context访问该参数。

context(可选[object]) - 回调函数所需的其他数据。可以通过回调中的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"])