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是更稳妥的方式:
- 先在VBA编辑器里通过「工具→引用」添加
VBA-JSON库(如果没装,先导入对应模块) - 用字典对象逐步构建结构,再转成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
相关产品推荐
相关产品推荐

