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?
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("&","&",$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
La seule solution que j'ai trouvée jusqu'à présent est:
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.
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 !!
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 :)
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
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' => /*...*/,
)
);
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 :)
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.
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)
));
Assurez-vous que vous avez un accès en lecture ET écriture pour une application sur Twitter.
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.
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?
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 );