2015-05-26 76 views
1

我試圖通過使用電子郵件發送簡單的推送通知與pushbullet只是通過使用電子郵件併發送到鏈接的帳戶,以避免需要帳戶數據。 (見參考這裏:https://docs.pushbullet.com/#pushes在PHP中發送POST請求pushbullet API 401錯誤

因此我使用PHP中的非捲曲的方法,我(不僅)在這裏找到: 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。

回答

0

您需要爲此使用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

這樣做,謝謝。 – Pinetrax

+0

你非常歡迎,很高興幫助。 – nblackburn

1

聽起來就像您缺少用戶帳戶的訪問令牌。你可以在https://www.pushbullet.com/account找到它。您應該將其包含在「授權」這樣的標頭中:「承載者ACCESS_TOKEN_HERE」。

+0

遺憾的是沒有做的伎倆,但我也覺得不該我不需要,我相應地更新了代碼並發表了一條小評論。 – Pinetrax

+0

你肯定需要成爲帶有訪問令牌的Pushbullet用戶才能調用/ v2 /推送。你的標題應該可能更類似於: 'header'=> [「Content-type:application/x-www-form-urlencoded」,「Authorization:Bearer 」], –

+0

是的,我堅決需要一個,在那裏確實錯了。它仍然不起作用,但它確實如此。 – Pinetrax

1

我知道這是一箇舊的帖子,但我與sendgrid使用相同的授權:承載APIKEY方法作爲您的網站相同的問題。

我終於得到它使用原始的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在年底似乎工作上班。我花了一個小時在這嘗試不同的組合,所以我想我會發布給其他人。

注意,如果您使用sendgrid API請務必設置「內容類型:應用程序/ JSON」,並確保你的$ post_data是JSON