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

WTelegramClient调用GetBotCallbackAnswer遇BOT_RESPONSE_TIMEOUT异常

解决Messages_GetBotCallbackAnswer抛出BOT_RESPONSE_TIMEOUT异常的方案

针对调用Messages_GetBotCallbackAnswer接口时出现的BOT_RESPONSE_TIMEOUT异常,可尝试以下几种排查和解决方法:

1. 延长请求超时时间

默认请求超时可能不足以等待机器人响应,尤其是在机器人负载高或网络延迟场景下。可以给该接口调用单独设置更长的超时:

如果使用的Telegram库支持直接设置超时:

var response = await Client.Messages_GetBotCallbackAnswer(inputPeer, message.ID, callbackButton.data)
    .WithTimeout(TimeSpan.FromSeconds(30));

若库不支持直接设置,可通过Task.WhenAny手动实现超时控制:

var callbackTask = Client.Messages_GetBotCallbackAnswer(inputPeer, message.ID, callbackButton.data);
var timeoutTask = Task.Delay(TimeSpan.FromSeconds(30));

var completedTask = await Task.WhenAny(callbackTask, timeoutTask);
if (completedTask == timeoutTask)
{
    Console.WriteLine("请求超时,可考虑重试");
}
else
{
    var response = await callbackTask;
    Console.WriteLine("Button pressed successfully.");
    result = true;
}

2. 验证核心参数的正确性

  • 确认message.ID有效性:打印获取到的消息ID,对比机器人实际展示的消息ID是否一致,避免因历史消息过期或ID匹配错误导致机器人无法识别请求。
  • 校验callbackButton.data准确性:将字节数组转换为字符串(Encoding.UTF8.GetString(callbackButton.data)),与目标按钮的回调数据字符串对比,确保编码转换无误,避免匹配错误按钮。

3. 添加重试机制

临时网络波动或机器人响应延迟可能导致超时,添加重试逻辑可提升成功率:

int maxRetries = 3;
int currentRetry = 0;
bool pressSuccess = false;

while (currentRetry < maxRetries && !pressSuccess)
{
    try
    {
        var response = await Client.Messages_GetBotCallbackAnswer(inputPeer, message.ID, callbackButton.data);
        Console.WriteLine("Button pressed successfully.");
        pressSuccess = true;
    }
    catch (Exception ex) when (ex.Message.Contains("BOT_RESPONSE_TIMEOUT"))
    {
        currentRetry++;
        Console.WriteLine($"超时重试 {currentRetry}/{maxRetries}...");
        await Task.Delay(TimeSpan.FromSeconds(2));
    }
}
result = pressSuccess;

4. 排查机器人本身状态

  • 手动测试按钮:用账号手动点击目标内联按钮,确认机器人能正常响应,如果手动操作也无响应,说明问题出在目标机器人端。
  • 检查权限:确保你的账号拥有点击该按钮的权限,部分按钮可能仅对特定用户或群组开放。

5. 检查库版本兼容性

确认使用的Telegram SDK与.NET 8版本兼容,尝试更新SDK到最新稳定版,或查看SDK的问题列表,确认是否存在已知的超时相关bug。


调整后的完整代码示例

bool result = false;
if (GetInputPeer(chatId, out InputPeer? inputPeer) && inputPeer is not null)
{
    try
    {
        var history = await Client.Messages_GetHistory(inputPeer, limit: 50);
        Console.WriteLine($"Found {history.Messages.Length} messages in history.");

        foreach (var messageBase in history.Messages)
        {
            if (result) break;
            if (messageBase is Message message && message.reply_markup is ReplyInlineMarkup replyMarkup)
            {
                Console.WriteLine($"Found message with inline buttons: ID={message.ID}");

                foreach (var row in replyMarkup.rows)
                {
                    if (result) break;
                    foreach (var button in row.buttons)
                    {
                        if (result) break;
                        if (button is KeyboardButtonCallback callbackButton &&
                            callbackButton.data.SequenceEqual(Encoding.UTF8.GetBytes(inlineButtonCallbackData)))
                        {
                            Console.WriteLine($"Found matching inline button with callback data: {inlineButtonCallbackData}");

                            // 带重试的按钮点击逻辑
                            int maxRetries = 3;
                            int currentRetry = 0;
                            bool pressSuccess = false;
                            while (currentRetry < maxRetries && !pressSuccess)
                            {
                                try
                                {
                                    var response = await Client.Messages_GetBotCallbackAnswer(inputPeer, message.ID, callbackButton.data)
                                        .WithTimeout(TimeSpan.FromSeconds(30));
                                    Console.WriteLine("Button pressed successfully.");
                                    pressSuccess = true;
                                }
                                catch (Exception ex) when (ex.Message.Contains("BOT_RESPONSE_TIMEOUT"))
                                {
                                    currentRetry++;
                                    Console.WriteLine($"超时重试 {currentRetry}/{maxRetries}...");
                                    await Task.Delay(TimeSpan.FromSeconds(2));
                                }
                            }
                            result = pressSuccess;
                            break;
                        }
                    }
                }
            }
        }

        if (!result) Console.WriteLine("No matching button with specified callback data found.");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error pressing inline button: {ex.Message}");
    }
}
else
{
    Console.WriteLine($"InputPeer is null, chatId: {chatId} is skipped!");
}
return result;

内容的提问来源于stack exchange,提问作者Member-28661788

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:04:55