我正在使用Bash脚本编写Pushbullet HTTP API的cli。发送推送(备注和链接),以及创建,删除和修改联系人&设备都是直接使用curl和Bash。但是,发送SMS和文件有点复杂,因为它们都需要向服务器发送更复杂的JSON格式的请求(在推送文件的情况下,多个JSON格式的请求)。
我已尝试在以下内容上发送许多变体(包含和不包含转义字符),但服务器会不断回复有关JSON格式错误的信息。以下代码基于Pushbullet HTTP API documentation。
中给出的示例 curl -su $auth_id: -X POST https://api.pushbullet.com/v2/ephemerals --header "Content-Type: application/json"
--data-binary '{ "\"type"\": "\"push"\", "\"push"\": { \
"\"type"\": "\"messaging_extension_reply"\", \
"\"package_name"\": "\"com.pushbullet.android"\", \
"\"source_user_iden"\": "\"$source_idens"\", \
"\"target_device_iden"\": "\"$target_idens"\", \
"\"conversation_iden"\": "\"$sms_device"\", \
"\"message"\": "\"Hello"\" \
} }'
使用bash -x,我可以看到这是(据说)发送到服务器的内容:
--data-binary '{"type": "push", "push": {
"type": "messaging_extension_reply",
"package_name": "com.pushbullet.android",
"source_user_iden": "<source_idens>",
"target_device_iden": "<device_idens>",
"conversation_iden": "<sms_phone_number>",
"message": "Hello" } }'
在所有情况下,服务器都会返回:
{"error":{"type":"invalid_request","message":"Failed to parse JSON body.","cat":"(=^‥^=)"}}
使用curl通过Pushbullet API发送短信的JSON请求的适当格式是什么?我忽略了一些明显的东西吗我试图仅使用curl和Bash来实现这一目标,我认为没有理由不这样做(可能不是最快或最优雅的方式,但肯定是可能的)。
答案 0 :(得分:1)
我找到了问题的解决方案,所以我想我会分享它。实际上非常简单:
因为curl命令包含带单引号的JSON格式的响应,所以未发生变量扩展。这是Bash的限制(或许是一个特性)。因此,即使服务器响应{ }
表示请求中没有错误,实际上发送的请求没有适当的参数值,例如user_iden
,source_user_iden
等。< / p>
解决方案: 将所有变量扩展包含在双引号和单引号中的JSON格式的请求中,如下所示:
"'"$user_idens"'"
答案 1 :(得分:0)
首先,我要为API的糟糕程度道歉,尤其是文件上传和发送短信。我正在考虑将多部分或base64文件上传添加到/ v2 / push。我认为第一个可能会帮助你卷曲,不确定base64。尽管如此,multipart是一个巨大的痛苦,所以如果可能的话,我更愿意让它比当前的设置更好,而不是同样糟糕。欢迎提出建议。
我尝试了你的命令行,它似乎有效,所以我不确定出了什么问题。这是我所做的命令行。也许您的引用转义或换行导致JSON错误?
curl -u <access_token> -X POST https://api.pushbullet.com/v2/ephemerals --header "Content-Type: application/json" --data-binary '{"type": "push", "push": {"type": "messaging_extension_reply","package_name": "com.pushbullet.android","source_user_iden": "iden","target_device_iden": "device_idens", "conversation_iden": "sms_phone_number","message": "Hello" } }'