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

基于Telethon的转发机器人可运行但无法正常转发问题求助

解决Telethon转发机器人无法实时转发指定消息的问题

问题概述

编写的Telethon转发机器人代码可运行,但发送包含vi_或ai_的消息时,机器人未执行转发操作。需求是:机器人接收含vi_或ai_的新消息后,立即将其转发给指定用户。

原代码如下:

import telethon
api_id = XX
api_hash = 'XX'
client = telethon.TelegramClient('anon', api_id, api_hash)
async def main():
    await client.connect()
    me = await client.get_me()
    chat_id = me.id
    while True:
        messages = await client.get_messages(chat_id)
        for message in messages:
            if "vi_" in message.text or "ai_" in message.text:
                await client.forward_messages('user', message.id)
with client:
    client.loop.run_until_complete(main())

原代码问题分析

  1. 轮询方式低效且无法实时触发:用while True循环调用get_messages轮询消息,不仅会重复处理旧消息,也无法实时捕捉刚发送的新消息,导致转发不及时甚至不触发。
  2. 监听范围错误:将chat_id设为自身ID,仅会轮询自己账号的消息列表,无法监听来自其他聊天的新消息(比如别人发给你的消息、指定群组的消息)。
  3. 转发目标参数不严谨:直接使用字符串'user'作为转发目标,若无法正确解析为Telegram实体(如用户名、用户ID),会导致转发失败。

修正后的代码

from telethon import TelegramClient, events

# 替换为你的API信息
api_id = XX
api_hash = 'XX'
# 替换为要转发到的目标用户(可以是用户名、用户ID或聊天实体)
TARGET_USER = 'target_username_or_id'

client = TelegramClient('anon', api_id, api_hash)

@client.on(events.NewMessage())
async def handle_new_message(event):
    message = event.message
    # 检查消息文本是否包含指定关键词(处理消息无text的情况,比如媒体消息)
    if message.text and ("vi_" in message.text or "ai_" in message.text):
        try:
            await client.forward_messages(TARGET_USER, message)
            print(f"已转发消息:{message.text[:50]}...")
        except Exception as e:
            print(f"转发失败:{str(e)}")

if __name__ == '__main__':
    client.start()
    # 保持客户端运行,持续监听事件
    client.run_until_disconnected()

关键修正点说明

  • 使用事件监听替代轮询:通过@client.on(events.NewMessage())装饰器监听所有新消息,一旦有新消息触发就立即执行处理逻辑,实现实时响应。若只需监听特定聊天,可添加chats参数,比如events.NewMessage(chats=['your_chat_id_or_username'])。
  • 处理消息文本为空的情况:判断消息是否有text属性,避免媒体消息(如图片、视频)因无文本导致报错。
  • 严谨处理转发目标:确保TARGET_USER是Telegram可识别的实体,建议优先使用用户ID(数字),避免用户名变更导致失效。
  • 简化客户端运行逻辑:使用client.start()自动处理连接和登录,client.run_until_disconnected()保持客户端持续运行,无需手动管理事件循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:52:49