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

如何修改WTelegramClient示例实现单频道监听并转发消息

修改WTelegramClient监听示例实现指定频道消息转发

需求说明

  • 仅监听指定单个频道的新消息与编辑更新
  • 将上述更新内容转发至另一个指定频道

修改步骤与完整代码

以下是修改后的完整代码,关键修改点已添加注释:

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using TL;

namespace WTelegramClientTest
{
    static class Program_ListenUpdates
    {
        static WTelegram.Client Client;
        static User My;
        static readonly Dictionary<long, User> Users = new();
        static readonly Dictionary<long, ChatBase> Chats = new();

        // 替换为你要监听的源频道ID(可通过登录后打印频道列表获取)
        private const long SOURCE_CHANNEL_ID = 123456789;
        // 替换为你要转发到的目标频道ID
        private const long TARGET_CHANNEL_ID = 987654321;

        // 配置环境变量:api_id, api_hash, phone_number
        static async Task Main(string[] _)
        {
            Console.WriteLine("程序将监听指定频道的消息并转发至目标频道,按任意键终止");
            WTelegram.Helpers.Log = (l, s) => System.Diagnostics.Debug.WriteLine(s);
            Client = new WTelegram.Client(Environment.GetEnvironmentVariable);
            using (Client)
            {
                Client.OnUpdate += Client_OnUpdate;
                My = await Client.LoginUserIfNeeded();
                Users[My.id] = My;
                Console.WriteLine($"已登录为 {My.username ?? My.first_name + " " + My.last_name} (ID: {My.id})");
                
                // 加载所有对话信息,用于解析频道名称
                var dialogs = await Client.Messages_GetAllDialogs();
                dialogs.CollectUsersChats(Users, Chats);
                
                // 可选:打印所有频道信息,方便获取目标频道ID
                Console.WriteLine("\n当前账号可访问的频道列表:");
                foreach (var chat in Chats.Values)
                    if (chat is Channel channel)
                        Console.WriteLine($"频道名称:{channel.title},ID:{channel.id}");
                
                Console.ReadKey();
            }
        }

        private static async Task Client_OnUpdate(IObject arg)
        {
            if (arg is not UpdatesBase updates) return;
            updates.CollectUsersChats(Users, Chats);
            
            foreach (var update in updates.UpdateList)
            {
                switch (update)
                {
                    // 处理新消息和编辑后的消息
                    case UpdateNewMessage unm:
                        if (IsMessageFromSourceChannel(unm.message))
                            await ForwardMessageToTarget(unm.message, isEdit: false);
                        break;
                    case UpdateEditMessage uem:
                        if (IsMessageFromSourceChannel(uem.message))
                            await ForwardMessageToTarget(uem.message, isEdit: true);
                        break;
                    // 忽略其他类型的更新
                    default:
                        // 可选:打印其他更新类型,方便调试
                        // Console.WriteLine($"忽略更新类型:{update.GetType().Name}");
                        break;
                }
            }
        }

        // 判断消息是否来自源频道
        private static bool IsMessageFromSourceChannel(MessageBase messageBase)
        {
            if (messageBase is not Message message) return false;
            // 检查消息所在的对话是否是源频道
            return message.peer_id is PeerChannel peerChannel && peerChannel.channel_id == SOURCE_CHANNEL_ID;
        }

        // 将消息转发至目标频道
        private static async Task ForwardMessageToTarget(MessageBase messageBase, bool isEdit)
        {
            if (messageBase is not Message message) return;
            
            // 构建要发送的文本内容,编辑消息添加标识
            string sendText = isEdit ? $"[编辑] {message.message}" : message.message;
            
            try
            {
                // 发送消息到目标频道
                await Client.Messages_SendMessageAsync(new InputPeerChannel(TARGET_CHANNEL_ID), sendText);
                Console.WriteLine($"已{(isEdit ? "转发编辑后的消息" : "转发新消息")}至目标频道:{sendText}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"转发失败:{ex.Message}");
            }
        }

        private static string User(long id) => Users.TryGetValue(id, out var user) ? user.ToString() : $"用户 {id}";
        private static string Chat(long id) => Chats.TryGetValue(id, out var chat) ? chat.ToString() : $"频道 {id}";
        private static string Peer(Peer peer) => peer is null ? null : peer is PeerUser user ? User(user.user_id)
            : peer is PeerChat or PeerChannel ? Chat(peer.ID) : $"对话 {peer.ID}";
    }
}

关键修改说明

  1. 定义频道ID常量:添加SOURCE_CHANNEL_ID和TARGET_CHANNEL_ID,替换为实际的频道ID。可以通过登录后打印的频道列表获取ID。
  2. 过滤源频道消息:新增IsMessageFromSourceChannel方法,仅处理来自指定源频道的消息更新。
  3. 实现转发逻辑:新增ForwardMessageToTarget方法,使用Messages_SendMessageAsync将消息发送至目标频道,编辑消息会添加[编辑]标识。
  4. 忽略无关更新:移除了原示例中对其他类型更新的处理,仅保留消息相关的更新逻辑,避免不必要的资源消耗。

注意事项

  • 确保登录账号有权限查看源频道和发送消息到目标频道。
  • 如果需要转发媒体消息(图片、视频等),需要扩展ForwardMessageToTarget方法,处理message.media字段并调用对应的发送接口。
  • 频道ID可以通过调用Client.SearchPublicChat("频道用户名")获取,返回的Channel对象包含id属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:30:56