$callbackUrl = urlencode(self::CALLBACK_URL);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"https://api.twitter.com/oauth/request_token");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'oauth_callback' => $callbackUrl,
'oauth_consumer_key' => self::TWITTER_API_KEY
]);
$timestamp = date("U"); // UTC UNIX time
$oauth_nonce = preg_replace( '/[\W]/', '', base64_encode($timestamp));
$headers = [
"Authorization: OAuth oauth_consumer_key=\"".self::TWITTER_API_KEY."\"",
"oauth_nonce: \"$oauth_nonce\"",
"oauth_signature: \"oauth_signature\"",
"oauth_signature_method: \"HMAC-SHA1\"",
"oauth_timestamp: \"$timestamp\"",
"oauth_version: \"1.0\"",
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, $fp);
curl_setopt($ch, CURLINFO_HEADER_OUT , true);
$curlResult = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Curl Request Error:' . curl_error($ch);
throw new CHttpException(404,'ERROR');
}
curl_close ($ch);
推特結果: {"errors":[{"code":215,"message":"Bad Authentication data."}]}
要求:
[url] => https://api.twitter.com/oauth/request_token
[content_type] => application/json; charset=utf-8
[http_code] => 400
[header_size] => 1395
[request_size] => 429
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.250341
[namelookup_time] => 0.028679
[connect_time] => 0.044366
[pretransfer_time] => 0.093077
[size_upload] => 344
[size_download] => 62
[speed_download] => 247
[speed_upload] => 1374
[download_content_length] => 62
[upload_content_length] => 344
[starttransfer_time] => 0.115261
[redirect_time] => 0
[redirect_url] => 0
[primary_ip] => 104.244.42.2
[certinfo] => Array
(
)
[primary_port] => 443
[local_ip] => 192.168.208.2
[local_port] => 48502
[request_header] => POST /oauth/request_token HTTP/1.1
我做了所有類似 Twitter 檔案的事情,但它回傳 215。我認為問題出在標題部分,但我不知道那里有什么問題。
我用隨機的base64東西生成了nonce,就像Twitter在檔案中所說的那樣。時間看起來類似于來自 Twitter 的示例時間。我看到當時間比推特高 5 分鐘時,請求被阻止。那是相同的錯誤代碼嗎?
uj5u.com熱心網友回復:
根據檔案,授權標頭應包含所有資料。您的Authorization標題僅包含OAuth oauth_consumer_key.
您的實際標題(格式錯誤,因為例如,'oauth' 是標題的條目,但應該是 Authorization 的屬性 - 見下文)。
Authorization: OAuth oauth_consumer_key='xxx'
oauth_nonce: 'MTY0MzIwNjg5NQ'
oauth_signature: 'oauth_signature'
oauth_signature_method: 'HMAC-SHA1'
oauth_timestamp: '1643206895'
oauth_version: '1.0'
你應該有
Authorization: OAuth oauth_consumer_key='xxx', oauth_nonce="MTY0MzIwNjg5NQ", oauth_signature="oauth_signature", ...
您需要將所有資料連接到一個字串中。但是您可以創建一個陣列來幫助構建它。這是一個例子:
$authParams = implode(', ', [
'oauth_consumer_key="' . self::TWITTER_API_KEY . '"',
'oauth_nonce="' . $oauth_nonce . '"',
'oauth_signature="oauth_signature"',
'oauth_signature_method="HMAC-SHA1"',
'oauth_timestamp="' . $timestamp . '"',
'oauth_version="1.0"',
]);
$headers = [
"Authorization: OAuth $authParams"
];
var_dump($headers);
輸出類似:
array(1) {
[0]=>
string(197) "Authorization: OAuth oauth_consumer_key="xxx", oauth_nonce="MTY0MzIwNjg2MA", oauth_signature="oauth_signature", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1643206860", oauth_version="1.0""
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/422921.html
標籤:
下一篇:在PHPcurl_multi中,是否有等效于curl_getinfo()來獲取curl_multi_exec()的HTTP回應代碼?
