Telethon脚本优化需求:短时间多帖时仅回复频道最新帖子
解决方案:延迟执行+取消旧任务实现仅回复最新帖子
可以通过延迟回复+取消未执行的旧任务的方式解决这个问题,核心逻辑是:短时间内收到多条消息时,只保留最新消息的回复任务,取消之前还没执行的任务,等设定的等待窗口结束后再回复最新的那条。
修改后的代码如下:
import asyncio # 全局变量存储待执行的回复任务 pending_reply_task = None @client.on(events.NewMessage(CHANNEL)) async def main(event): global pending_reply_task # 只处理目标频道的消息 if event.chat_id != -100123456789: return # 如果存在未完成的旧任务,直接取消(放弃回复旧消息) if pending_reply_task and not pending_reply_task.done(): pending_reply_task.cancel() # 定义延迟回复的异步函数 async def send_latest_reply(): # 设置等待窗口,这里设为10秒,可根据需求调整 await asyncio.sleep(10) await client.send_message(event.chat_id, 'my_message', comment_to=event.id) # 创建并保存新的回复任务 pending_reply_task = asyncio.create_task(send_latest_reply())
代码说明:
pending_reply_task:全局变量用来追踪当前待执行的回复任务,确保同一时间只有一个待执行的回复任务存在。asyncio.sleep(10):设置你的等待窗口时长(比如10秒),这段时间内如果有新消息进来,就会取消之前的旧任务,只保留最新消息的回复任务。- 等待窗口结束后,只会回复最后一条触发任务的消息,完美实现“短时间内仅回复最新帖子”的需求。
额外说明:
- 如果频道消息的间隔超过你设置的等待时长,每条消息都会正常触发回复;
- 如果等待窗口内有多条消息,只有最后一条会被回复,旧消息的回复任务会被提前取消。
内容的提问来源于stack exchange,提问作者Matt Klein
相关产品推荐
相关产品推荐

