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

C# Telegram Bot 18.0.0:实现Inline按钮替代/命令功能

解决Telegram Bot Inline按钮回调功能(C# Telegram.Bot v18.0.0)

核心思路

把原命令逻辑抽成独立可复用方法,通过Inline按钮的CallbackData传递操作标识,在更新处理器中识别回调请求并复用对应逻辑,同时完成Telegram服务器的回调响应。


1. 创建带Inline按钮的菜单消息

给每个按钮设置唯一的CallbackData(比如action_topup),用来区分不同操作:

private static async Task SendMainMenuAsync(ITelegramBotClient botClient, ChatId chatId)
{
    var inlineKeyboard = new InlineKeyboardMarkup(new[]
    {
        new[]
        {
            InlineKeyboardButton.WithCallbackData("Topup", "action_topup")
        },
        // 其他按钮同理,比如"查询余额"可设为"action_balance"
    });

    await botClient.SendTextMessageAsync(
        chatId: chatId,
        text: "主菜单",
        replyMarkup: inlineKeyboard
    );
}

2. 抽离命令逻辑为复用方法

将原/Topup命令的业务逻辑单独封装,让命令触发和按钮回调能共用同一套逻辑:

private static async Task SendTopupMenuAsync(ITelegramBotClient botClient, ChatId chatId)
{
    // 这里写入原/Topup命令中的充值菜单逻辑,比如发送充值选项、输入提示等
    await botClient.SendTextMessageAsync(
        chatId: chatId,
        text: "请选择充值方式:\n1. 支付宝\n2. 微信"
    );
}

3. 处理更新(命令+回调)

在StartReceiving的更新处理器中,区分命令消息和回调查询分别处理:

var botClient = new TelegramBotClient("你的BotToken");

var receiverOptions = new ReceiverOptions
{
    AllowedUpdates = { } // 接收所有类型的更新
};

await botClient.StartReceiving(
    updateHandler: HandleUpdateAsync,
    pollingErrorHandler: HandlePollingErrorAsync,
    receiverOptions: receiverOptions
);

// 更新处理核心方法
private static async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken)
{
    // 处理普通命令消息(比如/start、/Topup)
    if (update.Message != null && update.Message.Text != null)
    {
        var chatId = update.Message.Chat.Id;
        var messageText = update.Message.Text;

        switch (messageText)
        {
            case "/start":
                await SendMainMenuAsync(botClient, chatId);
                break;
            case "/Topup":
                await SendTopupMenuAsync(botClient, chatId);
                break;
            // 其他命令处理逻辑
        }
        return;
    }

    // 处理Inline按钮回调请求
    if (update.CallbackQuery != null)
    {
        var callbackQuery = update.CallbackQuery;
        var chatId = callbackQuery.Message.Chat.Id;
        var callbackData = callbackQuery.Data;

        // 根据CallbackData匹配对应操作
        switch (callbackData)
        {
            case "action_topup":
                await SendTopupMenuAsync(botClient, chatId);
                break;
            // 其他按钮的回调逻辑
        }

        // 必须调用此方法告知Telegram已处理回调,否则按钮会一直处于加载状态
        await botClient.AnswerCallbackQueryAsync(
            callbackQueryId: callbackQuery.Id,
            text: "正在进入充值菜单...", // 可选:给用户显示临时提示文本
            cancellationToken: cancellationToken
        );
    }
}

// 错误处理方法
private static Task HandlePollingErrorAsync(ITelegramBotClient botClient, Exception exception, CancellationToken cancellationToken)
{
    var errorMessage = exception switch
    {
        ApiRequestException apiEx => $"Telegram API Error: {apiEx.ErrorCode} - {apiEx.Message}",
        _ => exception.ToString()
    };

    Console.WriteLine(errorMessage);
    return Task.CompletedTask;
}

关键注意事项

  • CallbackData唯一性:每个按钮的CallbackData要唯一,避免逻辑混淆
  • 必须调用AnswerCallbackQueryAsync:处理完回调后一定要调用此方法,否则用户端按钮会持续转圈
  • 逻辑复用:把业务逻辑抽成独立方法,减少重复代码
  • 更新类型判断:在HandleUpdateAsync中要区分普通消息和回调查询,分别处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:40:43