Telethon实现群组消息累计达指定条数时自动触发动作的方法
问题根因
你现有代码存在三个核心逻辑错误,导致无法实现预期效果:
- 计数器作用域错误:你把计数变量
lines定义在消息回调函数内部,每次收到新消息触发回调时,变量都会被重置为0,根本无法实现跨消息的累计计数 - 计数对象错误:你拿到单条消息的文本内容后逐字符遍历计数,统计的是单条消息的字符长度,不是群组内收到的消息条数
- 判断逻辑错误:
if lines % 2仅当计数为奇数时触发,和你要求的每收到2条消息触发的规则不匹配
修正实现
核心思路是把计数器放到回调外部做持久化存储,每次收到符合规则的入站消息时给计数器+1,达到阈值就触发发送动作。修正后可直接运行的代码如下:
from telethon import TelegramClient from telethon.events import NewMessage # 替换为你自己的API凭证 api_id = '____' api_hash = '______' # 目标群组,建议后续替换为群组数字ID,解析稳定性更高 TARGET_CHAT = 'https://t.me/some_group' # 触发阈值,即每收到N条消息执行一次发送 TRIGGER_COUNT = 2 client = TelegramClient('session_name', api_id, api_hash) # 全局累计计数器,定义在回调外部,不会随单次回调执行重置 message_count = 0 @client.on(NewMessage(chats=TARGET_CHAT, incoming=True)) async def message_handler(event): global message_count # 每收到1条目标群的入站消息(排除自己发送的消息),计数器+1 message_count += 1 print(f"目标群累计入站消息数:{message_count}") # 累计数达到阈值时触发发送 if message_count % TRIGGER_COUNT == 0: await client.send_message(TARGET_CHAT, message='something') # 如果需要触发后从零开始计数下一轮,取消下面一行的注释即可 # message_count = 0 client.start() client.run_until_disconnected()
关键说明
- 事件参数新增
incoming=True,仅统计其他用户发送的入站消息,自动过滤自身账号发出的消息,避免自己发送的消息被计入计数导致逻辑混乱 - 原代码导入的
sync模块在纯异步写法下不需要,已移除 - 当前计数器为内存存储,程序重启后会从0开始计数,如果需要重启保留计数进度,可以把计数器值定期写入本地文件/数据库,程序启动时优先读取存储的数值初始化即可
- 如果需要排除特定用户(比如群管、机器人)的消息,可以在回调内加判断,匹配
event.sender_id后跳过计数即可
内容的提问来源于stack exchange,提问作者iprahka
相关产品推荐
相关产品推荐

