L'API Twitter renvoie l'erreur 215, mauvaises données d'authentification

110

J'essaie d'appeler l'API de Twitter 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?

Dip Dhingani
la source
2
Nous sommes nombreux à être dans le même bateau. Avez-vous pu résoudre ce problème? J'adorerais voir une solution pour 1.1 puisque la 1.0 est obsolète.
RCNeil
1
Malheureusement, je n'ai toujours pas été en mesure de trouver une solution appropriée. Je travaille sur la version 1 pour le moment. Mais je le posterai certainement ici quand je le ferai. Et si vous l'obtenez avant cela, n'hésitez pas à partager ...
Dip Dhingani
1
Quelqu'un a-t-il remarqué sur l'outil Twitter oauth qu'une URL est générée avec "/1.1", mais la commande cURL dit "oauth_version = 1.0"? dev.twitter.com/apps/XXXXXX/oauth?nid=10364
systemblogger
1
@systemblogger Eh bien, la version OAuth et la version de l'API Twitter ne sont pas la même chose. Quant à OAuth, il y a 1.0 et 2.0 atm, et je suis heureux que Twitter utilise toujours 1.0.
Vlasec
Ici, tout le monde doit d'abord utiliser oauth2 / token api, puis utiliser followers / list api. Sinon, vous obtiendrez cette erreur. Parce que l'API followers / list nécessite une authentification. Dans Swift, suivez ce lien, stackoverflow.com/questions/12053159/…
iOS

Réponses:

26

Un code très concis sans aucun autre fichier php incluant 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

Un travailleur brillant
la source
Cela fonctionne à cause de "CURLOPT_SSL_VERIFYPEER = false". Nous avons constaté qu'il s'agit d'une erreur de vérification de certificat SSL cURL, qui fait que la bibliothèque Twitter renvoie toujours une réponse vide.
lubosdz
11

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

  • Créer une application dans le panneau des développeurs Twitter
  • Autorisez l'utilisateur avec votre application (ou votre application dans le compte utilisateur) et enregistrez "oauth_token" et "oauth_token_secret" que Twitter vous donne. Utilisez la bibliothèque TwitterOAuth pour cela, c'est assez facile, voir les exemples fournis avec la bibliothèque.
  • En utilisant ces jetons, vous pouvez effectuer des demandes authentifiées au nom 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 renverra la liste des amis de l'utilisateur.

Pavel
la source
7

TROUVE 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 2 premières lignes sont maintenant documentées dans le fichier Readme de la bibliothèque Abraham, mais la troisième ne l'est pas. Assurez-vous également que votre oauth_version est toujours 1.0.

Voici mon code pour obtenir toutes les données utilisateur de `` users / show '' avec un utilisateur nouvellement authentifié et renvoyer le nom complet de l'utilisateur et l'icône de l'utilisateur avec 1.1 - le code suivant est implémenté dans le fichier de rappel d'authentification:

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 l'authentification et la 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 trop de temps pour comprendre celui-ci. J'espère que cela aide quelqu'un !!

Dante Cullari
la source
5

L'url qui /1.1/s'y trouve est correcte, il s'agit de la nouvelle version 1.1 de l'API Twitter.

Mais vous avez besoin d'une application et autorisez votre application (et l'utilisateur) en utilisant oAuth.

En savoir plus à ce sujet sur le site de documentation Twitter Developers :)

spiele_r
la source
141
Référencer un site de documentation ne répond pas vraiment à la question.
moluv00
4
@ moluv00 OP a déclaré: "Je n'arrive pas à trouver la documentation relative à ce code d'erreur."
strangerstudios
4
Pourquoi avez-vous publié un lien général. Ceci n'est pas une réponse.
Brice Favre
5

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

{Extrait | Zend_Service_Twitter - Préparez l'API v1.1 }

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

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

MISE À JOUR: l' API Twitter 1 est désormais obsolète. Reportez-vous à la réponse ci-dessus.

Twitter 1.1 ne fonctionne pas avec cette syntaxe (lorsque 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

christophe
la source
3
Ouais c'est correct. Mais c'est parce que la documentation de Twitter m'a suggéré de le faire. ( dev.twitter.com/docs/api/1/get/followers/ids ). Ils ont dit que la version 1 est obsolète et que je dois passer à la version 1.1. La version 1 fonctionne à coup sûr pour ce service Web. Mais j'étais confus pourquoi 1.1 ne fonctionne pas pour moi?
Dip Dhingani
7
La version 1 sera obsolète dans 6 mois à compter de mars 2013, donc j'opterais pour la version 1.1
K. Weber
Tester différentes bibliothèques OAuth Je m'en tiens à Twitter Async , il suffit de changer cette ligne protected $apiVersion = '1.1';dans le fichier EpiTwitter.php fonctionne très bien pour l'API Twitter version 1.1
K. Weber
2
Twitter API 1 est obsolète
qasimzee
4
L'API REST Twitter v1 n'est plus active. Veuillez migrer vers l'API v1.1. dev.twitter.com/docs/api/1.1/overview .
itsazzad
3

Après deux jours de recherche, j'ai finalement trouvé que pour accéder à des tweets aussi publics, vous avez juste besoin des informations d'identification de l'application, et non de celles de l'utilisateur en particulier. Donc, si vous développez pour un client, vous n'avez pas à lui demander de faire quoi que ce soit.

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

Tout d'abord, vous pouvez (en fait devoir) créer une application avec vos propres informations d'identification, puis obtenir le jeton d'accès (OAUTH_TOKEN) et le secret de jeton d'accès (OAUTH_TOKEN_SECRET) dans la 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 de n'importe qui .

$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 aussi ce que Pavel a suggéré, mais ce n'est pas si évident d'après sa réponse.

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

nobug
la source
2

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)
));
Juan de Parras
la source
2

Cela pourrait aider quelqu'un qui utilise Zend_Oauth_Client à travailler avec l'API Twitter. 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 la version oauth à être 1.1 et 1.0, alors que l'api twitter 1.1 nécessite que la version oauth soit 1.0.

PS 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.

Maksim Kotlyar
la source
0

Assurez-vous que vous disposez d'un accès en lecture ET en écriture pour l'application dans Twitter

Victor
la source
0

J'utilise HybridAuth et cette erreur de connexion à Twitter. Je l'ai suivi jusqu'à (moi) envoyer à Twitter un type de demande incorrectement casse (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: dans le cas d'HybridAuth, les éléments suivants ne le seraient pas non plus (car HA fournit en interne la valeur correctement casée pour le type de demande):

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

J'étais confronté au même problème tout le temps, la seule solution que je trouve est de taper CONSUMER_KEYet CONSUMER_SECRETdirectement à 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 a été résolu.

Salem
la source
0

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

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

Si vous voulez connaître l'API et ses paramètres, suivez ce lien, Obtenez la liste d'amis Twitter en un rien de temps?

iOS
la source
-1

Je sais que c'est vieux, mais hier, j'ai rencontré le même problème lors de l'appel de cette URL en utilisant C # et la classe HttpClient avec le jeton d'authentification Bearer:

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

Il s'avère que la solution pour moi était d'utiliser HTTPS au lieu de HTTP. Donc mon URL ressemblerait à ceci:

https : //api.twitter.com/1.1/followers/ids.json? cursor = -1 & screen_name = nom d'utilisateur

Voici donc un extrait de mon code:

            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
                }
            }
Alejosoft
la source
1
im getting{"errors":[{"message":"Bad Authentication data","code":215}]}
tq
@tq: Regardez cette réponse: stackoverflow.com/questions/12684765/…
alejosoft
-1

Essayez cet explorateur d'API Twitter , vous pouvez vous connecter en tant que développeur et interroger ce que vous voulez.

ethanjyx
la source