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

Telegram机器人:如何响应回调并获取ChatID发送私信?

如何获取Telegram用户ChatID并向未主动发消息的用户发送私信

你正在为滑翔伞公司开发Telegram机器人,用于管理接送班车预订:机器人在频道发布带时段按钮的消息,用户点击按钮后需发送私信告知预订结果,并提供取消按钮。当前你面临两个问题:如何获取用户的ChatID,以及用户从未主动给机器人发过消息时能否成功发送私信。

1. 获取用户ChatID

用户点击频道内的Inline按钮时,Telegram会向机器人推送包含用户信息的CallbackQuery对象。你可以直接从callbackQuery.From.Id获取用户的ChatID(个人用户的ChatID与用户ID完全一致)。

修改你的HandleCallBackQuery方法,补充获取ChatID和发送私信的逻辑:

async Task HandleCallBackQuery(ITelegramBotClient botClient, CallbackQuery callbackQuery, CancellationToken cancellationToken)
{
    Console.WriteLine($"Received callback data: {callbackQuery.Data}");
    
    // 提取用户ChatID
    long chatId = callbackQuery.From.Id;
    
    // 解析回调数据中的时段信息
    string[] callbackParts = callbackQuery.Data.Split(';');
    if (callbackParts.Length == 2 && callbackParts[0] == "register")
    {
        string timeSlot = callbackParts[1];
        
        // 构建取消预订的按钮
        InlineKeyboardMarkup inlineKeyboard = new(new[]
        {
            new[]
            {
                InlineKeyboardButton.WithCallbackData(text: "取消预订", callbackData: $"unregister;{timeSlot}"),
            }
        });
        
        try
        {
            // 向用户发送预订成功的私信
            await botClient.SendTextMessageAsync(
                chatId: chatId,
                text: $"你已成功预订{timeSlot}的接送班车。若无法参加,请点击下方按钮取消预订。",
                replyMarkup: inlineKeyboard,
                cancellationToken: cancellationToken);
            
            // 回复回调查询,显示成功提示
            await botClient.AnswerCallbackQueryAsync(callbackQuery.Id, "预订成功,已发送私信通知", cancellationToken: cancellationToken);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"发送私信失败: {ex.Message}");
            await botClient.AnswerCallbackQueryAsync(callbackQuery.Id, "发送通知失败,请检查是否屏蔽了机器人", cancellationToken: cancellationToken);
        }
    }
    
    // 后续可补充处理取消预订的逻辑
}

2. 向未主动发消息的用户发送私信的可行性

Telegram机器人的消息发送规则如下:

  • 若用户从未主动与机器人发起过任何交互(包括发消息、点击Inline按钮等),机器人无法主动给用户发私信;
  • 但用户点击频道内由机器人发布的Inline按钮,属于主动触发与机器人的交互,此时机器人获得了向该用户发送私信的权限(后续也可基于这次交互继续发送消息)。

因此你的场景完全可行:用户点击预订按钮后,机器人可以正常发送私信,无需用户提前给机器人发消息。唯一需要注意的是,如果用户手动屏蔽了机器人,发送操作会失败,需在代码中捕获异常并给出提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:27:38