You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Telethon开发Python自动回复机器人无法收发消息求助

排查Telethon自动回复机器人无法接收/回复消息的问题

我帮你看了下代码,里面有几个关键问题导致机器人没法正常工作,咱们一个个捋清楚:

1. 错误获取用户消息内容

你在处理函数里写了 msg = events.NewMessage(incoming=True),这是重新创建了一个事件类实例,根本不是获取用户实际发送的消息内容。正确的做法是从 event.message.text 拿到用户输入的文本。

2. 函数名拼写失误

你调用了 cchatbot_response(msg),但你定义的回复函数明明是 chatbot_response(msg)——多了个字母c,这会直接抛出NameError,程序运行到这里就中断了,自然没法回复消息。

3. 同步sleep阻塞事件循环

在异步函数里用 time.sleep(1) 会卡死整个Telethon的事件循环,导致机器人没法处理新消息,甚至连消息都接收不到。必须换成异步的 await asyncio.sleep(1),这样才不会阻塞其他操作。

4. 消息非空判断逻辑无效

原代码里的 if msg!='' 判断,在msg是事件对象的时候永远为真,但修正后拿到文本内容后,应该用 if msg and msg.strip() 来判断是否是有效非空消息,避免处理空白消息。

修正后的完整代码

import asyncio
import time
# 假设你已经正确定义了predict_class、getResponse、model、intents这些依赖项

def chatbot_response(msg):
    ints = predict_class(msg, model)
    res = getResponse(ints, intents)
    return res

if __name__ == '__main__':
    # 初始化客户端,sequential_updates=True确保逐个处理消息
    client = TelegramClient(session_file, api_id, api_hash, sequential_updates=True)

    @client.on(events.NewMessage(incoming=True))
    async def handle_new_message(event):
        if event.is_private:  # 只处理私聊消息
            from_ = await event.client.get_entity(event.from_id)
            if not from_.bot:  # 不给机器人自动回复
                # 获取用户发送的消息文本
                msg = event.message.text
                # 判断消息是否为有效非空内容
                if msg and msg.strip():
                    try:
                        # 生成机器人回复内容
                        reply_msg = chatbot_response(msg)
                        print(time.asctime(), '-', f"收到消息: {event.message.text}")
                        # 异步休眠1秒做限流,避免触发Telegram限制
                        await asyncio.sleep(1)
                        # 发送回复
                        await event.respond(reply_msg)
                        print(time.asctime(), '-', "自动回复已发送")
                    except Exception as e:
                        # 捕获异常,避免机器人崩溃
                        print(time.asctime(), '-', f"出错了: {str(e)}")

    # 启动客户端,phone和password替换成你的账号信息
    client.start(phone, password)
    print(time.asctime(), '-', "机器人启动成功")
    client.run_until_disconnected()

另外还有几个小提醒:

  • 确保 session_fileapi_idapi_hashphonepassword 这些变量都正确赋值了,api_idapi_hash需要你去Telegram开发者平台申请获取。
  • 第一次运行程序时,需要按照提示完成登录(扫码或输入验证码),确保会话正常建立。
  • 加上异常捕获后,即使你的chatbot_response函数出错,机器人也不会直接崩溃,方便你排查问题。

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

火山引擎 最新活动