web-dev-qa-db-fra.com

L'API Twitter renvoie l'erreur 215, Données d'authentification incorrecte

J'essaie d'appeler l'API Twitter suivante pour obtenir une liste d'abonnés pour un utilisateur.

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

Et je reçois ce message d'erreur en réponse.

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

Je n'arrive pas à trouver la documentation relative à ce code d'erreur. Quelqu'un a une idée de cette erreur?

106
Dip Dhingani

Un code très concis, sans aucun autre fichier php, comme par exemple oauth, etc ..__ Veuillez noter que pour obtenir les clés suivantes, vous devez vous inscrire avec https://dev.Twitter.com et créer une 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 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;

?>

Cordialement

23
A Bright Worker

La seule solution que j'ai trouvée jusqu'à présent est:

  • Créer une application dans le panneau de développeur Twitter
  • Autorisez l'utilisateur avec votre application (ou votre application dans un compte utilisateur) et enregistrez "oauth_token" et "oauth_token_secret" que Twitter vous donne. Utilisez TwitterOAuth library pour cela, c’est assez facile, voir les exemples fournis avec library.
  • En utilisant ces jetons, vous pouvez faire des demandes authentifiées pour le compte de l'utilisateur. Vous pouvez le faire avec la même bibliothèque.

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

Cela vous retournera la liste des amis de l'utilisateur.

11
Pavel

A TROUVÉ UNE SOLUTION - en utilisant la bibliothèque Abraham TwitterOAuth . Si vous utilisez une implémentation plus ancienne, les lignes suivantes doivent être ajoutées après l'instanciation du nouvel objet TwitterOAuth: 

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

Les deux premières lignes sont maintenant documentées dans le fichier Lisezmoi de la bibliothèque Abraham, mais la troisième ne l’est pas. Assurez-vous également que votre version oauth est toujours 1.0. 

Voici mon code permettant d'extraire toutes les données utilisateur de 'utilisateurs/show' avec un utilisateur nouvellement authentifié et de renvoyer le nom complet de l'utilisateur et son icône d'utilisateur avec 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);

Le code suivant est alors dans la redirection après authentification et demande de jeton

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

Il m'a fallu beaucoup de temps pour comprendre celui-ci. J'espère que cela aide quelqu'un !!

7
Dante Cullari

L'URL avec /1.1/ est correct, il s'agit de la nouvelle API Twitter de la version 1.1.

Mais vous avez besoin d'une application et autorisez votre application (et l'utilisateur) à l'aide de oAuth.

Plus d'informations à ce sujet sur le site de documentation pour développeurs de Twitter :)

5
spiele_r

UPDATE: L'API 1 de Twitter est maintenant obsolète. Reportez-vous à la réponse ci-dessus.

Twitter 1.1 ne fonctionne pas avec cette syntaxe (quand j'ai écrit cette réponse). Doit être 1, pas 1.1. Cela fonctionnera:

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

5
christopher

La réponse de Gruik a fonctionné pour moi dans le fil de discussion ci-dessous.

{Extrait | Zend_Service_Twitter - Rendre l'API v1.1 prête }

avec ZF 1.12.3, la solution de contournement consiste à passer les options consumerKey et consumerSecret dans l'option oauthOptions et non directement dans les options.

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

Après deux jours de recherche, j'ai finalement trouvé que pour accéder à d'autres personnes. sur les tweets publics, vous avez simplement besoin des informations d’identification de l’application n’importe laquelle, et non de celles des utilisateurs en particulier. Donc, si vous vous développez pour un client, vous n'avez rien à lui demander.

Pour utiliser la nouvelle API Twitter Twitter 1.1, vous avez besoin de deux choses:

Tout d'abord, vous pouvez (réellement avoir à) créer une application avec vos propres informations d'identification, puis obtenir le jeton d'accès (OAUTH_TOKEN) et secret du jeton d'accès (OAUTH_TOKEN_SECRET) auprès du Section "Votre jeton d'accès" . Ensuite, vous les fournissez dans le constructeur du nouvel objet TwitterOAuth. Vous pouvez désormais accéder aux tweets publics any.

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

En fait, je pense que c'est ce que Pavel a également suggéré, mais cela ne ressort pas si clairement de sa réponse.

J'espère que cela sauvera quelqu'un d'autre ces deux jours :)

3
nobug

Cela pourrait aider quelqu'un qui utilise Zend_Oauth_Client à travailler avec Twitter api. Cette configuration de travail:

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

Il semble que Twitter api 1.0 autorise les versions 1.1 et 1.0 d’auth, alors que Twitter api 1.1 exige seulement que la version d’auth soit 1.0.

P.S Nous n'utilisons pas Zend_Service_Twitter car il ne permet pas d'envoyer des paramètres personnalisés lors de la mise à jour du statut. 

2
Maksim Kotlyar

Vous devez envoyer customerKey et 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)
));
2
Juan de Parras

Assurez-vous que vous avez un accès en lecture ET écriture pour une application sur Twitter.

0
Victor

Je faisais toujours face au même problème. La seule solution que je connaisse consiste à saisir CONSUMER_KEY et CONSUMER_SECRET directement dans la nouvelle définition de classe TwitterOAuth.

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

N'utilisez pas de variable ou de statique à ce sujet et voyez si le problème est résolu.

0
Salem

Ici, tout le monde doit d'abord utiliser oauth2/token api puis utiliser followers/list api.
Sinon, vous obtiendrez cette erreur. Parce que les suiveurs/listes api nécessitent une authentification. 

Dans Swift (pour application mobile), j'ai également le même problème.

Si vous voulez connaître les api et leurs paramètres suivez ce lien, Obtenir la liste d'amis Twitter en swift?

0
iOS

J'utilise HybridAuth et je rencontrais cette erreur en se connectant à Twitter. Je suis parvenu à l'envoyer à moi en envoyant à Twitter un type de requête mal récupéré (get/post au lieu de GET/POST).

Cela provoquerait un 215:

$call = '/search/tweets.json';
$call_type = 'get';
$call_args = array(
    'q'           => 'pancakes',
    'count'       => 5,
);
$response = $provider_api->api( $call, $call_type, $call_args );

Ce ne serait pas:

$call = '/search/tweets.json';
$call_type = 'GET';
$call_args = array(
    'q'           => 'pancakes',
    'count'       => 5,
);
$response = $provider_api->api( $call, $call_type, $call_args );

Remarque secondaire: Dans le cas de HybridAuth, les éléments suivants ne le seraient pas non plus (car HA fournit en interne la valeur correctement mise en casse pour le type de demande):

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