Intereting Posts
Лучший редактор PHP для Vista Вызов функции javascript из контроллера codeigniter Глобальная переменная PHP, не найденная в функциях Лучший способ генерации уникальных имен файлов при загрузке файлов PHP CakePhp сортирует вывод $ this-> Form-> input FullCalendar не отображает время от событий JSON Отображение 11 последовательных строк из запроса, где средняя строка содержит переменную Как подсчитать количество повторяющихся элементов в массиве Справка MAMP Config, отображение ошибок PHP Изображение случайно повреждено (но загружается после обновления) и показывает «Ресурс, интерпретируемый как изображение, но переданный с типом текста MIME / html» Как работает PhpQuery? Попытка получить значение тега <title> Функции PHP system () и exec () не работают с временными файлами Сохранение сеанса с помощью Curl и PHP Как я могу отправить ответ json в контроллере symfony2 почему 3 обратная косая черта равна 4 обратным слэшам в php?

API Twitter возвращает ошибку 215, данные Bad Authentication

Я пытаюсь вызвать следующий 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("&amp;","&",$url); //Patch by @Frewuill $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 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; ?> 

С уважением

Единственное решение, которое я нашел до сих пор:

  • Создание приложения в панели разработчиков Twitter
  • Авторизовать пользователя с вашим приложением (или вашим приложением в учетной записи пользователя) и сохранить «oauth_token» и «oauth_token_secret», которые дает вам Twitter. Для этого используйте библиотеку TwitterOAuth , это довольно просто, см. Примеры с библиотекой.
  • Используя эти токены, вы можете выполнять аутентифицированные запросы от имени пользователя. Вы можете сделать это с той же библиотекой.

     // 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/>'; } 

Мне потребовалось слишком много времени, чтобы понять это. Надеюсь, это поможет кому-то!

URL-адрес с /1.1/ в нем правильный, это новый API-интерфейс Twitter 1.1.

Но вам нужно приложение и авторизуйте свое приложение (и пользователя) с помощью oAuth.

Подробнее об этом читайте на сайте документации разработчиков Twitter:

Ответ Груйка работал для меня в нижнем потоке.

{Выдержка | Zend_Service_Twitter – сделать API v1.1 готовым }

с ZF 1.12.3 обходным путем является передача userKey и userSecret в опцию oauthOptions, а не только в опциях.

  $options = array( 'username' => /*...*/, 'accessToken' => /*...*/, 'oauthOptions' => array( 'consumerKey' => /*...*/, 'consumerSecret' => /*...*/, ) ); 

UPDATE: API Twitter 1 теперь устарел. См. Выше ответ.

Twitter 1.1 не работает с этим синтаксисом (когда я написал этот ответ). Нужно быть 1, а не 1.1. Это будет работать:

http://api.twitter.com/1/followers/ids.json?cursor=-1&screen_name=username

После двух дней исследований я, наконец, обнаружил, что для доступа к таким публичным твитам вам понадобятся только учетные данные приложения, а не отдельные пользовательские. Поэтому, если вы разрабатываете для клиента, вам не нужно просить их ничего делать.

Чтобы использовать новый API Twitter 1.1, вам понадобятся две вещи:

  • библиотека Авраама TwitterOAuth, которую Данте Куллари уже упомянул
  • новое или уже работающее приложение, созданное на сайте Twitter Developer

Во-первых, вы можете (фактически должны) создать приложение с вашими собственными учетными данными, а затем получить токен доступа (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.

PS Мы не используем 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) )); 

Убедитесь, что вы читали и записывали доступ для приложения в twitter

Я использую 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 ); 

Я столкнулся с одной и той же проблемой все время, когда единственное решение, которое я выяснил, набирает CONSUMER_KEY и CONSUMER_SECRET непосредственно на новый класс защиты TwitterOAuth.

 $connection = new TwitterOAuth( "MY_CK" , "MY_CS" ); 

Не используйте переменную или статику по этому вопросу и не проверяйте, не была ли проблема выпущена.

Я знаю, что это старый, но вчера я столкнулся с такой же проблемой при вызове этого URL-адреса с использованием классов C # и 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? cursor = -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 } } 

Попробуйте этот twitter API explorer , вы можете войти в систему как разработчик и запросить все, что захотите.