通过Bash脚本(curl)

时间:2015-07-25 19:45:50

标签: json bash curl pushbullet

我正在使用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来实现这一目标,我认为没有理由不这样做(可能不是最快或最优雅的方式,但肯定是可能的)。

2 个答案:

答案 0 :(得分:1)

我找到了问题的解决方案,所以我想我会分享它。实际上非常简单:

因为curl命令包含带单引号的JSON格式的响应,所以未发生变量扩展。这是Bash的限制(或许是一个特性)。因此,即使服务器响应{ }表示请求中没有错误,实际上发送的请求没有适当的参数值,例如user_idensource_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" } }'