如何使用C#从Telegram消息中提取所有链接?
解决Telegram格式化消息的链接提取问题
获取无格式消息文本
格式化消息(如Markdown/HTML格式)的message.Text会保留格式标记,你可以通过遍历Message.Entities拼接出纯文本:
var plainText = new StringBuilder(); int currentPosition = 0; foreach (var entity in message.Entities?.OrderBy(e => e.Offset) ?? Enumerable.Empty<MessageEntity>()) { // 添加实体前的普通文本 plainText.Append(message.Text.Substring(currentPosition, entity.Offset - currentPosition)); // 添加实体对应的纯文本(忽略格式标记) plainText.Append(message.Text.Substring(entity.Offset, entity.Length)); currentPosition = entity.Offset + entity.Length; } // 添加剩余的文本 plainText.Append(message.Text.Substring(currentPosition)); Console.WriteLine("无格式文本: " + plainText.ToString());
直接提取所有链接
利用Message.Entities筛选链接类型的实体,直接获取URL:
var links = new List<string>(); if (message.Entities != null) { foreach (var entity in message.Entities) { switch (entity.Type) { case MessageEntityType.Url: // 文本本身就是链接,直接截取 string url = message.Text.Substring(entity.Offset, entity.Length); links.Add(url); break; case MessageEntityType.TextLink: // TextLink实体自带Url属性 if (!string.IsNullOrEmpty(entity.Url)) { links.Add(entity.Url); } break; } } } Console.WriteLine("提取到的链接列表:"); foreach (var link in links) { Console.WriteLine(link); }
完整示例代码
整合到你的HandleUpdateAsync方法中:
public static async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken) { if (update.Type == Telegram.Bot.Types.Enums.UpdateType.Message) { var message = update.Message; // 提取无格式文本 var plainText = new StringBuilder(); int currentPosition = 0; if (message.Entities != null) { foreach (var entity in message.Entities.OrderBy(e => e.Offset)) { plainText.Append(message.Text.Substring(currentPosition, entity.Offset - currentPosition)); plainText.Append(message.Text.Substring(entity.Offset, entity.Length)); currentPosition = entity.Offset + entity.Length; } } plainText.Append(message.Text.Substring(currentPosition)); Console.WriteLine("无格式文本: " + plainText.ToString()); // 提取所有链接 var links = new List<string>(); if (message.Entities != null) { foreach (var entity in message.Entities) { switch (entity.Type) { case MessageEntityType.Url: links.Add(message.Text.Substring(entity.Offset, entity.Length)); break; case MessageEntityType.TextLink: if (!string.IsNullOrEmpty(entity.Url)) links.Add(entity.Url); break; } } } Console.WriteLine("提取到的链接:"); foreach (var link in links) { Console.WriteLine(link); } } }
说明
MessageEntityType.Url:对应消息中直接显示的链接(如https://example.com)MessageEntityType.TextLink:对应带隐藏链接的格式化文本(如点击文本跳转的链接,实体的Url属性存储真实地址)
内容的提问来源于stack exchange,提问作者БВ Г
相关产品推荐
相关产品推荐

