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

如何使用WTelegramClient实现Telegram频道成员进出事件处理器?

使用WTelegramClient处理频道成员加入/离开事件

要处理Telegram频道的成员进出信息,你需要针对Telegram推送的成员变动更新类型编写处理逻辑,而不是仅监听消息类更新。以下是具体实现方案:

关键更新类型说明

Telegram针对频道成员变动会推送两种核心更新:

  • UpdateChannelParticipant:单个成员的加入、离开或权限变更事件
  • UpdateChannelParticipants:批量成员变动事件(比如一次性加入多位用户)

你之前使用的示例代码仅处理了消息类更新,未覆盖上述两种类型,因此无法捕获成员变动。

完整实现代码

using WTelegramClient;
using TL;

var client = new WTelegram.Client(Config);
await client.LoginUserIfNeeded();

// 注册更新处理回调
client.OnUpdate += async update =>
{
    switch (update)
    {
        case UpdateChannelParticipant singleUpdate:
            await HandleSingleParticipantChange(singleUpdate);
            break;
        case UpdateChannelParticipants bulkUpdate:
            await HandleBulkParticipantChanges(bulkUpdate);
            break;
        // 可保留其他需要处理的更新类型(如消息、通知等)
    }
};

// 保持客户端连接以接收实时更新
await client.ConnectAsync();

#region 成员变动处理逻辑
// 处理单个成员变动
async Task HandleSingleParticipantChange(UpdateChannelParticipant update)
{
    // 获取频道基本信息
    var channelResult = await client.channels_GetChannels(new[] { update.channel_id });
    var channel = channelResult.chats[0] as Channel;
    Console.WriteLine($"[频道] {channel.Title}");

    // 获取变动用户的信息
    var userResult = await client.users_GetUsers(new[] { update.participant.user_id });
    var user = userResult.users[0];
    var userTag = string.IsNullOrEmpty(user.Username) ? "" : $"(@{user.Username})";
    Console.WriteLine($"[用户] {user.FirstName} {user.LastName} {userTag}");

    // 判断具体操作类型
    switch (update.participant)
    {
        case ChannelParticipantLeft:
            Console.WriteLine("[操作] 离开频道");
            break;
        case ChannelParticipantBanned:
            Console.WriteLine("[操作] 被封禁");
            break;
        case ChannelParticipantCreator:
        case ChannelParticipantAdmin:
        case ChannelParticipant:
            Console.WriteLine("[操作] 加入频道/权限变更");
            break;
    }
    Console.WriteLine("---");
}

// 处理批量成员变动
async Task HandleBulkParticipantChanges(UpdateChannelParticipants update)
{
    var channelResult = await client.channels_GetChannels(new[] { update.channel_id });
    var channel = channelResult.chats[0] as Channel;
    Console.WriteLine($"[批量变动] 频道:{channel.Title}");

    // 获取所有涉及的用户信息
    var userIds = update.participants.Select(p => p.user_id).ToArray();
    var userResult = await client.users_GetUsers(userIds);
    
    foreach (var user in userResult.users)
    {
        var participant = update.participants.First(p => p.user_id == user.id);
        var userTag = string.IsNullOrEmpty(user.Username) ? "" : $"(@{user.Username})";
        var action = participant is ChannelParticipantLeft ? "离开频道" : "加入频道";
        Console.WriteLine($"- {user.FirstName} {user.LastName} {userTag}:{action}");
    }
    Console.WriteLine("---");
}
#endregion

// 客户端配置(替换为你的实际信息)
static string Config(string key) => key switch
{
    "api_id" => "你的API_ID",
    "api_hash" => "你的API_HASH",
    "phone_number" => "你的手机号",
    // 可选:如果需要会话持久化,可设置session_pathname
    _ => null
};

核心注意事项

  1. API权限:确保你的Telegram API账号拥有读取频道成员变动的权限(通常默认权限即可满足)
  2. 更新监听:必须在OnUpdate回调中覆盖UpdateChannelParticipant和UpdateChannelParticipants两种类型,才能捕获所有成员变动场景
  3. 数据获取:通过channels_GetChannels和users_GetUsers方法分别获取频道和用户的完整信息,仅靠更新对象中的ID无法直接得到名称等详情

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:25:07