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

Telethon实现未对话新私信自动回复遇代码错误,求解决方案

解决Telethon自动回复新私信的代码错误问题

第一次代码错误分析

第一次代码中,@client.on(events.NewMessage(incoming=True, blacklist_chats=True)) 装饰器被错误应用在setup()函数上,导致该函数被当作消息事件处理器。而Telethon的事件处理器必须接收event参数,因此触发TypeError: setup() takes 0 positional arguments but 1 was given。

同时,users集合是setup()内部变量,外部的handler()无法访问,即便装饰器位置正确,也会出现变量未定义问题。

第二次代码错误分析

第二次代码修正了装饰器位置,但setup()函数从未被调用,导致全局变量users从未初始化。当收到消息触发handler()时,自然会抛出NameError: name 'users' is not defined。

正确实现代码

要实现“自动回复此前未对话用户的新私信”,需要:

  1. 在客户端启动后立即执行setup(),初始化已对话用户集合
  2. 确保users集合能被事件处理器访问
  3. 回复新用户后,将其加入集合(避免重复回复)

完整代码如下:

from telethon import TelegramClient, events

api_id = 123456
api_hash = 'enterownapihash'
msg = 'Sorry, I am unavailable right now.'

client = TelegramClient('automessage', api_id, api_hash, sequential_updates=True)
users = set()  # 全局初始化集合

async def setup():
    global users
    async for dialog in client.iter_dialogs():
        # 排除机器人,只记录真实用户
        if dialog.is_user and not dialog.entity.bot:
            users.add(dialog.id)

@client.on(events.NewMessage(incoming=True))
async def handler(event):
    global users
    # 仅处理私信,且发信人不在已对话列表中
    if event.is_private and not event.sender.bot and event.sender_id not in users:
        await event.respond(msg)
        users.add(event.sender_id)  # 回复后加入集合,避免重复回复

async def main():
    await client.start()
    await setup()  # 启动后执行初始化
    await client.run_until_disconnected()

if __name__ == "__main__":
    import asyncio
    asyncio.run(main())

关键修正点

  • 全局初始化users集合,避免未定义错误
  • 使用main()函数统一管理客户端启动和初始化流程,确保setup()在客户端连接后执行
  • 回复新用户后,将其ID加入users集合,防止重复发送自动回复
  • 增加排除机器人的判断,避免回复机器人消息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:02:23