Twitter API returns error 215, Bad Authentication Data Twitter API returns error 215, Bad Authentication Data php php

Twitter API returns error 215, Bad Authentication Data


A very concise code without any other php file include of oauth etc.Please note to obtain following keys you need to sign up with https://dev.twitter.com and create application.

<?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 sortasort($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's demo does it// also not necessary, but twitter's demo does this toofunction 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;?>

Regards


The only solution I've found so far is:

  • Create application in twitter developer panel
  • Authorize user with your application (or your application in user account) and save "oauth_token" and "oauth_token_secret" which Twitter gives you. Use TwitterOAuth library for this, it's pretty easy, see examples coming with library.
  • Using this tokens you can make authenticated requests on behalf of user. You can do it with the same library.

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

This will return you list of user's friends.


FOUND A SOLUTION - using the Abraham TwitterOAuth library. If you are using an older implementation, the following lines should be added after the new TwitterOAuth object is instantiated:

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

The first 2 lines are now documented in Abraham library Readme file, but the 3rd one is not. Also make sure that your oauth_version is still 1.0.

Here is my code for getting all user data from 'users/show' with a newly authenticated user and returning the user full name and user icon with 1.1 - the following code is implemented in the authentication callback file:

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

The following code then is in the redirect after authentication and token request

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

It took me way too long to figure this one out. Hope this helps someone!!