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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:21:43