2015-04-07 3 views
0

Если мое значение 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.'"'; } 
?> 
+0

Как @boussouira сказал в комментарии, получите доступную библиотеку Twitter для Php из [здесь] (https://dev.twitter.com/overview/api/twitter-libraries#php) и начните работать над ней. Почему, потому что это слишком просто, и все будет в нескольких строках. Я предпочитаю 'twitteroauth'' @ abraham'. Удачи! –

ответ

0

Это лучше использовать библиотеку API Twitter, посмотри на Twitter Developers страницы, он имеет хороший набор библиотек для PHP и других языков.

Смежные вопросы