如何修改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}"; } }
关键修改说明
- 定义频道ID常量:添加
SOURCE_CHANNEL_ID和TARGET_CHANNEL_ID,替换为实际的频道ID。可以通过登录后打印的频道列表获取ID。 - 过滤源频道消息:新增
IsMessageFromSourceChannel方法,仅处理来自指定源频道的消息更新。 - 实现转发逻辑:新增
ForwardMessageToTarget方法,使用Messages_SendMessageAsync将消息发送至目标频道,编辑消息会添加[编辑]标识。 - 忽略无关更新:移除了原示例中对其他类型更新的处理,仅保留消息相关的更新逻辑,避免不必要的资源消耗。
注意事项
- 确保登录账号有权限查看源频道和发送消息到目标频道。
- 如果需要转发媒体消息(图片、视频等),需要扩展
ForwardMessageToTarget方法,处理message.media字段并调用对应的发送接口。 - 频道ID可以通过调用
Client.SearchPublicChat("频道用户名")获取,返回的Channel对象包含id属性。
内容的提问来源于stack exchange,提问作者Rjoy
相关产品推荐
相关产品推荐

