通过 Bash 脚本 (curl) 使用 Pushbullet API 发送短信

Sending SMS using the Pushbullet API via Bash scripting (curl)

我正在使用 Bash 脚本编写 Pushbullet HTTP API 的 cli。发送推送(注释和链接),以及创建、删除和修改联系人和设备都可以直接使用 curl 和 Bash。然而,发送短信和文件有点复杂,因为两者都需要向服务器发送更复杂的 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" } }'

在所有情况下,服务器 returns: {"error":{"type":"invalid_request","message":"Failed to parse JSON body.","cat":"(=^‥^=)"}}

使用 curl 通过 Pushbullet API 发送 SMS 的 JSON 请求的适当格式是什么?我是否忽略了一些明显的东西?我正在尝试仅使用 curl 和 Bash 来完成此操作,我看不出有什么不可能的原因(也许不是最快或最优雅的方式,但肯定是可能的)。

首先,我想为 API 的糟糕表现道歉,尤其是文件上传和发送短信。我正在考虑将多部分或 base64 文件上传添加到 /v2/pushes。我认为第一个可能会帮助你卷曲,但不确定 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" } }'

我找到了问题的解决方案,所以我想分享一下。其实很简单:

因为 curl 命令包含带有单引号的 JSON 格式的响应,所以没有发生变量扩展。这是 Bash 的限制(或者可能是功能)。因此,即使服务器响应 { } 表示请求中没有错误,但实际上发送的请求没有正确的参数值,例如 user_idensource_user_iden

解决方法: 用双引号和单引号将 JSON 格式的请求中的所有变量扩展括起来,如下所示:

"'"$user_idens"'"