You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:20:28