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

Python Telegram机器人问题:无法订阅频道及点击消息按钮

问题修复方案

问题1:无法订阅指定频道

原因

  1. 频道链接提取依赖字符串分割,若消息中链接格式稍有变化(如后跟标点)就会提取错误
  2. JoinChannelRequest 传入纯username时可能无法正确解析,缺少实体转换步骤
  3. 未处理订阅时的异常场景(如已订阅、权限不足)

修复措施

  • 改用正则表达式提取频道username,提升解析稳定性
  • 通过 client.get_entity() 将username转换为频道实体后再发起订阅
  • 添加异常捕获,输出错误信息便于排查问题

问题2:无法点击「♻️ Проверить」按钮

原因

  1. 错误判断按钮类型:Telethon中内联按钮实际为 InlineKeyboardButton,而非 MessageButton
  2. 未匹配目标按钮的文本,直接点击第一个按钮可能并非目标按钮
  3. 按钮点击逻辑未绑定当前消息上下文

修复措施

  • 遍历内联键盘按钮时,检查按钮文本是否为目标文本「♻️ Проверить」
  • 确保按钮点击时上下文正确,避免无效触发
  • 补充按钮不存在的精确判断逻辑

修改后的完整代码

import asyncio
import re
from telethon import TelegramClient, events
from telethon.tl.functions.channels import JoinChannelRequest
from telethon.errors.rpcerrorlist import AlreadyInChannelError

api_id = 'api_id'
api_hash = 'api_hash'

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

channel_username = 'channel_username'
bot_username = 'bot_username'

async def handle_channel_message(event):
    print("Сообщение из канала:", event.message.text)
    await client.send_message(bot_username, 'кликать')

@client.on(events.NewMessage(chats=[bot_username]))
async def bot_message_handler(event):
    print("Сообщение от бота:", event.message.text)
    if 'https://t.me/' in event.message.text and '♻️ Проверить' in event.message.text:
        # 正则提取频道username,适配更多格式
        channel_match = re.search(r'https://t\.me/(\w+)', event.message.text)
        if not channel_match:
            print("未找到有效频道链接")
            return
        channel_target = channel_match.group(1)

        # 处理频道订阅,包含异常捕获
        try:
            channel_entity = await client.get_entity(channel_target)
            await client(JoinChannelRequest(channel_entity))
            print(f"成功订阅频道: {channel_target}")
        except AlreadyInChannelError:
            print(f"已订阅频道: {channel_target}")
        except Exception as e:
            print(f"订阅频道失败: {str(e)}")
            return
        
        await asyncio.sleep(2)

        # 定位并点击目标按钮
        if event.message.reply_markup and event.message.reply_markup.inline_keyboard:
            for button_row in event.message.reply_markup.inline_keyboard:
                for button in button_row:
                    if button.text == '♻️ Проверить':
                        await button.click()
                        print(f"成功点击「♻️ Проверить」按钮")
                        return
            print("未找到「♻️ Проверить」按钮")
        else:
            print("消息中无内联按钮")

@client.on(events.NewMessage(chats=[channel_username]))
async def channel_message_handler(event):
    await handle_channel_message(event)

async def main():
    await client.start()
    await client.run_until_disconnected()

if __name__ == '__main__':
    asyncio.run(main())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:04:56