如何为Telegram机器人消息设置过期时间并自动编辑?
实现Telegram评分消息的过期机制
核心思路
借助python-telegram-bot内置的JobQueue,在发送评分消息时创建一个延迟4小时的任务;用户点击按钮后立即取消该任务,避免重复编辑消息。同时用全局字典跟踪所有待过期的消息及其对应任务。
具体实现步骤
1. 定义全局存储结构
在代码顶部添加字典,用于保存评分消息ID和对应的过期任务:
# 存储待过期的评分消息ID与对应的Job对象 pending_rating_jobs = {}
2. 修改send_stuff函数
发送评分消息后获取消息实例,创建延迟4小时的过期任务并存入字典:
def send_stuff(context: CallbackContext): job = context.job keyboard = [ [ InlineKeyboardButton("NEVER", callback_data="NEVER"), InlineKeyboardButton("UNLIKELY", callback_data="UNLIKELY") ], [ InlineKeyboardButton("MEH", callback_data="MEH"), InlineKeyboardButton("MAYBE", callback_data="MAYBE") ], [ InlineKeyboardButton("YES", callback_data="YES"), InlineKeyboardButton("ABSOLUTELY", callback_data="ABSOLUTELY") ], [ InlineKeyboardButton("RATHER NOT SAY", callback_data="UNKNOWN") ] ] reply_markup = InlineKeyboardMarkup(keyboard) context.bot.send_photo(job.context, photo=open(PATH+thefile, 'rb')) # 发送评分消息并获取消息对象 rating_msg = context.bot.send_message(job.context, text='RATE', reply_markup=reply_markup) # 创建延迟4小时的过期任务(4小时=14400秒) expire_job = context.job_queue.run_once( expire_rating_message, when=14400, context=(job.context, rating_msg.message_id) ) # 将任务存入字典,以消息ID为键 pending_rating_jobs[rating_msg.message_id] = expire_job
3. 编写过期处理函数
创建expire_rating_message函数,负责编辑过期消息并清理字典条目:
def expire_rating_message(context: CallbackContext): chat_id, message_id = context.job.context try: # 编辑消息为过期提示 context.bot.edit_message_text( chat_id=chat_id, message_id=message_id, text="NO ANSWER GIVEN" ) # 从字典中移除已处理的条目 del pending_rating_jobs[message_id] except Exception as e: # 捕获异常(比如消息已被删除),避免程序崩溃 print(f"处理过期消息时出错: {e}") if message_id in pending_rating_jobs: del pending_rating_jobs[message_id]
4. 修改main_handler函数
用户点击按钮后,除编辑消息外,取消对应的过期任务:
def main_handler(update: Update, context: CallbackContext): update.callback_query.answer() if update.callback_query.data is not None: user_input = update.callback_query.data message_id = update.effective_message.message_id # 编辑消息为用户选择的结果 update.effective_message.edit_text('VERDICT: ' + user_input) # 如果该消息有对应的过期任务,取消并清理字典 if message_id in pending_rating_jobs: pending_rating_jobs[message_id].schedule_removal() del pending_rating_jobs[message_id]
关键说明
run_once方法用于创建一次性延迟任务,when参数接收秒数。- 全局字典
pending_rating_jobs确保能跟踪每个评分消息的过期任务,避免用户操作后仍触发过期编辑。 - 添加异常捕获是为了处理消息已被用户删除等异常情况,防止机器人崩溃。
内容的提问来源于stack exchange,提问作者lambdacore
相关产品推荐
相关产品推荐

