отправка POST-запроса в PHP на ошибку pushbullet API 401

Я пытаюсь отправить простые push-уведомления с помощью pushbullet, просто используя электронную почту и отправляя их на связанный аккаунт, чтобы избежать необходимости в данных аккаунта. (см. ссылку здесь: https://docs.pushbullet.com/#pushes)

Поэтому я использую не cURL-метод в php, который я (не только) нашел здесь:
Как отправить запрос POST с помощью PHP?

К сожалению, я получаю сообщение об ошибке следующим образом:

<br />
<b>Warning</b>:  file_get_contents(https://api.pushbullet.com/v2/pushes): failed to open stream: HTTP request failed! HTTP/1.0 401 Unauthorized
in <b>/path/to/function.php</b> on line <b>42</b><br />
bool(false)

Опция использования URL для file_get_contents установлена ​​на «on».

Мой код:

$pushdata = array(
"email"     => $email,
"type"      => "link",
"title"     => "Demo Pushbullet Notification",
"body"      => "You have new comment(s)!",
"url"       => "http://demo.example.com/comments");

//Post without cURL

$options = array(
'http' => array(
'header'  => "Content-type: application/x-www-form-urlencoded\r\n"."Authorization: Bearer <xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>\r\n",
'method'  => 'POST',
'content' => http_build_query($pushdata),
),
);
$context  = stream_context_create($options);
$result = file_get_contents("https://api.pushbullet.com/v2/pushes", false, $context, -1, 40000);
var_dump($result);

РЕДАКТИРОВАТЬ: изменил код в ответ Кристоферхезе, по-прежнему не работает. Это также не должно требовать токенов доступа, поскольку я понимаю, что нажатие. Я понимаю это как продвижение уведомления от нейтрального к связанному электронному письму. Может быть, я ошибаюсь, но токен доступа не исправляет это.

РЕДАКТИРОВАТЬ (решено): токен доступа ЯВЛЯЕТСЯ необходимо выдвигать уведомления, и поскольку он не работает с этим методом, он работает с cURL.

1

Решение

Для этого вам нужно использовать cURL, чтобы вы могли передать ключ API в качестве заголовка, определенного в документации: https://docs.pushbullet.com/#http.

<?php

$curl = curl_init('https://api.pushbullet.com/v2/pushes');

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, ['Authorization: Bearer <your_access_token_here>']);
curl_setopt($curl, CURLOPT_POSTFIELDS, ["email" => $email, "type" => "link", "title" => "Demo Pushbullet Notification", "body" => "You have new comment(s)!", "url" => "http://demo.example.com/comments"]);

// UN-COMMENT TO BYPASS THE SSL VERIFICATION IF YOU DON'T HAVE THE CERT BUNDLE (NOT RECOMMENDED).
// curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

$response = curl_exec($curl);

print_r($response);

ЭТОТ КОДЕКС ПОЛНОСТЬЮ ОТ ЛИЦА МОЕЙ ГОЛОВКИ И НЕ БЫЛ ПРОВЕРЕН

Я разбил параметры, чтобы вы могли их легко увидеть, но вы можете объединить их в массив и передать через curl_setoptarray($curl, []);

0

Другие решения

Похоже, вы пропустили токен доступа для вашей учетной записи пользователя. Вы можете найти это на https://www.pushbullet.com/account . Вы должны включить его в заголовок, такой как «Авторизация»: «Носитель ACCESS_TOKEN_HERE».

1

Я знаю, что это старый пост, но у меня были те же проблемы с sendgrid, который использует тот же метод авторизации: APAREY на предъявителя, что и на вашем сайте.

Я наконец-то заставил его работать, используя необработанный пост php, используя следующий код

$url = "your url";
$post_data = 'yourdata';

// Set the headers
$options = array('http' =>
array(
'method'  => 'POST',
'header' => "Authorization: Bearer APIKEY\r\n" . 'Content-Type: application/x-www-form-urlencoded',
'content' => $post_data
)
);

// Send the POST data
$ctx = stream_context_create($options);
$fp = fopen($url, 'rb', false, $ctx);
// Read the POST data
$result = json_decode(stream_get_contents($fp));
echo "done";

Кажется, что переключение порядка заголовка и пропуск \ r \ n в конце, похоже, сработало. Я потратил целый час на то, чтобы попробовать разные комбинации, поэтому я решил опубликовать это для других.

Обратите внимание, что если вы используете API-интерфейс sendgrid, обязательно установите «Content-Type: application / json» и убедитесь, что ваши $ post_data находятся в json

1
По вопросам рекламы [email protected]