如何将Python函数forwardmes2withdelay中的mes变量传递至forwardmestime
解决Telegram Bot消息ID跨函数传递实现定时转发的问题
方法1:闭包直接访问变量
把定时转发函数定义在forwardmes2withdelay内部,利用Python闭包特性直接访问外部作用域的mes变量:
import threading from telegram import Update from telegram.ext import CallbackContext def forwardmes2withdelay(update: Update, context: CallbackContext): message = update.effective_message mes = message.id # 待传递的消息ID # 内部函数直接读取外部的mes变量 def forwardmestime(): context.bot.forward_message( chat_id=目标聊天ID, from_chat_id=update.effective_chat.id, message_id=mes ) # 设置延迟时间(示例为5秒),启动定时任务 delay = 5 threading.Timer(delay, forwardmestime).start()
方法2:将消息ID作为参数传入
如果forwardmestime是独立外部函数,创建定时任务时直接把mes作为参数传入:
import threading from telegram import Update from telegram.ext import CallbackContext def forwardmestime(mes, update: Update, context: CallbackContext): # 使用传入的mes执行转发操作 context.bot.forward_message( chat_id=目标聊天ID, from_chat_id=update.effective_chat.id, message_id=mes ) def forwardmes2withdelay(update: Update, context: CallbackContext): message = update.effective_message mes = message.id delay = 5 # 把mes、update、context作为参数传入定时任务 threading.Timer(delay, forwardmestime, args=(mes, update, context)).start()
方法3:用JobQueue传递上下文(python-telegram-bot内置方案)
如果使用python-telegram-bot的JobQueue管理定时任务,可将mes存入任务上下文:
from telegram import Update from telegram.ext import CallbackContext def forwardmestime(context: CallbackContext): # 从上下文取出预先存入的消息ID和更新对象 mes = context.job.context["mes"] update = context.job.context["update"] context.bot.forward_message( chat_id=目标聊天ID, from_chat_id=update.effective_chat.id, message_id=mes ) def forwardmes2withdelay(update: Update, context: CallbackContext): mes = update.effective_message.id # 将mes和update存入任务上下文,设置5秒后执行 context.job_queue.run_once( forwardmestime, when=5, context={"mes": mes, "update": update} )
内容的提问来源于stack exchange,提问作者qwenx
相关产品推荐
相关产品推荐

