Twitter API返回错误215,错误的身份validation数据

我正在尝试通过Twitter的API来获取用户的关注者列表。

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

我得到这个错误信息作为回应。

{ code = 215; message = "Bad Authentication data"; } 

我似乎无法find与此错误代码相关的文档。 任何人有任何关于这个错误的想法?

一个非常简洁的代码,没有任何其他的PHP文件包括oauth等。请注意获得以下密钥,你需要注册https://dev.twitter.com并创build应用程序。;

 <?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; ?> 

问候

我迄今为止唯一find的解决scheme是:

  • 在Twitter开发者面板中创build应用程序
  • 授权用户使用您的应用程序(或您的应用程序在用户帐户),并保存Twitter给你的“oauth_token”和“oauth_token_secret”。 为此使用TwitterOAuth库,这很容易,看到库的例子。
  • 使用这个令牌可以代表用户进行authentication请求。 你可以用同一个库来做。

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

这将返回您的用户的朋友列表。

find一个解决scheme – 使用亚伯拉罕TwitterOAuth库 。 如果您使用的是较早的实现,则应在新的TwitterOAuth对象实例化之后添加以下行:

 $connection->host = "https://api.twitter.com/1.1/"; $connection->ssl_verifypeer = TRUE; $connection->content_type = 'application/x-www-form-urlencoded'; 

前两行现在logging在亚伯拉罕图书馆自述文件中,但第三行不是。 还要确保你的oauth_version仍然是1.0。

这里是我的代码,用于从“users / show”获取具有新authentication用户的所有用户数据,并用1.1返回用户全名和用户图标 – 以下代码在authenticationcallback文件中实现:

 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); 

下面的代码然后是在authentication和令牌请求之后的redirect

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

这一个花了太长的时间才算出来。 希望这可以帮助别人!

/1.1/中的url是正确的,它是新的Twitter API版本1.1。

但是你需要一个应用程序并使用oAuth授权你的应用程序(和用户)。

在Twitter开发者文档站点上阅读更多关于这方面的信息 🙂

Gruik的答案在下面的线程中为我工作。

{摘录| Zend_Service_Twitter – 使API v1.1准备就绪 }

使用ZF 1.12.3的解决方法是在oauthOptions选项中传递consumerKey和consumerSecret,而不是直接在选项中。

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

更新: Twitter API 1现已被弃用。 参考上面的答案。

Twitter 1.1不能用这个语法(当我写这个答案的时候)。 需要是1,而不是1.1。 这将工作:

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

经过两天的研究,我终于发现,要访问公共推文,您只需要任何应用程序凭证,而不是特定的用户。 所以如果你正在为客户开发,你不必要求他们做任何事情。

要使用新的Twitter API 1.1,您需要两件事情:

  • Dante Cullari已经提到的亚伯拉罕的TwitterOAuth图书馆
  • 通过Twitter开发者网站创build的全新的或已经在运行的应用程序

首先,您可以(实际上必须)使用您自己的凭据创build应用程序,然后从“ 您的访问令牌 ”部分获取Access令牌 (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); 

其实我觉得这也是帕维尔所build议的,但是他的回答并不是那么明显。

希望这节省了别人这两天:)

这可能会帮助使用Zend_Oauth_Client的人使用twitter API。 这个工作configuration:

 $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,因为它不允许发送状态更新的自定义参数。

您需要将customerKeycustomerSecret发送到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的这个错误。 我跟踪到(我)发送一个不正确的盒装请求types(get / post,而不是GET / POST)的Twitter发送。

这将导致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在内部为请求types提供了正确的值):

 $call = '/search/tweets.json'; $call_args = array( 'q' => 'pancakes', 'count' => 5, ); $response = $providers['Twitter']->get( $call, $call_args ); 

我一直面临同样的问题,我唯一的解决scheme是直接inputCONSUMER_KEYCONSUMER_SECRET到新的TwitterOAuth类定义。

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

不要使用variables或静态,看看问题是否解决。

我知道这是旧的,但昨天我遇到了同样的问题,当使用C#和HttpClient类与承载身份validation令牌调用此URL:

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

事实certificate,我的解决scheme是使用HTTPS而不是HTTP。 所以我的url如下所示:

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

所以这里是我的代码片段:

  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浏览器 ,你可以作为一个开发人员login并查询任何你想要的。