2015-02-02 2 views
1

Я пытаюсь загрузить список Twitter users friend через OAuth 1.0a. Это работает, если URL не имеет каких-либо параметров, например:Twitter API возвращает ошибку «Не удалось аутентифицировать вас», если параметры указаны в URL-адресе

работы: https://api.twitter.com/1.1/friends/list.json

не работает: https://api.twitter.com/1.1/friends/list.json?cursor=-1&skip_status=true&include_user_entities=false

Если добавить параметры к нему, я вернулась эта ошибка:

не удалось проверить подлинность вас

Что может быть причиной что? Мой код:

<?php 
$oauthToken = 'removed'; 
$oauthTokenSecret = 'removed'; 

function buildBaseString($baseURI, $method, $params) 
{ 
    $r = array(); 
    ksort($params); 
    foreach($params as $key=>$value){ 
     $r[] = "$key=" . rawurlencode($value); 
    }    

    return $method."&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r)); 
} 

function buildAuthorizationHeader($oauth) 
{ 
    $r = 'Authorization: OAuth '; 
    $values = array(); 
    foreach($oauth as $key=>$value) 
     $values[] = "$key=\"" . rawurlencode($value) . "\""; 

    $r .= implode(', ', $values); 
    return $r; 
} 

//WORKS: 
$url = 'https://api.twitter.com/1.1/friends/list.json'; 

//DOESN'T WORK, WHY?: 
//$url = 'https://api.twitter.com/1.1/friends/list.json?cursor=-1&skip_status=true&include_user_entities=false'; 

$consumer_key = 'removed'; 
$consumer_secret = 'removed'; 

$oauth = array('oauth_consumer_key' => $consumer_key, 
       'oauth_nonce' => time(), 
       'oauth_signature_method' => 'HMAC-SHA1', 
       'oauth_token' => $oauthToken, 
       'oauth_timestamp' => time(), 
       'oauth_version' => '1.0'); 

$base_info = buildBaseString($url, 'GET', $oauth); 

$composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauthTokenSecret); 
$oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true)); 
$oauth['oauth_signature'] = $oauth_signature; 


$header = array(buildAuthorizationHeader($oauth), 'Expect:'); 
$options = array(CURLOPT_HTTPHEADER => $header, 
        CURLOPT_HEADER => false, 
        CURLOPT_URL => $url, 
        CURLOPT_RETURNTRANSFER => true, 
        CURLOPT_SSL_VERIFYPEER => false); 

$feed = curl_init(); 
curl_setopt_array($feed, $options); 
$json = curl_exec($feed); 

echo "JSON: ".$json; 

curl_close($feed); 
?> 
+0

Может ли это быть полезным для вас, может быть: HTTP : //spoiledmilk.com/blog/taming-the-twitter-api-v1-1/ – MilanG

ответ

1

You необходимо включить ваши параметры в заголовки OAuth. Лучший способ сделать это - вырвать их из URL.

$params = array(
    "cursor" => -1, 
    "skip_status" => "true", 
    "include_user_entities" => "false" 
); 

Теперь создайте базовую строку, используя базовый url.

$url = 'https://api.twitter.com/1.1/friends/list.json' 
$oAuthHeaders = $oauth + $params; 
$base_info = buildBaseString($url, 'GET', $oAuthHeaders); 
$composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauthTokenSecret); 
$oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true)); 
$oAuthHeaders['oauth_signature'] = $oauth_signature; 

Наконец, создайте URLString с дополнительными параметрами:

if ($params) { 
    $finalURL = "$url?"; 
    foreach ($params as $key=>$param) { 
     $finalURL .= rawurlencode($key) . "=" . rawurlencode($param) . "&"; 
    } 
    $finalURL = substr($finalURL, 0, strlen($finalURL) - 1); 
} 

Теперь вы готовы отправить весь пакет от:

$header = array(buildAuthorizationHeader($oAuthHeaders), 'Expect:'); 
-1

Похоже, что вы используете rawurlencode на = символ. Это преобразует его в %3D.

Итак, вы получаете cursor%3D-1, если хотите cursor=-1.

Возможно, попробуйте упростить функцию, чтобы вы не кодировали =?

-1

Это пример кода для получения пользователем информации

 require_once('oauth/twitteroauth.php'); 

$oauth_token='YOUR OAUTH TOKEN'; 
$oauth_token_secret='YOUR SECRET KEY'; 
function getConnectionWithAccessToken($oauth_token, $oauth_token_secret) { 
    $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $oauth_token, $oauth_token_secret); 
    return $connection; 
} 

$connection = getConnectionWithAccessToken($oauth_token, $oauth_token_secret); 

$content = $connection->get('account/verify_credentials'); 
0

Адрес страницы имеют Params, так что вы должны стараться следовать этому (в вашей функции buildBaseString):

  1. Преобразование метода HTTP в верхнем регистре и установите строку вывода, равную этому значению.
  2. Добавить символ '&' в выходную строку.
  3. Процент кодирует URL-адрес и добавляет его в выходную строку.
  4. Добавить символ '&' в выходную строку.
  5. Процент кодирует строку параметров и присоединяет ее к выходу .

(Взято из: creating signatures)

Теперь у вас есть что-то вроде этого кодированного базового URL:

GET&https%3A%2F%2Fapi.twitter.com%2F1.1%2Ffriends%2Flist.json%3Fcursor%3D-1%26skip_status%3Dtrue%26include_user_entities%3Dfalse&oauth_consumer_key%3Dremoved%26oauth_nonce%3D1423633315%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1423633315%26oauth_token%3Dremoved%26oauth_version%3D1.0 

А может быть, вы должны попытаться получить это:

GET&https%3A%2F%2Fapi.twitter.com%2F1.1%2Ffriends%2Flist.json&cursor%3D-1%26skip_status%3Dtrue%26include_user_entities%3Dfalse%26oauth_consumer_key%3Dremoved%26oauth_nonce%3D1423633315%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1423633315%26oauth_token%3Dremoved%26oauth_version%3D1.0 
Смежные вопросы