Die Twitter-API gibt den Fehler 215, Ungültige Authentifizierungsdaten, zurück


110

Ich versuche, die folgende Twitter-API aufzurufen, um eine Liste der Follower für einen Benutzer zu erhalten.

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

Und ich erhalte diese Fehlermeldung als Antwort.

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

Ich kann die Dokumentation zu diesem Fehlercode nicht finden. Hat jemand eine Idee zu diesem Fehler?


2
Viele von uns sitzen im selben Boot. Konnten Sie das lösen? Ich würde gerne eine Lösung für 1.1 sehen, da 1.0 veraltet ist.
RCNeil

1
Leider konnte ich immer noch keine passende Lösung finden. Ich arbeite gerade an Version 1. Aber ich werde es definitiv hier posten, wenn ich es tue. Und wenn Sie es vorher bekommen, teilen Sie bitte ...
Dip Dhingani

1
Hat jemand auf dem Twitter-Tool oauth bemerkt, dass eine URL mit "/1.1" generiert wird, der Befehl cURL jedoch "oauth_version = 1.0" lautet? dev.twitter.com/apps/XXXXXX/oauth?nid=10364
Systemblogger

1
@systemblogger Nun, OAuth-Version und Twitter-API-Version sind nicht dasselbe. Was OAuth betrifft, gibt es 1,0 und 2,0 atm, und ich bin froh, dass Twitter immer noch 1,0 verwendet.
Vlasec

Hier muss zuerst jeder oauth2 / token api verwenden, dann Follower / list api. Andernfalls erhalten Sie diesen Fehler. Weil Follower / Listen-API eine Authentifizierung erfordert. In Swift folgen Sie diesem Link, stackoverflow.com/questions/12053159/…
iOS

Antworten:


25

Ein sehr prägnanter Code ohne andere PHP-Datei enthält oauth usw. Bitte beachten Sie, dass Sie sich bei https://dev.twitter.com anmelden und eine Anwendung erstellen müssen, um die folgenden Schlüssel zu erhalten .

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

?>

Grüße


Dies funktioniert aufgrund von "CURLOPT_SSL_VERIFYPEER = false". Wir haben festgestellt, dass es ein Fehler bei der Überprüfung des cURL-SSL-Zertifikats ist, der dazu führt, dass die Twitter-Bibliothek immer eine leere Antwort zurückgibt.
Lubosdz

11

Die einzige Lösung, die ich bisher gefunden habe, ist:

  • Erstellen Sie eine Anwendung im Twitter-Entwicklerfenster
  • Autorisieren Sie den Benutzer mit Ihrer Anwendung (oder Ihrer Anwendung im Benutzerkonto) und speichern Sie "oauth_token" und "oauth_token_secret", die Sie von Twitter erhalten. Verwenden Sie dazu die TwitterOAuth- Bibliothek. Dies ist ziemlich einfach. Beispiele finden Sie in der Bibliothek.
  • Mit diesen Token können Sie authentifizierte Anfragen im Namen des Benutzers stellen. Sie können dies mit derselben Bibliothek tun.

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

Dadurch erhalten Sie eine Liste der Freunde des Benutzers.


7

GEFUNDENE LÖSUNG - mithilfe der Abraham TwitterOAuth-Bibliothek . Wenn Sie eine ältere Implementierung verwenden, sollten die folgenden Zeilen hinzugefügt werden, nachdem das neue TwitterOAuth-Objekt instanziiert wurde:

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

Die ersten beiden Zeilen sind jetzt in der Readme-Datei der Abraham-Bibliothek dokumentiert, die dritte jedoch nicht. Stellen Sie außerdem sicher, dass Ihre oauth_version immer noch 1.0 ist.

Hier ist mein Code zum Abrufen aller Benutzerdaten von 'users / show' mit einem neu authentifizierten Benutzer und zum Zurückgeben des vollständigen Benutzernamens und des Benutzersymbols mit 1.1 - der folgende Code ist in der Authentifizierungsrückrufdatei implementiert:

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

Der folgende Code befindet sich dann in der Umleitung nach Authentifizierung und Tokenanforderung

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

Ich habe viel zu lange gebraucht, um das herauszufinden. Hoffe das hilft jemandem !!


5

Die URL mit /1.1/darin ist korrekt, es ist die neue Twitter API Version 1.1.

Sie benötigen jedoch eine Anwendung und autorisieren Ihre Anwendung (und den Benutzer) mit oAuth.

Weitere Informationen hierzu finden Sie auf der Dokumentationsseite der Twitter-Entwickler :)


141
Das Verweisen auf eine Dokumentationsseite beantwortet die Frage nicht wirklich.
Moluv00

4
@ moluv00 OP sagte: "Ich kann die Dokumentation zu diesem Fehlercode nicht finden."
strangerstudios

4
Warum hast du einen allgemeinen Link gepostet? Dies ist keine Antwort.
Brice Favre

5

Die Antwort von Gruik hat für mich im folgenden Thread funktioniert.

{Auszug | Zend_Service_Twitter - API v1.1 bereit machen }

Mit ZF 1.12.3 besteht die Problemumgehung darin, consumerKey und consumerSecret in der Option oauthOptions zu übergeben, nicht direkt in den Optionen.

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

5

UPDATE: Twitter API 1 ist jetzt veraltet. Siehe obige Antwort.

Twitter 1.1 funktioniert nicht mit dieser Syntax (als ich diese Antwort schrieb). Muss 1 sein, nicht 1.1. Das wird funktionieren:

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


3
Ja das stimmt. Aber das liegt daran, dass mir die Dokumentation von Twitter vorgeschlagen hat, dies zu tun. ( dev.twitter.com/docs/api/1/get/followers/ids ). Sie sagten, dass Version 1 veraltet ist und ich zu 1.1 wechseln muss. Version 1 funktioniert mit Sicherheit für diesen Webdienst. Aber ich war verwirrt, warum 1.1 bei mir nicht funktioniert?
Dip Dhingani

7
Version 1 wird in 6 Monaten ab März 2013 veraltet sein, also würde ich mich für Version 1.1 entscheiden
K. Weber

Testen verschiedener OAuth-Bibliotheken Ich bleibe bei Twitter Async . Das Ändern dieser Zeile protected $apiVersion = '1.1';in der Datei EpiTwitter.php funktioniert gut für die Twitter-API-Version 1.1
K. Weber

2
Twitter API 1 ist veraltet
Qasimzee

4
Die Twitter REST API v1 ist nicht mehr aktiv. Bitte migrieren Sie zu API v1.1. dev.twitter.com/docs/api/1.1/overview .
Itsazzad

3

Nach zwei Tagen der Forschung fand ich schließlich , dass für den Zugriff so öffentliche Tweets Sie müssen nur alle Anwendungsberechtigungen, und nicht , dass bestimmte Benutzer diejenigen. Wenn Sie also für einen Kunden entwickeln, müssen Sie ihn nicht bitten, etwas zu tun.

Um die neue Twitter API 1.1 nutzen zu können, benötigen Sie zwei Dinge:

Zuerst können (müssen) Sie eine Anwendung mit Ihren eigenen Anmeldeinformationen erstellen und dann das Zugriffstoken (OAUTH_TOKEN) und das Zugriffstoken-Geheimnis (OAUTH_TOKEN_SECRET) aus dem Abschnitt " Ihr Zugriffstoken " abrufen . Anschließend geben Sie sie im Konstruktor für das neue TwitterOAuth-Objekt an. Jetzt können Sie auf alle öffentlichen Tweets zugreifen .

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

Eigentlich denke ich, dass Pavel dies auch vorgeschlagen hat, aber es ist aus seiner Antwort nicht so offensichtlich.

Hoffe das spart jemand anderem diese zwei Tage :)


2

Sie müssen customerKey und customerSecret an Zend_Service_Twitter senden

$twitter = new Zend_Service_Twitter(array(
                'consumerKey' => $this->consumer_key,
                'consumerSecret' => $this->consumer_secret,
                'username' => $user->screenName,
                'accessToken' => unserialize($user->token)
));

2

Dies könnte jemandem helfen, der Zend_Oauth_Client verwendet, um mit Twitter-API zu arbeiten. Diese funktionierende Konfiguration:

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

Es sieht so aus, als ob die Twitter-API 1.0 die oauth-Version 1.1 und 1.0 zulässt, während für die Twitter-API 1.1 nur die oauth-Version 1.0 erforderlich ist.

PS Wir verwenden Zend_Service_Twitter nicht, da keine benutzerdefinierten Parameter bei der Statusaktualisierung gesendet werden können.


0

Stellen Sie sicher, dass Sie Lese- und Schreibzugriff für die Anwendung in Twitter haben


0

Ich verwende HybridAuth und habe diesen Fehler beim Herstellen einer Verbindung zu Twitter festgestellt . Ich habe es aufgespürt, um (mir) Twitter einen falsch umschlossenen Anfragetyp zu senden (get / post anstelle von GET / POST).

Dies würde eine 215 verursachen:

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

Dies würde nicht:

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

Randnotiz: Im Fall von HybridAuth würde dies auch nicht der Fall sein (da HA intern den korrekt umhüllten Wert für den Anforderungstyp bereitstellt):

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

0

Ich hatte die ganze Zeit das gleiche Problem. Die einzige Lösung, die ich herausgefunden habe, ist das Tippen CONSUMER_KEYund die CONSUMER_SECRETdirekte Definition der neuen TwitterOAuth-Klasse.

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

Verwenden Sie hierfür keine Variablen oder Statiken und prüfen Sie, ob das Problem behoben wurde.


0

Hier muss zuerst jeder oauth2 / token api verwenden, dann Follower / list api .
Andernfalls erhalten Sie diesen Fehler. Weil Follower / Listen-API eine Authentifizierung erfordert.

In Swift (für Mobile App) habe ich auch das gleiche Problem bekommen.

Wenn Sie die APIs und ihre Parameter kennenlernen möchten, folgen Sie diesem Link. Holen Sie sich schnell eine Twitter-Freundesliste?


-1

Ich weiß, dass dies alt ist, aber gestern hatte ich das gleiche Problem, als ich diese URL mit C # und der HttpClient-Klasse mit dem Bearer-Authentifizierungstoken aufrief:

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

Es stellt sich heraus, dass die Lösung für mich darin bestand, HTTPS anstelle von HTTP zu verwenden. Meine URL würde also so aussehen:

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

Hier ist ein Ausschnitt aus meinem 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
                }
            }

1
im bekommen{"errors":[{"message":"Bad Authentication data","code":215}]}
tq

@tq: Sehen Sie sich diese Antwort an: stackoverflow.com/questions/12684765/…
alejosoft

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.