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

如何实现Telethon中仅回复首个消息发送者的功能?

实现Telethon仅回复首个消息发送者的方案

核心思路是通过维护状态变量记录已处理的会话或首个发送者,无需重启程序即可控制回复逻辑。以下是两种常见场景的实现代码:

场景1:会话内仅回复一次(无论后续谁发送消息)

初始化一个全局集合存储已回复过的会话ID,事件触发时先检查会话是否已处理,未处理则回复并标记:

from telethon import TelegramClient, events

# 初始化Telethon客户端(替换为你的API信息)
client = TelegramClient('session_name', api_id=12345, api_hash='your_api_hash')

# 存储已回复过的会话ID
replied_chats = set()

@client.on(events.NewMessage(chats=[你的目标聊天ID]))  # 可指定单个或多个聊天ID
async def reply_first_message(event):
    chat_id = event.chat_id
    if chat_id not in replied_chats:
        # 回复首个消息
        await event.respond("这是该会话的唯一回复")
        # 标记会话为已回复
        replied_chats.add(chat_id)
    # 已回复过的会话直接跳过处理
    else:
        return

client.start()
client.run_until_disconnected()

场景2:仅回复会话内的首个消息发送者(后续其他发送者的消息不回复)

如果需要精准只回复第一个发消息的用户,可维护一个字典记录每个会话的首个发送者ID:

from telethon import TelegramClient, events

client = TelegramClient('session_name', api_id=12345, api_hash='your_api_hash')

# 存储每个会话的首个发送者ID:{chat_id: sender_id}
chat_first_sender = {}

@client.on(events.NewMessage(chats=[你的目标聊天ID]))
async def reply_only_first_sender(event):
    chat_id = event.chat_id
    sender_id = await event.get_sender_id()
    
    if chat_id not in chat_first_sender:
        # 记录首个发送者并回复
        chat_first_sender[chat_id] = sender_id
        await event.respond("仅回复给会话内的首个消息发送者")
    else:
        # 非首个发送者的消息直接跳过
        if sender_id != chat_first_sender[chat_id]:
            return

client.start()
client.run_until_disconnected()

可选:持久化状态(重启机器人不丢失记录)

如果需要机器人重启后仍能记住已处理的会话,可将状态保存到本地文件:

import json
from telethon import TelegramClient, events

# 加载已回复会话
def load_replied_chats():
    try:
        with open('replied_chats.json', 'r') as f:
            return set(json.load(f))
    except FileNotFoundError:
        return set()

# 保存已回复会话
def save_replied_chats(chats):
    with open('replied_chats.json', 'w') as f:
        json.dump(list(chats), f)

client = TelegramClient('session_name', api_id=12345, api_hash='your_api_hash')
replied_chats = load_replied_chats()

@client.on(events.NewMessage(chats=[你的目标聊天ID]))
async def reply_first_message(event):
    chat_id = event.chat_id
    if chat_id not in replied_chats:
        await event.respond("这是该会话的唯一回复")
        replied_chats.add(chat_id)
        save_replied_chats(replied_chats)  # 保存状态
    else:
        return

client.start()
client.run_until_disconnected()

关键说明

  • 状态变量会在Telethon事件循环运行期间持续存在,无需重启程序即可生效
  • 若需要针对私聊/群聊做不同逻辑,可通过event.is_private或event.is_group判断会话类型
  • 持久化方案可根据需求替换为数据库(如SQLite),适合大规模场景

内容的提问来源于stack exchange,提问作者Ravi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:01:08