Twitter API, 215 hatası, Hatalı Kimlik Doğrulama Verileri döndürüyor


110

Bir kullanıcı için takipçi listesi almak için Twitter'ın API'sini takip etmeye çalışıyorum.

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

Ve yanıt olarak bu hata mesajını alıyorum.

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

Bu hata koduyla ilgili belgeleri bulamıyorum. Bu hata hakkında herhangi bir fikri olan var mı?


2
Çoğumuz aynı gemideyiz. Bunu çözebildin mi? 1.0 kullanımdan kaldırıldığı için 1.1 için bir çözüm görmeyi çok isterim.
RCNeil

1
Maalesef hala uygun bir çözüm bulamadım. Şimdilik sürüm 1 üzerinde çalışıyorum. Ama bunu yaptığımda kesinlikle buraya göndereceğim. Ve ondan önce alırsanız, lütfen paylaşın ...
Dip Dhingani

1
Twitter oauth aracında, içinde "/1.1" bulunan bir URL oluşturulduğunu ancak cURL komutunun "oauth_version = 1.0" dediğini fark eden oldu mu? dev.twitter.com/apps/XXXXXX/oauth?nid=10364
systemblogger

1
@systemblogger OAuth sürümü ve twitter API sürümü aynı şey değil. OAuth'a gelince, 1.0 ve 2.0 atm var ve Twitter'ın hala 1.0 kullanmasına sevindim.
Vlasec

Burada önce herkesin oauth2 / token api'yi, ardından follower / list api'yi kullanması gerekir. Aksi takdirde bu hatayı alırsınız. Çünkü follower / list api, Authentication gerektirir.
iOS

Yanıtlar:


26

Başka php dosyası olmadan çok özlü kodu ile kayıt gerekir aşağıdaki anahtarları elde etmek unutmayınız oauth vb dahil https://dev.twitter.com ve uygulama oluşturmak.

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

?>

Saygılarımızla


Bu, "CURLOPT_SSL_VERIFYPEER = false" nedeniyle çalışır. Twitter kitaplığının her zaman boş yanıt döndürmesine neden olan cURL SSL sertifikası doğrulama hatası olduğunu tespit ettik.
lubosdz

11

Şimdiye kadar bulduğum tek çözüm:

  • Twitter geliştirici panelinde uygulama oluştur
  • Kullanıcıyı uygulamanızla (veya kullanıcı hesabınızdaki uygulamanızla) yetkilendirin ve Twitter'ın size verdiği "oauth_token" ve "oauth_token_secret" i kaydedin. kullanımBunun için TwitterOAuth kitaplığını , oldukça kolaydır, kitaplıkla birlikte gelen örneklere bakın.
  • Bu belirteçleri kullanarak kullanıcı adına kimliği doğrulanmış isteklerde bulunabilirsiniz. Aynı kitaplıkla yapabilirsiniz.

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

Bu size kullanıcının arkadaş listesini döndürecektir.


7

BİR ÇÖZÜM BULDU - Abraham TwitterOAuth kütüphanesini kullanarak . Daha eski bir uygulama kullanıyorsanız, yeni TwitterOAuth nesnesi oluşturulduktan sonra aşağıdaki satırlar eklenmelidir:

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

İlk 2 satır şimdi Abraham kitaplığı Benioku dosyasında belgelenmiştir, ancak üçüncüsü değildir. Ayrıca oauth_version'ınızın hala 1.0 olduğundan emin olun.

Yeni kimliği doğrulanmış bir kullanıcıyla 'users / show'dan tüm kullanıcı verilerini almak ve 1.1 ile kullanıcının tam adını ve kullanıcı simgesini döndürmek için kodum - kimlik doğrulama geri arama dosyasında aşağıdaki kod uygulanır:

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

Aşağıdaki kod, kimlik doğrulama ve belirteç isteğinden sonra yeniden yönlendirmededir

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

Bunu anlamak çok uzun sürdü. Umarım bu birine yardımcı olur !!


5

/1.1/İçinde bulunan url doğru, yeni Twitter API Versiyon 1.1.

Ancak bir uygulamaya ihtiyacınız var ve uygulamanızı (ve kullanıcıyı) oAuth kullanarak yetkilendirmeniz gerekiyor.

Bununla ilgili daha fazla bilgiyi Twitter Developers dokümantasyon sitesinde okuyun :)


141
Bir dokümantasyon sitesine başvurmak soruyu gerçekten cevaplamaz.
moluv00

4
@ moluv00 OP dedi ki: "Bu hata koduyla ilgili dokümantasyonu bulamıyorum."
strangerstudios

4
Neden genel bir bağlantı gönderdiniz? Bu bir cevap değil.
Brice Favre

5

Gruik'in cevabı aşağıdaki başlıkta benim için çalıştı.

{Alıntı | Zend_Service_Twitter - API v1.1'i hazır hale getirin }

ZF 1.12.3 ile geçici çözüm, doğrudan seçeneklerde değil, oauthOptions seçeneğinde customerKey ve customerSecret'i geçirmektir.

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

5

GÜNCELLEME: Twitter API 1 artık kullanımdan kaldırılmıştır. Yukarıdaki cevaba bakın.

Twitter 1.1 bu sözdizimiyle çalışmıyor (bu cevabı yazdığımda). 1.1 değil 1 olmalı. Bu çalışacak:

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


3
Evet bu doğru. Ancak bunun nedeni Twitter'ın Belgeleri'nin bana bunu yapmamı önermesiydi. ( dev.twitter.com/docs/api/1/get/followers/ids ). Sürüm 1'in kullanımdan kaldırıldığını ve 1.1'e geçmem gerektiğini söylediler. Sürüm 1 kesinlikle bu web hizmeti için çalışıyor. Ama 1.1 neden benim için çalışmıyor kafam karışmıştı?
Dip Dhingani

7
Sürüm 1, Mart 2013'ten itibaren 6 ay sonra kullanımdan kaldırılacak, bu yüzden 1.1
K. Weber

Farklı OAuth kitaplıklarını test ediyorum Twitterprotected $apiVersion = '1.1'; Async'e sadık kaldım , sadece EpiTwitter.php dosyasındaki bu satırı değiştirmek , Twitter API sürüm 1.1
K. Weber

2
Twitter API 1 kullanımdan kaldırıldı
qasimzee

4
Twitter REST API v1 artık aktif değil. Lütfen API v1.1'e geçiş yapın. dev.twitter.com/docs/api/1.1/overview .
itsazzad

3

İki günlük bir araştırmadan sonra nihayet, herkese açık tweet'lere erişmek için yalnızca herhangi bir uygulama kimlik bilgisine ihtiyacınız olduğunu ve belirli kullanıcı bilgilerine ihtiyacınız olmadığını öğrendim . Dolayısıyla, bir müşteri için geliştiriyorsanız, onlardan hiçbir şey yapmalarını istemeniz gerekmez.

Yeni Twitter API 1.1'i kullanmak için iki şeye ihtiyacınız var:

İlk olarak, kendi kimlik bilgilerinizle bir uygulama oluşturabilir (aslında yapmanız gerekir) ve ardından " Erişim jetonunuz " bölümünden Erişim jetonunu (OAUTH_TOKEN) ve Erişim jetonunun sırrını (OAUTH_TOKEN_SECRET) alabilirsiniz . Ardından bunları yeni TwitterOAuth nesnesi için yapıcıda sağlarsınız. Artık herkese açık tweet'lere erişebilirsiniz .

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

Aslında, Pavel'in de önerdiği şeyin bu olduğunu düşünüyorum , ancak verdiği yanıt o kadar açık değil.

Umarım bu, o iki günde bir başkasını kurtarır :)


2

CustomerKey ve customerSecret'i Zend_Service_Twitter'e göndermeniz gerekiyor

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

2

Bu, twitter api ile çalışmak için Zend_Oauth_Client kullanan birine yardımcı olabilir. Bu çalışma yapılandırması:

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

Görünüşe göre twitter api 1.0, oauth sürümünün 1.1 ve 1.0 olmasına izin veriyor, twitter api 1.1 sadece oauth sürümünün 1.0 olmasını gerektiriyor.

Not: Durum güncellemesinde özel parametrelerin gönderilmesine izin vermediği için Zend_Service_Twitter kullanmıyoruz.


0

Twitter'da uygulama için okuma ve yazma erişiminiz olduğundan emin olun


0

HybridAuth kullanıyorum ve Twitter'a bağlanırken bu hatayla karşılaşıyordum. Twitter'a yanlış bir şekilde oluşturulan istek türünü (GET / POST yerine al / gönder) göndererek (bana) kadar takip ettim.

Bu 215'e neden olur:

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

Bu olmaz:

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

Yan not: HybridAuth durumunda aşağıdakiler de olmaz (çünkü HA dahili olarak istek türü için doğru harfli değeri sağlar):

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

0

Her zaman aynı sorunla karşılaşıyordum, bulduğum tek çözüm yazmak CONSUMER_KEYve CONSUMER_SECRETdoğrudan yeni TwitterOAuth sınıf tanımına başvurmaktı.

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

Bunda değişken veya statik kullanmayın ve sorunun çözülüp çözülmediğine bakın.


0

Burada önce herkesin oauth2 / token api'yi, ardından follower / list api'yi kullanması gerekir .
Aksi takdirde bu hatayı alırsınız. Çünkü follower / list api, Authentication gerektirir.

Swift'de (mobil uygulama için) ben de aynı sorunu yaşadım.

API ve parametrelerini öğrenmek istiyorsanız bu bağlantıyı takip edin, Twitter arkadaş listesini hızlıca alın?


-1

Bunun eski olduğunu biliyorum ama dün C # ve HttpClient sınıfını Taşıyıcı kimlik doğrulama belirteci kullanarak bu URL'yi çağırırken aynı sorunla karşılaştım:

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

Benim için çözümün HTTP yerine HTTPS kullanmak olduğu ortaya çıktı. Yani URL'm şöyle görünecektir:

https : //api.twitter.com/1.1/followers/ids.json? cursor = -1 & screen_name = kullanıcı adı

İşte kodumun bir parçası:

            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
alıyorum{"errors":[{"message":"Bad Authentication data","code":215}]}
tq


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.