在 PHP 中发送 POST 请求到 pushbullet API 401 错误
send POST request in PHP to pushbullet API 401 error
我正在尝试通过使用电子邮件发送简单的推送通知,并将其发送到链接的帐户以避免需要帐户数据。 (参见此处的参考资料:https://docs.pushbullet.com/#pushes)
因此我在 php 中使用了我(不仅)在这里找到的非 cURL 方法:
How do I send a POST request with 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)
为 file_get_contents 使用 url 的选项设置为 "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);
编辑:将代码更改为 christopherhesse 的响应,但仍然无效。据我所知,它也不应该需要访问令牌。我将其理解为将通知从中性推送到链接的电子邮件。也许我错了,但访问令牌并没有解决它。
编辑(已解决):推送通知需要访问令牌 IS,因为它不适用于此方法,所以它适用于 cURL。
听起来您缺少用户帐户的访问令牌。您可以在 https://www.pushbullet.com/account 上找到它。您应该将其包含在 header 中,例如 'Authorization':'Bearer ACCESS_TOKEN_HERE'.
您需要为此使用 cURL,以便您可以将 API 密钥作为文档中定义的 header 传递: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, []);
传递它们
我知道这是一个旧的 post 但我在使用与您的网站相同的 Authorization: Bearer APIKEY 方法的 sendgrid 时遇到了同样的问题。
我终于使用原始 php post 使用以下代码
$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";
似乎切换 header 的顺序并在末尾省略 \r\n 似乎可行。我花了大约一个小时来尝试不同的组合,所以我想我会 post 这对其他人来说。
请注意,如果您使用 sendgrid api,请确保设置 'Content-Type: application/json' 并确保您的 $post_data 在 json
中
我正在尝试通过使用电子邮件发送简单的推送通知,并将其发送到链接的帐户以避免需要帐户数据。 (参见此处的参考资料:https://docs.pushbullet.com/#pushes)
因此我在 php 中使用了我(不仅)在这里找到的非 cURL 方法: How do I send a POST request with 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)
为 file_get_contents 使用 url 的选项设置为 "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);
编辑:将代码更改为 christopherhesse 的响应,但仍然无效。据我所知,它也不应该需要访问令牌。我将其理解为将通知从中性推送到链接的电子邮件。也许我错了,但访问令牌并没有解决它。
编辑(已解决):推送通知需要访问令牌 IS,因为它不适用于此方法,所以它适用于 cURL。
听起来您缺少用户帐户的访问令牌。您可以在 https://www.pushbullet.com/account 上找到它。您应该将其包含在 header 中,例如 'Authorization':'Bearer ACCESS_TOKEN_HERE'.
您需要为此使用 cURL,以便您可以将 API 密钥作为文档中定义的 header 传递: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, []);
我知道这是一个旧的 post 但我在使用与您的网站相同的 Authorization: Bearer APIKEY 方法的 sendgrid 时遇到了同样的问题。
我终于使用原始 php post 使用以下代码
$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";
似乎切换 header 的顺序并在末尾省略 \r\n 似乎可行。我花了大约一个小时来尝试不同的组合,所以我想我会 post 这对其他人来说。
请注意,如果您使用 sendgrid api,请确保设置 'Content-Type: application/json' 并确保您的 $post_data 在 json
中