2015-07-25 2 views
0

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

Я попытался отправить много вариантов на следующие (как с и без escape-символов), но сервер продолжает отвечать на ошибки 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"\" \ 
} }' 

Использование Баш -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 через API Pushbullet? Я не замечаю ничего очевидного? Я пытаюсь выполнить это, используя только завиток и Bash, я не вижу причин, почему это невозможно (возможно, не самый быстрый или самый элегантный способ, но, безусловно, возможно).

ответ

1

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

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

Solution: Вложите все переменные разложения внутри JSON-отформатированный запрос в двойные кавычки и одинарные кавычки, например:

"'"$user_idens"'"

0

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

Я тоже был в состоянии получить ответ {} с этим кодом. Раньше у меня было все после заголовка, хранящегося в его собственной переменной, и я думаю, что это была основная проблема. Вероятно, это связано с тем, как Bash обрабатывает определенные символы внутри переменной (поэтому я избегаю всех двойных кавычек). Положить его на одну линию, казалось, исправить это. Однако я не получил SMS. Я должен удостовериться, что скрипт 'source_user_iden' и' target_device_iden' заданы надлежащим образом. Это дает мне некоторое представление о том, почему для меня не работало толкание файлов. –

+0

Итак, кажется, что хотя у меня есть правильные 'source_user_idens' и' target_device_idens', и я получаю правильный ответ '{}', мой телефон фактически не получает SMS. Я что-то пропустил? –

+0

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

Смежные вопросы