L'API di Twitter restituisce l'errore 215, Dati di autenticazione non validi


110

Sto cercando di chiamare seguendo l'API di Twitter per ottenere un elenco di follower per un utente.

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

E ricevo questo messaggio di errore in risposta.

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

Non riesco a trovare la documentazione relativa a questo codice di errore. Qualcuno ha idea di questo errore?


2
Molti di noi sono sulla stessa barca. Sei riuscito a risolvere questo problema? Mi piacerebbe vedere una soluzione per 1.1 poiché 1.0 è stato deprecato.
RCNeil

1
Purtroppo non sono ancora riuscito a trovare una soluzione adeguata. Per ora sto lavorando alla versione 1. Ma lo posterò sicuramente qui quando lo farò. E se lo ottieni prima, per favore condividi ...
Immergi Dhingani il

1
Qualcuno ha notato sullo strumento Twitter oauth che un URL viene generato con "/1.1", ma il comando cURL dice "oauth_version = 1.0"? dev.twitter.com/apps/XXXXXX/oauth?nid=10364
systemblogger

1
@systemblogger Beh, la versione OAuth e la versione dell'API Twitter non sono la stessa cosa. Per quanto riguarda OAuth, ci sono 1.0 e 2.0 atm e sono contento che Twitter utilizzi ancora 1.0.
Vlasec

Qui prima tutti devono usare oauth2 / token api, quindi utilizzare followers / list api. Altrimenti otterrai questo errore. Perché follower / list api richiede l'autenticazione. In Swift segui questo link, stackoverflow.com/questions/12053159/…
iOS

Risposte:


26

Un codice molto conciso senza nessun altro file php che includa oauth ecc. Nota per ottenere le seguenti chiavi è necessario registrarsi su https://dev.twitter.com e creare l'applicazione.

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

?>

Saluti


Funziona a causa di "CURLOPT_SSL_VERIFYPEER = false". Abbiamo scoperto che è un errore di verifica del certificato SSL cURL, che fa sì che la libreria di Twitter restituisca sempre una risposta vuota.
lubosdz

11

L'unica soluzione che ho trovato finora è:

  • Crea l'applicazione nel pannello degli sviluppatori di Twitter
  • Autorizza l'utente con la tua applicazione (o la tua applicazione nell'account utente) e salva "oauth_token" e "oauth_token_secret" che Twitter ti fornisce. Uso libreria TwitterOAuth per questo, è abbastanza facile, guarda gli esempi forniti con la libreria.
  • Utilizzando questi token è possibile effettuare richieste autenticate per conto dell'utente. Puoi farlo con la stessa libreria.

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

Questo ti restituirà l'elenco degli amici dell'utente.


7

TROVATO UNA SOLUZIONE - utilizzando la libreria Abraham TwitterOAuth . Se stai usando un'implementazione precedente, le seguenti righe dovrebbero essere aggiunte dopo l'istanza del nuovo oggetto TwitterOAuth:

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

Le prime 2 righe sono ora documentate nel file Readme della libreria Abraham, ma la terza non lo è. Assicurati anche che la tua oauth_version sia ancora 1.0.

Ecco il mio codice per ottenere tutti i dati utente da 'users / show' con un utente appena autenticato e restituire il nome completo dell'utente e l'icona dell'utente con 1.1 - il seguente codice è implementato nel file di callback di autenticazione:

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

Il codice seguente è quindi nel reindirizzamento dopo l'autenticazione e la richiesta del token

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

Mi ci è voluto troppo tempo per capire questo. Spero che questo aiuti qualcuno !!


5

L'URL con /1.1/dentro è corretto, è la nuova versione 1.1 dell'API di Twitter.

Ma hai bisogno di un'applicazione e autorizza la tua applicazione (e l'utente) utilizzando oAuth.

Maggiori informazioni su questo argomento sul sito di documentazione degli sviluppatori di Twitter :)


141
Fare riferimento a un sito di documentazione non risponde realmente alla domanda.
moluv00

4
@ moluv00 OP ha detto: "Non riesco a trovare la documentazione relativa a questo codice di errore."
strangerstudios

4
Perché hai pubblicato un link generale. Questa non è una risposta.
Brice Favre

5

La risposta di Gruik ha funzionato per me nel thread sottostante.

{Estratto | Zend_Service_Twitter - Rendi pronta l'API v1.1 }

con ZF 1.12.3 la soluzione è passare consumerKey e consumerSecret nell'opzione oauthOptions, non direttamente nelle opzioni.

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

5

AGGIORNAMENTO: l' API 1 di Twitter è ora deprecata. Fare riferimento alla risposta sopra.

Twitter 1.1 non funziona con quella sintassi (quando ho scritto questa risposta). Deve essere 1, non 1.1. Questo funzionerà:

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


3
Sì, è corretto. Ma questo perché la documentazione di Twitter mi ha suggerito di farlo. ( dev.twitter.com/docs/api/1/get/followers/ids ). Hanno detto che la versione 1 è deprecata e devo passare alla 1.1. La versione 1 funziona sicuramente per questo servizio web. Ma ero confuso perché 1.1 non funziona per me?
Dip Dhingani

7
La versione 1 sarà deprecata entro 6 mesi a partire da marzo 2013, quindi sceglierei la versione 1.1
K. Weber

Testando diverse librerie OAuth, mi attengo a Twitter Async , cambiando questa riga protected $apiVersion = '1.1';nel file EpiTwitter.php funziona bene per la versione 1.1 dell'API di Twitter
K. Weber

2
Twitter API 1 è deprecata
qasimzee

4
L'API REST di Twitter v1 non è più attiva. Migrare all'API v1.1. dev.twitter.com/docs/api/1.1/overview .
itsazzad

3

Dopo due giorni di ricerca ho finalmente scoperto che per accedere a tweet così pubblici è sufficiente avere le credenziali dell'applicazione, e non quelle particolari dell'utente. Quindi, se stai sviluppando per un cliente, non devi chiedergli di fare nulla.

Per utilizzare la nuova API Twitter 1.1 sono necessarie due cose:

Innanzitutto, puoi (effettivamente devi) creare un'applicazione con le tue credenziali e quindi ottenere il token di accesso (OAUTH_TOKEN) e il token di accesso segreto (OAUTH_TOKEN_SECRET) dalla sezione " Il tuo token di accesso ". Quindi fornirli nel costruttore per il nuovo oggetto TwitterOAuth. Ora puoi accedere ai tweet pubblici di chiunque .

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

In realtà penso che questo sia ciò che ha suggerito anche Pavel , ma non è così ovvio dalla sua risposta.

Spero che questo salvi qualcun altro quei due giorni :)


2

Devi inviare customerKey e customerSecret a 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

Questo potrebbe aiutare qualcuno che usa Zend_Oauth_Client a lavorare con l'API di Twitter. Questa configurazione funzionante:

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

Sembra che twitter api 1.0 consenta alla versione oauth di essere 1.1 e 1.0, mentre twitter api 1.1 richiede che solo la versione oauth sia 1.0.

PS Non utilizziamo Zend_Service_Twitter in quanto non consente l'invio di parametri personalizzati sull'aggiornamento dello stato.


0

Assicurati di avere accesso in lettura e scrittura per l'applicazione su Twitter


0

Sto usando HybridAuth e questo errore durante la connessione a Twitter. L'ho rintracciato (io) inviando a Twitter un tipo di richiesta non corretto (get / post invece di GET / POST).

Ciò causerebbe 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 );

Questo non:

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

Nota a margine: nel caso di HybridAuth, anche quanto segue non lo sarebbe (poiché HA fornisce internamente il valore con maiuscole e minuscole per il tipo di richiesta):

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

0

Ho dovuto affrontare lo stesso problema tutto il tempo, l'unica soluzione che immagino è scrivere CONSUMER_KEYe CONSUMER_SECRETdirettamente alla nuova definizione della classe TwitterOAuth.

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

Non utilizzare variabili o statiche su questo e vedere se il problema si è risolto.


0

Qui prima tutti devono usare oauth2 / token api, quindi utilizzare followers / list api .
Altrimenti otterrai questo errore. Perché follower / list api richiede l'autenticazione.

In swift (per app mobile) anche io ho avuto lo stesso problema.

Se vuoi conoscere le API ei suoi parametri segui questo link, Ottieni l'elenco degli amici di Twitter in modo rapido?


-1

So che questo è vecchio ma ieri ho affrontato lo stesso problema quando ho chiamato questo URL utilizzando C # e la classe HttpClient con il token di autenticazione Bearer:

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

Si scopre che la soluzione per me era usare HTTPS invece di HTTP. Quindi il mio URL sarebbe simile a questo:

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

Quindi ecco uno snippet del mio codice:

            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
                }
            }

1
{"errors":[{"message":"Bad Authentication data","code":215}]}
sto

@tq: Guardate questa risposta: stackoverflow.com/questions/12684765/...
alejosoft

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.