Excel VBA如何通过Telegram Bot API发送本地图片到群组
错误原因
- 你设置了
multipart/form-data的请求头但没有配套传入符合格式的请求体,仍然用普通键值对字符串拼接的方式传参,不符合multipart格式要求,且缺少必填的boundary(分隔符)参数 - 没有读取本地图片的二进制内容,仅传入了本地文件路径字符串,Telegram API无法访问你本地的文件路径
MSXML2.XMLHTTP发送文件时需要传入二进制类型的请求体,而不是字符串类型的datos_posteo
修复后的可用代码
Private Sub telegram_pruebas_photo() Dim objRequest As Object Dim stream As Object Dim boundary As String Dim token As String, ChatID As String, photoPath As String ' 替换为你自己的Bot Token、聊天ID、图片路径 token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ChatID = "-xxxxxxxxxxx" ' 注意群组ID的负号要保留 photoPath = "C:\documents\SCREENSHOT\picture1.jpg" ' 生成唯一分隔符,避免和文件内容重复 boundary = "---------------------------" & VBA.Format(VBA.Now(), "HHmmssfff") ' 用二进制流构造multipart格式的请求体 Set stream = CreateObject("ADODB.Stream") With stream .Type = 1 ' 设为二进制模式 .Open ' 写入chat_id参数 .WriteText "--" & boundary & vbCrLf .WriteText "Content-Disposition: form-data; name=""chat_id""" & vbCrLf & vbCrLf .WriteText ChatID & vbCrLf ' 写入图片参数和文件二进制内容 .WriteText "--" & boundary & vbCrLf .WriteText "Content-Disposition: form-data; name=""photo""; filename=""" & Mid(photoPath, InStrRev(photoPath, "\") + 1) & """" & vbCrLf .WriteText "Content-Type: image/jpeg" & vbCrLf & vbCrLf .LoadFromFile photoPath .Position = stream.Size .WriteText vbCrLf ' 写入结束分隔符 .WriteText "--" & boundary & "--" & vbCrLf .Position = 0 End With ' 发送请求 Set objRequest = CreateObject("MSXML2.XMLHTTP") With objRequest .Open "POST", "https://api.telegram.org/bot" & token & "/sendPhoto", False ' 请求头要带上分隔符参数 .setRequestHeader "Content-Type", "multipart/form-data; boundary=" & boundary .send stream.Read MsgBox .responseText ' 成功会返回包含图片信息的JSON,失败会返回错误提示 End With ' 释放资源 stream.Close Set stream = Nothing Set objRequest = Nothing End Sub
注意事项
- 请确认你的Bot已经被加入目标群组,且拥有发送消息的权限
- sendPhoto接口最大支持10MB的JPG/PNG格式图片,超过大小会发送失败
- 如果运行提示找不到ADODB.Stream,可在VBA编辑器的「工具」-「引用」中勾选「Microsoft ActiveX Data Objects 6.1 Library」
内容的提问来源于stack exchange,提问作者Juan049
相关产品推荐
相关产品推荐

