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

使用Telethon时,如何通过Telegram永久ID判断用户是否订阅指定频道?

基于Telethon通过用户永久ID判断频道订阅状态的优化实现

你的原代码存在两个核心问题:一是依赖用户名匹配,无法覆盖无用户名的Telegram账号;二是遍历频道用户的方式在大频道下效率极低。直接使用Telethon提供的GetParticipantRequest接口可以完美解决这两个问题,该接口支持通过用户永久ID直接查询其频道参与状态,无需遍历所有用户。

优化后的实现代码

from telethon.tl.functions.channels import GetParticipantRequest
from telethon.tl.types import InputPeerUser
from telethon import TelegramClient, events
from telethon.errors import UserNotParticipantError

# 初始化客户端(替换为你的api_id、api_hash)
client = TelegramClient('Bot', api_id, api_hash)

async def is_participant(channel_identifier, user_id) -> bool:
    try:
        # 获取频道实体(支持频道链接、用户名、ID)
        channel_entity = await client.get_entity(channel_identifier)
        # 构造用户的InputPeer对象(基于永久ID)
        user_peer = InputPeerUser(user_id, 0)
        # 直接查询该用户在频道中的状态
        await client(GetParticipantRequest(channel_entity, user_peer))
        # 如果没有抛出异常,说明用户是频道成员
        return True
    except UserNotParticipantError:
        # 捕获用户未订阅的异常,返回False
        return False
    except Exception as e:
        # 处理其他可能的异常(比如频道不存在、权限不足等)
        print(f"查询出错: {str(e)}")
        return False

# 示例使用(比如在机器人消息事件中调用)
@client.on(events.NewMessage(pattern='/check'))
async def check_subscription(event):
    # 获取发送消息的用户ID
    user_id = event.sender_id
    # 指定要检查的频道(可以是频道ID、用户名或链接)
    target_channel = '@your_target_channel'
    is_subscribed = await is_participant(target_channel, user_id)
    await event.reply(f"你{'已订阅' if is_subscribed else '未订阅'}该频道")

client.start()
client.run_until_disconnected()

关键说明

  • 核心优化点:使用GetParticipantRequest直接查询单个用户的频道状态,无需遍历频道成员,效率大幅提升,且完全不依赖用户名。
  • 用户永久ID的使用:通过InputPeerUser传入用户的永久ID(user_id),这是Telegram账号唯一且不变的标识,不受用户名是否存在的影响。
  • 异常处理:捕获UserNotParticipantError来明确判断用户未订阅的情况,同时处理其他可能的异常(如频道不存在、机器人无权限查询等)。
  • 频道标识支持:channel_identifier可以是频道的ID、用户名(带@)或者直接的邀请链接,灵活性高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:12:33