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

VBA向Telegram Bot发送Inline Keyboard遇400错误,求正确构建方法

搞定Telegram Bot Inline Keyboard的VBA正确写法

踩过这个坑的过来人告诉你,HTTP 400错误99%是因为你构建的JSON格式不符合Telegram API的要求——Telegram对Inline Keyboard的结构有严格的嵌套规则,咱们一步步把代码改对。

先搞懂Telegram要求的核心结构

Inline Keyboard的本质是一个二维数组,层级关系不能乱:

  • 外层必须是reply_markup对象,里面要包含inline_keyboard这个键
  • inline_keyboard是一个数组,每个元素代表一行按钮
  • 每行按钮又是一个数组,每个元素是带text(按钮显示文字)和callback_data(点击后触发的回调标识)的对象

方法1:手动拼接JSON(适合简单键盘)

VBA里字符串的双引号要转义(用两个双引号表示一个),这是新手最容易栽的坑!正确的写法示例:

' 构建Inline Keyboard的JSON字符串
Dim keyboardJson As String
keyboardJson = "{""reply_markup"": {""inline_keyboard"": [[{""text"": ""查看详情"", ""callback_data"": ""view_detail""}], [{""text"": ""返回菜单"", ""callback_data"": ""back_menu""}]]}}"

解释下这段:

  • 外层reply_markup包裹整个键盘结构
  • inline_keyboard里的第一个子数组[{"text": "...", ...}]对应第一行的按钮,第二个子数组对应第二行的按钮
  • 所有双引号都用两个""转义,不然VBA会把它当成字符串结束符,直接破坏JSON格式

方法2:用VBA-JSON库构建(推荐,避免手动出错)

手动拼接复杂键盘很容易写错,用VBA-JSON库自动生成JSON是更稳妥的方式:

  1. 先在VBA编辑器里通过「工具→引用」添加VBA-JSON库(如果没装,先导入对应模块)
  2. 用字典对象逐步构建结构,再转成JSON:
' 创建字典对象来构建键盘结构
Dim replyMarkup As Object, btn1 As Object, btn2 As Object

Set replyMarkup = CreateObject("Scripting.Dictionary")
Set btn1 = CreateObject("Scripting.Dictionary")
Set btn2 = CreateObject("Scripting.Dictionary")

' 构建第一个按钮
btn1.Add "text", "查看详情"
btn1.Add "callback_data", "view_detail"

' 构建第二个按钮
btn2.Add "text", "返回菜单"
btn2.Add "callback_data", "back_menu"

' 组装成键盘的行数组(每行是一个按钮数组)
Dim keyboardArray As Variant
keyboardArray = Array(Array(btn1), Array(btn2))

' 把键盘数组放到reply_markup里
replyMarkup.Add "inline_keyboard", keyboardArray

' 转换为JSON字符串
Dim jsonConverter As Object
Set jsonConverter = CreateObject("VBA-JSON.JsonConverter")
Dim keyboardJson As String
keyboardJson = jsonConverter.ConvertToJson(replyMarkup)

最后把键盘和消息一起发送

不管用哪种方法,最后把键盘JSON和消息内容拼起来,用POST请求发送给Telegram API:

Dim req As Object
Set req = CreateObject("WinHttp.WinHttpRequest.5.1")

' 替换成你的Bot Token和目标Chat ID
Dim apiUrl As String
apiUrl = "https://api.telegram.org/bot你的BotToken/sendMessage"

req.Open "POST", apiUrl, False
req.SetRequestHeader "Content-Type", "application/json"

' 组装完整的请求数据
Dim postData As String
postData = "{""chat_id"": ""你的ChatID"", ""text"": ""请选择操作:"", " & keyboardJson & "}"

req.Send postData

' 检查响应结果,方便排查问题
If req.Status = 200 Then
    MsgBox "消息和键盘发送成功!"
Else
    MsgBox "出错了:" & req.Status & " " & req.StatusText & vbCrLf & req.ResponseText
End If

避坑关键提醒

  • 别漏了reply_markup外层:Telegram要求键盘必须放在这个对象里,直接传键盘数组会报错
  • 键名别写错:text、callback_data都是小写,拼写错误直接触发400
  • 必须是二维数组:哪怕只有一行一个按钮,也要写成[[{...}]],少一层数组就会格式错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:00:04