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

Telegram消息转发机器人故障:Python代码handler函数未触发

Telegram消息转发机器人Handler未触发问题排查与修复

需求与问题描述

需求:创建Telegram机器人,将指定Telegram群组/频道的消息转发至自己的Telegram群组。

以下是编写的Python代码:

import asyncio
from telethon.sync import TelegramClient, events

def main():
    # Укажите свои api_id, api_hash и bot_token
    api_id = 27468555
    api_hash = '0c05213e90441c28256c5ab8a0d3c266'
    bot_token = '6144633328:AAFGbLEpHZlsBxD81oQ5PPhdm4ly7gpIHTQ'

    client = TelegramClient('bot', api_id, api_hash).start(bot_token=bot_token)

    chat_id_group = -1001958404478
    channel_source = 601230760

    @client.on(events.NewMessage(chats=channel_source))
    def handler(event):
        '''Забирает посты из телеграмм каналов и посылает их в наш канал'''
        message = event.message
        client.send_message(chat_id_group, message)

    client.start()
    client.run_until_disconnected()

main()

问题:代码运行后无法正常工作,调试发现handler函数未触发。


排查与修复步骤

  • 检查机器人的成员身份与权限
    机器人必须被添加到源频道/群组中才能读取消息:

    • 私有频道/群组:手动邀请机器人加入,确保它能看到频道内的消息;
    • 公开频道:确认机器人可以正常访问该频道(可尝试用机器人搜索频道的@用户名验证)。
  • 修正源频道/群组的ID
    你使用的channel_source = 601230760可能格式错误:

    • 优先使用公开频道的@用户名(比如@test_channel),避免数字ID匹配错误;
    • 若用数字ID,私有频道/群组的ID通常以-100开头(与目标群组格式一致),可通过client.get_entity("频道@用户名")命令获取正确ID。
  • 移除重复的client.start()调用
    代码中连续调用了两次client.start(),第一次初始化时已完成登录,第二次调用会导致异常。删除第二次的client.start()即可。

  • 调整事件处理函数的异步逻辑
    Telethon更推荐使用异步编程模型,同步函数可能导致事件循环异常。修改后的代码如下:

    import asyncio
    from telethon import TelegramClient, events
    
    async def main():
        api_id = 27468555
        api_hash = '0c05213e90441c28256c5ab8a0d3c266'
        bot_token = '6144633328:AAFGbLEpHZlsBxD81oQ5PPhdm4ly7gpIHTQ'
    
        client = TelegramClient('bot', api_id, api_hash)
        await client.start(bot_token=bot_token)
    
        chat_id_group = -1001958404478
        # 替换为正确的源频道ID或@用户名
        channel_source = "@your_source_channel"
    
        @client.on(events.NewMessage(chats=channel_source))
        async def handler(event):
            message = event.message
            await client.send_message(chat_id_group, message)
    
        await client.run_until_disconnected()
    
    if __name__ == "__main__":
        asyncio.run(main())
    
  • 验证API凭证有效性
    确认在Telegram开发者平台获取的api_id和api_hash与机器人所属账号一致,且没有权限限制。


内容的提问来源于stack exchange,提问作者Mr Полапчик

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 12:07:36