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

如何使用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,提问作者БВ Г

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:57:19