我正在构建一个Telegram bot,它使用ConversationHandler
来提示用户提供有关机器人应该如何操作的一些参数和设置。此信息存储在一些全局变量中,因为它需要由程序内的不同函数可用和编辑。每个全局变量都是一个字典,其中每个用户都与其自己的值相关联。这是一个例子:
language = {123456: 'English', 789012: 'Italian'}
其中123456
和789012
是从每个函数内的update.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
成为全局变量,但我认为必须有更好的解决方案。有什么想法吗?感谢。
答案 0 :(得分: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"])