Отправка SMS с помощью API Pushbullet через скрипты Bash (curl)

Я работаю над cli для API Pushbullet HTTP, используя скрипты Bash. Отправка push-уведомлений (заметок и ссылок), а также создание, удаление и изменение контактов и устройств выполняются с помощью curl и Bash. Однако отправка SMS и файлов немного сложнее, так как оба требуют отправки на сервер более сложных запросов в формате JSON (несколько запросов в формате JSON, в случае отправки файлов).

Я попытался отправить множество вариантов следующего (как с escape-символами, так и без них), но сервер продолжает отвечать на сообщения об ошибках форматирования JSON. Следующий код основан на примере, приведенном в документации по API Pushbullet HTTP.

 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":"(=^‥^=)"}}

Как правильно форматировать JSON-запрос, используя curl для отправки SMS через Pushbullet API? Я пропускаю что-то очевидное? Я пытаюсь сделать это, используя только curl и Bash, и не вижу причин, почему это невозможно (возможно, не самым быстрым или элегантным способом, но, конечно, возможным).

2 ответа

Решение

Я нашел решение своей проблемы, поэтому решил поделиться им. Это было на самом деле очень просто:

Поскольку команда curl содержит ответ в формате JSON с одинарными кавычками, расширение переменной не происходило. Это ограничение (или, возможно, особенность) Bash. Таким образом, хотя сервер ответил { } что указывает на отсутствие ошибок в запросе, запросы фактически отправлялись без правильных значений параметров, таких какuser_iden,source_user_iden, так далее.

Решение: заключите все расширения переменных в запрос в формате JSON в двойные и одинарные кавычки, например:

"'"$user_idens"'"

Сначала я хотел бы извиниться за то, насколько плох API, особенно за загрузку файлов и отправку SMS. Я думал о добавлении загрузки нескольких файлов или base64 в /v2/pushes. Я думаю, что первый может помочь вам с curl, не уверен насчет 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" } }'
Другие вопросы по тегам