wake-up-neo.net

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

Ich versuche, der API von Twitter zu folgen, 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

Ich bekomme diese Fehlermeldung als Antwort.

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

Ich kann anscheinend keine Dokumentation zu diesem Fehlercode finden. Hat jemand eine Ahnung von diesem Fehler?

106
Dip Dhingani

Ein sehr prägnanter Code ohne jede andere PHP-Datei enthält oauth etc .. Bitte beachten Sie, um folgende Schlüssel zu erhalten, müssen Sie sich mit https://dev.Twitter.com anmelden und eine Anwendung erstellen.

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

23
A Bright Worker

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

  • Erstellen Sie eine Anwendung in Twitter Developer Panel
  • Autorisieren Sie den Benutzer mit Ihrer Anwendung (oder Ihrer Anwendung im Benutzerkonto) und speichern Sie "oauth_token" und "oauth_token_secret", die Twitter Ihnen gibt. Verwenden Sie dazu TwitterOAuth library, es ist ziemlich einfach, siehe Beispiele, die mit Library geliefert werden.
  • Mit diesen Token können Sie authentifizierte Anforderungen für den Benutzer erstellen. Sie können es 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 wird die Liste der Freunde des Benutzers angezeigt.

11
Pavel

EINE LÖSUNG GEFUNDEN - mit 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, um alle Benutzerdaten von 'Benutzer/Show' mit einem neu authentifizierten Benutzer abzurufen und den vollständigen Benutzernamen und das Benutzersymbol mit 1.1 zurückzugeben - 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 Token-Anforderung

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

7
Dante Cullari

Die URL mit /1.1/ ist korrekt, es handelt sich um die neue Twitter API Version 1.1.

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

Lesen Sie mehr dazu auf der Twitter Developers-Dokumentationsseite :)

5
spiele_r

UPDATE: Die Twitter-API 1 ist nun veraltet. Siehe obige Antwort.

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

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

5
christopher

Die Antwort von Gruik hat für mich im untenstehenden Thread gearbeitet.

{Auszug | Zend_Service_Twitter - API v1.1 vorbereiten }

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

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

Nach zwei Tagen Recherche habe ich endlich gefunden, dass man z. Für öffentliche Tweets benötigen Sie nur any - Anmeldeinformationen, nicht jedoch bestimmte Benutzer. Wenn Sie also für einen Kunden entwickeln, müssen Sie ihn nicht um etwas bitten.

Um die neue Twitter API 1.1 zu verwenden, benötigen Sie zwei Dinge:

Zuerst können Sie (müssen) tatsächlich eine Anwendung mit Ihren eigenen - Anmeldeinformationen erstellen und dann das Access-Token (OAUTH_TOKEN) und das Access-Token-Geheimnis (OAUTH_TOKEN_SECRET) abrufen Abschnitt "Ihr Zugriffstoken" . Dann geben Sie sie im Konstruktor für das neue TwitterOAuth-Objekt an. Jetzt können Sie auf any öffentliche 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 auch vorgeschlagen hat, aber es ist nicht so offensichtlich aus seiner Antwort.

Hoffe, das rettet jemand diese zwei Tage :)

3
nobug

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 würde Twitter api 1.0 die oauth-Version auf 1.1 und 1.0 setzen, wobei Twitter api 1.1 nur die oauth-Version von 1.0 erfordert.

P.S Wir verwenden Zend_Service_Twitter nicht, da bei der Statusaktualisierung keine benutzerdefinierten Parameter gesendet werden dürfen. 

2
Maksim Kotlyar

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
Juan de Parras

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

0
Victor

Ich stand ständig vor dem gleichen Problem. Die einzige Lösung, die ich herausfinde, ist, CONSUMER_KEY und CONSUMER_SECRET direkt in die neue TwitterOAuth-Klassendefinition einzugeben.

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

Verwenden Sie keine Variablen oder Statiken und sehen Sie, ob das Problem nachlässt.

0
Salem

Hier muss zunächst jeder oauth2/token api und dann followers/list api verwenden.
Andernfalls erhalten Sie diese Fehlermeldung. Weil Anhänger/Liste API eine Authentifizierung erfordern. 

In Swift (für mobile App) bekam ich auch das gleiche Problem.

Wenn Sie wissen möchten, welche API's und welche Parameter es gibt, folgen Sie diesem Link: Get Twitter-Freundesliste in Kürze?

0
iOS

Ich verwende HybridAuth und stieß auf diesen Fehler bei der Verbindung mit Twitter. Ich habe es aufgespürt, um (mir) einen falsch geschriebenen Anforderungstyp an Twitter zu senden (get/post statt 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 );

Randbemerkung: Im Falle von HybridAuth würde Folgendes auch nicht gelten (da HA intern den richtig geschriebenen 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
Skrivener