VK API:使用社群令牌调用photos.saveMessagesPhoto上传消息照片报错问题
VK社群令牌上传消息照片的问题与解决方案
问题背景
使用社群(group)令牌调用VK API的photos.getMessagesUploadServer接口时,返回的是新的v2/bulk_upload格式上传URL(例如https://pu.vk.com/gu/photo/v2/bulk_upload?token=..),而非旧版upload.php,该现象在API版本5.81至5.199中均存在。
上传成功后的响应
以file1为字段名将文件上传至该URL可成功,返回响应如下:
{ "files": { "file1": { "sha": "7e3f064a...", "secret": "-179972...", "meta": {"height": "1006", "width": "1778"} } }, "hash": "bd59a78b...", "server": "999999", "request_id": "..." }
调用保存接口的失败情况
该响应无photo字段,尝试多种参数组合调用photos.saveMessagesPhoto均失败:
- [100] 参数缺失或无效:photo未定义
vk.photos.saveMessagesPhoto(server="999999", photo=???, hash="bd59a78b...") - [121] 无效哈希
vk.photos.saveMessagesPhoto(server="999999", photo=json.dumps(resp['files']), hash="bd59a78b...") - [100] 参数缺失或无效:photos_list无效
vk.photos.saveMessagesPhoto(server="999999", photo=resp['request_id'], hash="bd59a78b...")
已尝试的操作
- 仅
file1字段可成功上传(file0和photo字段返回error_code: 4606 "无法从请求中获取文件") - API版本5.81至5.199中,社群令牌始终返回
v2/bulk_uploadURL photos.save和photos.getUploadServer接口无法通过社群令牌调用(错误码[27]:该方法不支持社群授权)docs.getMessagesUploadServer仅支持doc、audio_message、graffiti类型,不支持照片
问题
是否存在方法可通过社群令牌保存经新v2/bulk_upload端点上传的照片?或当前有可用替代方法,可通过社群令牌上传照片至消息中?
可行解决方案
方案1:直接调用messages.send上传照片
针对API版本≥5.131,可直接使用messages.send接口的file参数,将照片以multipart/form-data格式发送,无需提前调用上传服务器接口。接口会自动完成照片上传并附加到消息中,示例代码:
vk.messages.send( peer_id=目标对话ID, message="附带照片的消息", file=open("photo.jpg", "rb"), random_id=随机数 )
方案2:适配新上传响应调用photos.saveMessagesPhoto
将v2/bulk_upload返回结果中files.file1的sha和secret以{sha}_{secret}的格式拼接,作为photo参数传入photos.saveMessagesPhoto,同时保留server和hash参数。正确调用示例:
photo_param = f"{resp['files']['file1']['sha']}_{resp['files']['file1']['secret']}" vk.photos.saveMessagesPhoto( server=resp['server'], photo=photo_param, hash=resp['hash'] )
此方式可匹配VK API对新上传端点的解析规则,成功完成照片保存。
内容的提问来源于stack exchange,提问作者DBNSTR
相关产品推荐
相关产品推荐

