API Twitter mengembalikan kesalahan 215, Data Otentikasi Buruk


110

Saya mencoba menelepon mengikuti API Twitter untuk mendapatkan daftar pengikut untuk pengguna.

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

Dan saya mendapatkan pesan kesalahan ini sebagai tanggapan.

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

Sepertinya saya tidak dapat menemukan dokumentasi yang terkait dengan kode kesalahan ini. Ada yang tahu tentang kesalahan ini?


2
Banyak dari kita berada di perahu yang sama. Apakah Anda dapat menyelesaikan ini? Saya ingin melihat solusi untuk 1.1 karena 1.0 sudah tidak digunakan lagi.
RCNeil

1
Sayangnya saya masih belum bisa menemukan solusi yang cocok. Saya sedang mengerjakan versi 1 untuk saat ini. Tapi saya pasti akan mempostingnya di sini ketika saya melakukannya. Dan jika Anda mendapatkannya sebelum itu, silakan berbagi ...
Dip Dhingani

1
Adakah yang memperhatikan pada alat oauth Twitter bahwa URL dibuat dengan "/1.1" di dalamnya, tetapi perintah cURL mengatakan "oauth_version = 1.0"? dev.twitter.com/apps/XXXXXX/oauth?nid=10364
systemblogger

1
@systemblogger Nah, versi OAuth dan versi Twitter API bukanlah hal yang sama. Untuk OAuth, ada 1.0 dan 2.0 atm, dan saya senang Twitter masih menggunakan 1.0.
Vlasec

Di sini pertama-tama setiap orang perlu menggunakan oauth2 / token api kemudian gunakan api pengikut / daftar. Jika tidak, Anda akan mendapatkan kesalahan ini. Karena follower / list api membutuhkan Authentication. Di Swift, ikuti tautan ini, stackoverflow.com/questions/12053159/…
iOS

Jawaban:


26

Kode yang sangat ringkas tanpa file php lain termasuk oauth dll. Harap diperhatikan untuk mendapatkan kunci berikut, Anda perlu mendaftar dengan https://dev.twitter.com dan membuat aplikasi.

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

?>

Salam


Ini berfungsi karena "CURLOPT_SSL_VERIFYPEER = false". Kami telah melacak bahwa itu adalah kesalahan verifikasi sertifikat cURL SSL, yang membuat perpustakaan Twitter selalu mengembalikan respons kosong.
lubosdz

11

Satu-satunya solusi yang saya temukan sejauh ini adalah:

  • Buat aplikasi di panel pengembang twitter
  • Otorisasi pengguna dengan aplikasi Anda (atau aplikasi Anda di akun pengguna) dan simpan "oauth_token" dan "oauth_token_secret" yang diberikan Twitter kepada Anda. Gunakan perpustakaan TwitterOAuth untuk ini, cukup mudah, lihat contoh yang disertakan dengan perpustakaan.
  • Dengan menggunakan token ini, Anda dapat membuat permintaan yang diautentikasi atas nama pengguna. Anda dapat melakukannya dengan perpustakaan yang sama.

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

Ini akan mengembalikan Anda daftar teman pengguna.


7

TEMUKAN SOLUSI - menggunakan pustaka TwitterOAuth Abraham . Jika Anda menggunakan implementasi yang lebih lama, baris berikut harus ditambahkan setelah objek TwitterOAuth baru dibuat:

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

2 baris pertama sekarang didokumentasikan dalam file Readme pustaka Abraham, tetapi yang ketiga tidak. Pastikan juga oauth_version Anda masih 1.0.

Berikut adalah kode saya untuk mendapatkan semua data pengguna dari 'users / show' dengan pengguna yang baru diautentikasi dan mengembalikan nama lengkap pengguna dan ikon pengguna dengan 1.1 - kode berikut diimplementasikan dalam file panggilan balik otentikasi:

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

Kode berikut kemudian di redirect setelah otentikasi dan permintaan 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/>';
}

Aku butuh waktu terlalu lama untuk memikirkan yang satu ini. Semoga ini bisa membantu seseorang !!


5

Url dengan /1.1/di dalamnya benar, itu adalah API Twitter Versi 1.1.

Tapi Anda membutuhkan aplikasi dan mengotorisasi aplikasi Anda (dan pengguna) menggunakan oAuth.

Baca lebih lanjut tentang ini di situs dokumentasi Pengembang Twitter :)


141
Merujuk situs dokumentasi tidak benar-benar menjawab pertanyaan itu.
moluv00

4
@ moluv00 OP berkata: "Sepertinya saya tidak dapat menemukan dokumentasi yang terkait dengan kode kesalahan ini."
strangerstudios

4
Mengapa Anda memposting tautan umum. Ini bukanlah jawaban.
Brice Favre

5

Jawaban dari Gruik berhasil untuk saya di utas di bawah ini.

{Kutipan | Zend_Service_Twitter - Siapkan API v1.1 }

dengan ZF 1.12.3 solusinya adalah dengan meneruskan consumerKey dan consumerSecret di opsi oauthOptions, bukan langsung di opsi.

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

5

PEMBARUAN: Twitter API 1 sekarang tidak digunakan lagi. Lihat jawaban di atas.

Twitter 1.1 tidak bekerja dengan sintaks itu (ketika saya menulis jawaban ini). Harus 1, bukan 1.1. Ini akan berhasil:

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


3
Ya itu benar. Tapi itu karena Dokumentasi Twitter menyarankan saya untuk melakukannya. ( dev.twitter.com/docs/api/1/get/followers/ids ). Mereka mengatakan bahwa versi 1 sudah usang dan saya harus pindah ke 1.1. Versi 1 bekerja dengan pasti untuk layanan web ini. Tetapi saya bingung mengapa 1.1 tidak berfungsi untuk saya?
Celupkan Dhingani

7
Versi 1 akan dihentikan dalam 6 bulan terhitung dari Maret 2013 jadi saya akan menggunakan versi 1.1
K.Weber

Menguji pustaka OAuth yang berbeda Saya tetap menggunakan Twitter Async , hanya mengubah baris ini protected $apiVersion = '1.1';di file EpiTwitter.php berfungsi dengan baik untuk API Twitter versi 1.1
K. Weber

2
Twitter API 1 sudah tidak digunakan lagi
qasimzee

4
Twitter REST API v1 tidak lagi aktif. Harap bermigrasi ke API v1.1. dev.twitter.com/docs/api/1.1/overview .
itsazzad

3

Setelah dua hari penelitian, saya akhirnya menemukan bahwa untuk mengakses tweet publik Anda hanya perlu kredensial aplikasi apa pun , dan bukan pengguna tertentu. Jadi, jika Anda mengembangkan untuk klien, Anda tidak perlu meminta mereka melakukan apa pun.

Untuk menggunakan API Twitter 1.1 baru, Anda memerlukan dua hal:

Pertama, Anda dapat (sebenarnya harus) membuat aplikasi dengan kredensial Anda sendiri dan kemudian mendapatkan token Akses (OAUTH_TOKEN) dan rahasia token Akses (OAUTH_TOKEN_SECRET) dari bagian " Token akses Anda ". Kemudian Anda memasukkannya ke dalam konstruktor untuk objek TwitterOAuth baru. Sekarang Anda dapat mengakses tweet publik siapa pun .

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

Sebenarnya saya pikir ini juga yang disarankan Pavel , tetapi tidak begitu jelas dari jawabannya.

Semoga ini menyelamatkan orang lain selama dua hari itu :)


2

Anda perlu mengirim customerKey dan customerSecret ke 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

Ini mungkin membantu seseorang yang menggunakan Zend_Oauth_Client untuk bekerja dengan api twitter. Konfigurasi yang berfungsi ini:

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

Sepertinya twitter api 1.0 memungkinkan versi oauth menjadi 1.1 dan 1.0, di mana twitter api 1.1 hanya membutuhkan versi oauth menjadi 1.0.

PS Kami tidak menggunakan Zend_Service_Twitter karena tidak mengizinkan mengirim parameter khusus pada pembaruan status.


0

Pastikan Anda memiliki akses baca DAN tulis untuk aplikasi di twitter


0

Saya menggunakan HybridAuth dan mengalami kesalahan ini saat menyambungkan ke Twitter. Saya melacaknya ke (saya) mengirim Twitter jenis permintaan yang salah ditempatkan (dapatkan / posting alih-alih GET / POST).

Ini akan menyebabkan 215:

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

Ini tidak akan:

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

Catatan tambahan: Dalam kasus HybridAuth, hal berikut ini juga tidak akan dilakukan (karena HA secara internal memberikan nilai yang ditempatkan dengan benar untuk jenis permintaan):

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

0

Saya menghadapi masalah yang sama sepanjang waktu, satu-satunya solusi yang saya pikirkan adalah mengetik CONSUMER_KEYdan CONSUMER_SECRETlangsung ke definisi kelas TwitterOAuth baru.

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

Jangan gunakan variabel atau statika dalam hal ini dan lihat apakah masalahnya terselesaikan.


0

Di sini pertama-tama setiap orang perlu menggunakan oauth2 / token api kemudian gunakan api pengikut / daftar .
Jika tidak, Anda akan mendapatkan kesalahan ini. Karena follower / list api membutuhkan Authentication.

Secara cepat (untuk aplikasi seluler) saya juga mendapat masalah yang sama.

Jika Anda ingin tahu api dan parameternya ikuti tautan ini, Dapatkan daftar teman twitter dengan cepat?


-1

Saya tahu ini sudah lama tetapi kemarin saya menghadapi masalah yang sama ketika memanggil URL ini menggunakan C # dan kelas HttpClient dengan token otentikasi Bearer:

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

Ternyata solusi bagi saya adalah menggunakan HTTPS, bukan HTTP. Jadi URL saya akan terlihat seperti ini:

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

Jadi inilah cuplikan kode saya:

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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.