Если мое значение twitterInput является именем пользователя, аутентификация работает нормально. Но если это хэштег, он терпит неудачу. Поисковый запрос также правильно кодируется.Ошибка аутентификации Twitter API php oauth
Mine is? Q =% 23hashtagName, а не q =% 2523hashtagName. Я понял, что раньше у меня было слишком много кодировок.
Весь код аутентификации генерируется должным образом. Я проверил параметры $ base_string, $ key, $ signature, $ url, $ auth и $, чтобы убедиться, что они имеют правильные значения. Насколько я могу читать, они выглядят отлично.
Я получаю сообщение с кодом 32, «не удалось аутентифицировать вас».
Я пытался выяснить, существует ли разница между всеми моими переменными в отношении того, использую ли я хэштег или имя пользователя, или нет, и я не могу обнаружить существенную разницу, помимо очевидной разности путей.
Может ли кто-нибудь обнаружить вопиющую проблему, которая может привести к ошибке хэштага?
спасибо.
Вот вся моя функция:
<?php
function get_tweets($twitterInput){
$token = 'XXXXXXXX';
$token_secret = 'XXXXXXXX';
$consumer_key = 'XXXXXXXX';
$consumer_secret = 'XXXXXXXX';
$host = 'api.twitter.com';
$method = 'GET';
$hashtagInput = null;
$usernameInput = null;
$twitterFirstCharacter = $twitterInput[0];
// detect whether the input was a hashtag, username with the @ symbol, or just username without @
if ($twitterFirstCharacter == "#") {
$hashtagInput = $twitterInput;
} else if ($twitterFirstCharacter == "@") {
// just in case there's a @ symbol, delete it
$usernameInput = substr($twitterInput, 1);
} else {
$usernameInput = $twitterInput;
}
$path = null;
// if hashtag, build a different path
if ($hashtagInput) {
$path = '/1.1/search/tweets.json'; // api call path
$query = array(// query parameters
"q" => $hashtagInput,
"count" => 3,
);
} else {
$path = '/1.1/statuses/user_timeline.json'; // api call path
$query = array(// query parameters
'screen_name' => $usernameInput,
'count' => 3
);
}
$oauth = array(
'oauth_consumer_key' => $consumer_key,
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_timestamp' => time(),
'oauth_nonce' => time() . '-' . (string)mt_rand(), // a stronger nonce is recommended
'oauth_version' => '1.0',
'oauth_token' => $token,
);
$arr = array_merge($oauth, $query); // combine the values THEN sort
asort($arr); // secondary sort (value)
ksort($arr); // primary sort (key)
$querystring = urldecode(http_build_query($arr, '', '&'));
$url = "https://$host$path";
$base_string = $method."&".urlencode($url)."&".urlencode($querystring);
// same with the key
$key = rawurlencode($consumer_secret)."&".rawurlencode($token_secret);
// generate the hash
$signature = rawurlencode(base64_encode(hash_hmac('sha1', $base_string, $key, true)));
$url = $url . "?" . http_build_query($query);
$oauth['oauth_signature'] = $signature; // don't want to abandon all that work!
ksort($oauth); // probably not necessary, but twitter's demo does it
// also not necessary, but twitter's demo does this too
$oauth = array_map("_twitter_add_quotes", $oauth);
// this is the full value of the Authorization line
$auth = "OAuth " . urldecode(http_build_query($oauth, '', ', '));
// if you're doing post, you need to skip the GET building above
// and instead supply query parameters to CURLOPT_POSTFIELDS
$options = array(CURLOPT_HTTPHEADER => array("Authorization: $auth"),
//CURLOPT_POSTFIELDS => $postfields,
CURLOPT_HEADER => false,
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false);
// do our business
$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);
$twitter_data = json_decode($json);
return $twitter_data;
}
function _twitter_add_quotes($str) { return '"'.$str.'"'; }
?>
Как @boussouira сказал в комментарии, получите доступную библиотеку Twitter для Php из [здесь] (https://dev.twitter.com/overview/api/twitter-libraries#php) и начните работать над ней. Почему, потому что это слишком просто, и все будет в нескольких строках. Я предпочитаю 'twitteroauth'' @ abraham'. Удачи! –