【问题标题】:Sending SMS using the Pushbullet API via Bash scripting (curl)通过 Bash 脚本 (curl) 使用 Pushbullet API 发送 SMS
【发布时间】:2015-07-25 19:45:49
【问题描述】:

我正在使用 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 发送 SMS 的 JSON 请求的适当格式是什么?我是否忽略了一些明显的东西?我正在尝试仅使用 curl 和 Bash 来完成此操作,我看不出它不可能的原因(可能不是最快或最优雅的方式,但肯定是可能的)。

【问题讨论】:

    标签: json bash curl pushbullet


    【解决方案1】:

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

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

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

    "'"$user_idens"'"

    【讨论】:

      【解决方案2】:

      首先,我要为 API 的糟糕程度道歉,尤其是文件上传和发送 SMS。我正在考虑将 multipart 或 base64 文件上传添加到 /v2/pushes。我认为第一个可能会帮助您卷曲,不确定 base64 的。多部分虽然是一个巨大的痛苦,所以如果可能的话,我宁愿让它比当前的设置更好,而不是同样糟糕。欢迎提出建议。

      我试过你的命令行,它似乎工作,所以我不确定出了什么问题。这是我做的命令行。也许您的引号转义或换行导致 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" } }'
      

      【讨论】:

      • 我也能够使用该代码获得 { } 响应。以前,我将标头之后的所有内容都存储在它自己的变量中,我认为这是主要问题。可能与 Bash 处理变量中某些字符的方式有关(因此我要转义所有双引号)。把它放在一条线上似乎可以解决这个问题。虽然我没有收到短信。我必须确保脚本指定了正确的source_user_identarget_device_iden。这让我知道为什么推送文件对我也不起作用。
      • 所以,似乎虽然我指定了正确的source_user_idenstarget_device_idens,并且我得到了正确的{ } 响应,但我的手机实际上并没有收到短信。我还缺少其他东西吗?
      • 你能给我你正在使用的确切请求吗?此外,需要明确的是,Pushbullet API 正在通过您的 android 手机上的 Pushbullet 应用程序发送 SMS。 (我不知道文档是否清楚)
      • 我应该仍然可以向自己发送短信,对吗? 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": "$user_iden","target_device_iden": "$dev_id", "conversation_iden": "$phone_number","message": "$sms" } }' $user_iden 和 $dev_id 分别通过分别调用 /v2/users/me 和 /v2/device 对象获得。 $phone_number 和 $sms 是用户在命令行中定义的。
      • 是的,它应该对你自己有用。如果您仍然没有任何运气,您应该在观看直播时尝试从 Pushbullet 应用发送 SMS 消息:docs.pushbullet.com/#stream 这样您就可以将您的消息与直播中显示的有效消息进行比较。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多