我正在构建一个 Telegram 机器人,用于ConversationHandler
提示用户输入一些关于机器人应该如何运行的参数和设置。此信息存储在一些全局变量中,因为它需要由程序内的不同函数使用和编辑。每个全局变量都是一个字典,其中每个用户都与自己的值相关联。这是一个例子:
language = {123456: 'English', 789012: 'Italian'}
where123456
和是从每个函数内部789012
获取的用户 ID 。update.message.from_user.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
一个全局变量,但我认为必须有更好的解决方案。有什么想法吗?谢谢。