Я пытаюсь вызвать следующий API Twitter, чтобы получить список подписчиков для пользователя.
http://api.twitter.com/1.1/followers/ids.json?cursor=-1&screen_name=username
И я получаю это сообщение об ошибке в ответ.
{
code = 215;
message = "Bad Authentication data";
}
Я не могу найти документацию, связанную с этим кодом ошибки. Кто-нибудь знает об этой ошибке?
Очень сжатый код без какого-либо другого php файла, включая oauth и т.д. Обратите внимание, что для получения следующих ключей вам необходимо зарегистрироваться https://dev.twitter.com и создать приложение.
<?php
$token = 'YOUR_TOKEN';
$token_secret = 'YOUR_TOKEN_SECRET';
$consumer_key = 'CONSUMER_KEY';
$consumer_secret = 'CONSUMER_SECRET';
$host = 'api.twitter.com';
$method = 'GET';
$path = '/1.1/statuses/user_timeline.json'; // api call path
$query = array( // query parameters
'screen_name' => 'twitterapi',
'count' => '5'
);
$oauth = array(
'oauth_consumer_key' => $consumer_key,
'oauth_token' => $token,
'oauth_nonce' => (string)mt_rand(), // a stronger nonce is recommended
'oauth_timestamp' => time(),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_version' => '1.0'
);
$oauth = array_map("rawurlencode", $oauth); // must be encoded before sorting
$query = array_map("rawurlencode", $query);
$arr = array_merge($oauth, $query); // combine the values THEN sort
asort($arr); // secondary sort (value)
ksort($arr); // primary sort (key)
// http_build_query automatically encodes, but our parameters
// are already encoded, and must be by this point, so we undo
// the encoding step
$querystring = urldecode(http_build_query($arr, '', '&'));
$url = "https://$host$path";
// mash everything together for the text to hash
$base_string = $method."&".rawurlencode($url)."&".rawurlencode($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)));
// this time we're using a normal GET query, and we're only encoding the query params
// (without the oauth params)
$url .= "?".http_build_query($query);
$url=str_replace("&","&",$url); //Patch by @Frewuill
$oauth['oauth_signature'] = $signature; // don't want to abandon all that work!
ksort($oauth); // probably not necessary, but twitter demo does it
// also not necessary, but twitter demo does this too
function add_quotes($str) { return '"'.$str.'"'; }
$oauth = array_map("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);
foreach ($twitter_data as &$value) {
$tweetout .= preg_replace("/(http:\/\/|(www\.))(([^\s<]{4,68})[^\s<]*)/", '<a href="http://$2$3" target="_blank">$1$2$4</a>', $value->text);
$tweetout = preg_replace("/@(\w+)/", "<a href=\"http://www.twitter.com/\\1\" target=\"_blank\">@\\1</a>", $tweetout);
$tweetout = preg_replace("/#(\w+)/", "<a href=\"http://search.twitter.com/search?q=\\1\" target=\"_blank\">#\\1</a>", $tweetout);
}
echo $tweetout;
?>
Привет
Единственное решение, которое я нашел до сих пор:
С помощью этих токенов вы можете выполнять аутентифицированные запросы от имени пользователя. Вы можете сделать это с той же библиотекой.
// Arguments 1 and 2 - your application static tokens, 2 and 3 - user tokens, received from Twitter during authentification
$connection = new TwitterOAuth(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET, $tokens['oauth_token'], $tokens['oauth_token_secret']);
$connection->host = 'https://api.twitter.com/1.1/'; // By default library uses API version 1.
$friendsJson = $connection->get('/friends/ids.json?cursor=-1&user_id=34342323');
Это вернет вам список друзей пользователя.
НАЙДЕНО РЕШЕНИЕ - используя библиотеку Abraham TwitterOAuth. Если вы используете более старую реализацию, следующие строки должны быть добавлены после создания нового объекта TwitterOAuth:
$connection->host = "https://api.twitter.com/1.1/";
$connection->ssl_verifypeer = TRUE;
$connection->content_type = 'application/x-www-form-urlencoded';
Первые 2 строки теперь задокументированы в файле Readme библиотеки Abraham, но третий - нет. Также убедитесь, что ваша oauth_version все равно 1.0.
Вот мой код для получения всех пользовательских данных из "users/show" с недавно прошедшим аутентификацию пользователя и возврата полного имени пользователя и значка пользователя с 1.1 - в файле обратного вызова аутентификации реализован следующий код:
session_start();
require ('twitteroauth/twitteroauth.php');
require ('twitteroauth/config.php');
$consumer_key = '****************';
$consumer_secret = '**********************************';
$to = new TwitterOAuth($consumer_key, $consumer_secret);
$tok = $to->getRequestToken('http://exampleredirect.com?twitoa=1');
$token = $tok['oauth_token'];
$secret = $tok['oauth_token_secret'];
//save tokens to session
$_SESSION['ttok'] = $token;
$_SESSION['tsec'] = $secret;
$request_link = $to->getAuthorizeURL($token,TRUE);
header('Location: ' . $request_link);
Следующий код затем переадресовывается после запроса проверки подлинности и токена
if($_REQUEST['twitoa']==1){
require ('twitteroauth/twitteroauth.php');
require_once('twitteroauth/config.php');
//Twitter Creds
$consumer_key = '*****************';
$consumer_secret = '************************************';
$oauth_token = $_GET['oauth_token']; //ex Request vals->http://domain.com/twitter_callback.php?oauth_token=MQZFhVRAP6jjsJdTunRYPXoPFzsXXKK0mQS3SxhNXZI&oauth_verifier=A5tYHnAsbxf3DBinZ1dZEj0hPgVdQ6vvjBJYg5UdJI
$ttok = $_SESSION['ttok'];
$tsec = $_SESSION['tsec'];
$to = new TwitterOAuth($consumer_key, $consumer_secret, $ttok, $tsec);
$tok = $to->getAccessToken();
$btok = $tok['oauth_token'];
$bsec = $tok['oauth_token_secret'];
$twit_u_id = $tok['user_id'];
$twit_screen_name = $tok['screen_name'];
//Twitter 1.1 DEBUG
//print_r($tok);
//echo '<br/><br/>';
//print_r($to);
//echo '<br/><br/>';
//echo $btok . '<br/><br/>';
//echo $bsec . '<br/><br/>';
//echo $twit_u_id . '<br/><br/>';
//echo $twit_screen_name . '<br/><br/>';
$twit_screen_name=urlencode($twit_screen_name);
$connection = new TwitterOAuth($consumer_key, $consumer_secret, $btok, $bsec);
$connection->host = "https://api.twitter.com/1.1/";
$connection->ssl_verifypeer = TRUE;
$connection->content_type = 'application/x-www-form-urlencoded';
$ucontent = $connection->get('users/show', array('screen_name' => $twit_screen_name));
//echo 'connection:<br/><br/>';
//print_r($connection);
//echo '<br/><br/>';
//print_r($ucontent);
$t_user_name = $ucontent->name;
$t_user_icon = $ucontent->profile_image_url;
//echo $t_user_name.'<br/><br/>';
//echo $t_user_icon.'<br/><br/>';
}
Мне потребовалось слишком много времени, чтобы понять это. Надеюсь, это поможет кому-то!
Ответ от Gruik работал у меня в нижнем потоке.
{Выдержка | Zend_Service_Twitter - сделать API v1.1 готовым }
с ZF 1.12.3 обходным путем является передача userKey и userSecret в опцию oauthOptions, а не только в опциях.
$options = array(
'username' => /*...*/,
'accessToken' => /*...*/,
'oauthOptions' => array(
'consumerKey' => /*...*/,
'consumerSecret' => /*...*/,
)
);
URL-адрес с /1.1/
в нем правильный, это новый API-интерфейс Twitter 1.1.
Но вам нужно приложение и авторизуйте свое приложение (и пользователя) с помощью oAuth.
Подробнее об этом читайте на сайте документации разработчиков Twitter :)
UPDATE: API Twitter 1 теперь устарел. См. Выше ответ.
Twitter 1.1 не работает с этим синтаксисом (когда я написал этот ответ). Нужно быть 1, а не 1.1. Это будет работать:
http://api.twitter.com/1/followers/ids.json?cursor=-1&screen_name=username
После двух дней исследований я наконец обнаружил, что для доступа к s.o. общедоступным твитам вам нужны только любые учетные данные приложения, а не отдельные пользовательские. Поэтому, если вы разрабатываете для клиента, вам не нужно просить их что-либо делать.
Чтобы использовать новый API Twitter 1.1, вам нужно две вещи:
Во-первых, вы можете (фактически) создать приложение с своими собственными учетными данными, а затем получить токен доступа (OAUTH_TOKEN) и секрет токена доступа (OAUTH_TOKEN_SECRET) из " вашего доступа токена. Затем вы предоставляете их в конструкторе для нового объекта TwitterOAuth. Теперь вы можете получить доступ к общедоступным твитам любой.
$connection = new TwitterOAuth( CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET );
$connection->host = "https://api.twitter.com/1.1/"; // change the default
$connection->ssl_verifypeer = TRUE;
$connection->content_type = 'application/x-www-form-urlencoded';
$tweets = $connection->get('http://api.twitter.com/1.1/statuses/user_timeline.json?screen_name='.$username.'&count='.$count);
На самом деле я думаю, что это то, что предложил Павел, но это не так очевидно из его ответа.
Надеюсь, это спасет кого-то еще эти два дня:)
Это может помочь кому-то, кто использует Zend_Oauth_Client для работы с twitter api. Эта рабочая конфигурация:
$accessToken = new Zend_Oauth_Token_Access();
$accessToken->setToken('accessToken');
$accessToken->setTokenSecret('accessTokenSecret');
$client = $accessToken->getHttpClient(array(
'requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER,
'version' => '1.0', // it was 1.1 and I got 215 error.
'signatureMethod' => 'HMAC-SHA1',
'consumerKey' => 'foo',
'consumerSecret' => 'bar',
'requestTokenUrl' => 'https://api.twitter.com/oauth/request_token',
'authorizeUrl' => 'https://api.twitter.com/oauth/authorize',
'accessTokenUrl' => 'https://api.twitter.com/oauth/access_token',
'timeout' => 30
));
Похоже, что twitter api 1.0 позволяет версии oauth быть 1.1 и 1.0, где twitter api 1.1 требует, чтобы только версия oauth была 1.0.
P.S Мы не используем Zend_Service_Twitter, поскольку он не позволяет отправлять настраиваемые параметры обновления статуса.
Вам нужно отправить customerKey и customerSecret в Zend_Service_Twitter
$twitter = new Zend_Service_Twitter(array(
'consumerKey' => $this->consumer_key,
'consumerSecret' => $this->consumer_secret,
'username' => $user->screenName,
'accessToken' => unserialize($user->token)
));
Я столкнулся с одной и той же проблемой все время, когда единственное решение, которое я выясняю, набирает CONSUMER_KEY
и CONSUMER_SECRET
непосредственно на новую защиту класса TwitterOAuth.
$connection = new TwitterOAuth( "MY_CK" , "MY_CS" );
Не используйте переменную или статику для этого и посмотрите, не была ли проблема выпущена.
Я использую HybridAuth и сталкивался с этой ошибкой, подключаясь к Twitter. Я отследил его до (меня), отправив Twitter неверно запрошенный тип запроса (get/post вместо GET/POST).
Это вызовет 215:
$call = '/search/tweets.json';
$call_type = 'get';
$call_args = array(
'q' => 'pancakes',
'count' => 5,
);
$response = $provider_api->api( $call, $call_type, $call_args );
Это не будет:
$call = '/search/tweets.json';
$call_type = 'get';
$call_args = array(
'q' => 'pancakes',
'count' => 5,
);
$response = $provider_api->api( $call, $call_type, $call_args );
Боковое примечание: в случае HybridAuth следующее также не будет (поскольку HA внутренне обеспечивает корректно обведенное значение для типа запроса):
$call = '/search/tweets.json';
$call_args = array(
'q' => 'pancakes',
'count' => 5,
);
$response = $providers['Twitter']->get( $call, $call_args );
Я знаю, что это старый, но вчера я столкнулся с такой же проблемой при вызове этого URL-адреса с использованием классов С# и HttpClient с токеном аутентификации на предъявителя:
http://api.twitter.com/1.1/followers/ids.json?cursor=-1&screen_name=username
Оказывается, решение для меня заключалось в использовании HTTPS вместо HTTP. Поэтому мой URL-адрес будет выглядеть так:
HTTPS://api.twitter.com/1.1/followers/ids.json курсора = -1 & screen_name = имя пользователя
Итак, вот фрагмент моего кода:
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("https://api.twitter.com/1.1/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("Authorization", "Bearer **** YOUR BEARER TOKEN GOES HERE ****");
var response = client.GetAsync("statuses/user_timeline.json?count=10&screen_name=username").Result;
if (!response.IsSuccessStatusCode)
{
return result;
}
var items = response.Content.ReadAsAsync<IEnumerable<dynamic>>().Result;
foreach (dynamic item in items)
{
//Do the needful
}
}
{"errors":[{"message":"Bad Authentication data","code":215}]}
Убедитесь, что вы прочитали и записали доступ для приложения в твиттере
Попробуйте этот твиттер API explorer, вы можете войти в систему как разработчик и запросить все, что захотите.