API Twitter trả về lỗi 215, Dữ liệu xác thực không hợp lệ


110

Tôi đang cố gắng gọi theo API của Twitter để lấy danh sách người theo dõi cho người dùng.

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

Và tôi nhận được thông báo lỗi này để phản hồi.

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

Tôi dường như không thể tìm thấy tài liệu liên quan đến mã lỗi này. Bất cứ ai có bất kỳ ý tưởng về lỗi này?


2
Rất nhiều người trong chúng ta đang ở cùng một con thuyền. Bạn có thể giải quyết điều này không? Tôi muốn thấy một giải pháp cho 1.1 vì 1.0 không được dùng nữa.
RCNeil

1
Thật không may, tôi vẫn không thể tìm thấy một giải pháp phù hợp. Tôi đang làm việc trên phiên bản 1 ngay bây giờ. Nhưng tôi chắc chắn sẽ đăng nó ở đây khi tôi làm. Và nếu bạn nhận được nó trước đó, hãy làm phần ...
Nhúng Dhingani

1
Có ai nhận thấy trên công cụ oauth Twitter rằng một URL được tạo với "/1.1" trong đó, nhưng lệnh cURL cho biết "oauth_version = 1.0" không? dev.twitter.com/apps/XXXXXX/oauth?nid=10364
systemblogger

1
@systemblogger Chà, phiên bản OAuth và phiên bản API twitter không giống nhau. Đối với OAuth, có 1.0 và 2.0 atm, và tôi rất vui vì Twitter vẫn sử dụng 1.0.
Vlasec

Ở đây, đầu tiên mọi người cần sử dụng oauth2 / token api sau đó sử dụng foi người theo dõi / danh sách. Khôn ngoan khác bạn sẽ nhận được lỗi này. Bởi vì người theo dõi / api danh sách yêu cầu Xác thực. Trong Swift, hãy theo liên kết này, stackoverflow.com/questions/12053159/…
iOS

Câu trả lời:


26

Một mã rất ngắn gọn mà không có bất kỳ tệp php nào khác bao gồm oauth, v.v. Xin lưu ý để có được các khóa sau, bạn cần đăng ký với https://dev.twitter.com và tạo ứng dụng.

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

?>

Trân trọng


Điều này hoạt động vì "CURLOPT_SSL_VERIFYPEER = false". Chúng tôi đã tìm ra rằng đó là lỗi xác minh chứng chỉ SSL cURL khiến thư viện Twitter luôn trả về phản hồi trống.
lubosdz

11

Giải pháp duy nhất mà tôi tìm thấy cho đến nay là:

  • Tạo ứng dụng trong bảng nhà phát triển twitter
  • Cấp quyền cho người dùng bằng ứng dụng của bạn (hoặc ứng dụng của bạn trong tài khoản người dùng) và lưu "oauth_token" và "oauth_token_secret" mà Twitter cung cấp cho bạn. Sử dụng thư viện TwitterOAuth cho việc này, khá dễ dàng, hãy xem các ví dụ đi kèm với thư viện.
  • Sử dụng mã thông báo này, bạn có thể thực hiện các yêu cầu được xác thực thay mặt cho người dùng. Bạn có thể làm điều đó với cùng một thư viện.

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

Thao tác này sẽ trả về cho bạn danh sách bạn bè của người dùng.


7

TÌM HIỂU GIẢI PHÁP - sử dụng thư viện Abraham TwitterOAuth . Nếu bạn đang sử dụng triển khai cũ hơn, các dòng sau sẽ được thêm vào sau khi đối tượng TwitterOAuth mới được khởi tạo:

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

2 dòng đầu tiên hiện được ghi lại trong tệp Readme của thư viện Abraham, nhưng dòng thứ 3 thì không. Ngoài ra, hãy đảm bảo rằng oauth_version của bạn vẫn là 1,0.

Đây là mã của tôi để lấy tất cả dữ liệu người dùng từ 'người dùng / chương trình' với người dùng mới được xác thực và trả lại tên đầy đủ của người dùng và biểu tượng người dùng với 1.1 - mã sau được triển khai trong tệp gọi lại xác thực:

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

Sau đó, mã sau nằm trong chuyển hướng sau khi xác thực và yêu cầu mã thông báo

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

Tôi đã mất quá nhiều thời gian để tìm ra điều này. Hy vọng điều này sẽ giúp ai đó !!


5

Url có /1.1/trong đó là chính xác, nó là API Twitter mới Phiên bản 1.1.

Nhưng bạn cần một ứng dụng và ủy quyền cho ứng dụng của bạn (và người dùng) sử dụng oAuth.

Đọc thêm về điều này trên trang web tài liệu dành cho Nhà phát triển Twitter :)


141
Tham khảo một trang web tài liệu không thực sự trả lời câu hỏi.
moluv00

4
@ moluv00 OP cho biết: "Tôi dường như không thể tìm thấy tài liệu liên quan đến mã lỗi này."
strangerstudios

4
Tại sao bạn lại đăng một liên kết chung chung. Đây không phải là một câu trả lời.
Brice Favre

5

Câu trả lời của Gruik phù hợp với tôi trong chủ đề bên dưới.

{Trích đoạn | Zend_Service_Twitter - Chuẩn bị sẵn sàng cho API v1.1 }

với ZF 1.12.3, cách giải quyết là vượt qua tùy chọn ConsumerKey và ConsumerSecret trong oauthOptions, chứ không phải trực tiếp trong các tùy chọn.

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

5

CẬP NHẬT: API Twitter 1 hiện không được dùng nữa. Tham khảo câu trả lời trên.

Twitter 1.1 không hoạt động với cú pháp đó (khi tôi viết câu trả lời này). Cần phải là 1, không phải 1.1. Điều này sẽ hoạt động:

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


3
Vâng, đúng vậy. Nhưng đó là vì Tài liệu của Twitter đã gợi ý tôi làm như vậy. ( dev.twitter.com/docs/api/1/get/followers/ids ). Họ nói rằng phiên bản 1 không được dùng nữa và tôi cần chuyển sang 1.1. Phiên bản 1 hoạt động chắc chắn cho dịch vụ web này. Nhưng tôi đã bối rối tại sao 1.1 không hoạt động với tôi?
Dip Dhingani

7
Phiên bản 1 sẽ hết hạn vào 6 tháng, kể từ tháng 3 năm 2013 vì vậy tôi muốn đi cho phiên bản 1.1
K. Weber

Kiểm tra thư viện OAuth khác nhau tôi dính vào Twitter Async , chỉ cần thay đổi dòng này protected $apiVersion = '1.1';trong tập tin EpiTwitter.php hoạt động tốt cho Twitter phiên bản API 1.1
K. Weber

2
API Twitter 1 không được dùng nữa
qasimzee

4
Twitter REST API v1 không còn hoạt động. Vui lòng chuyển sang API v1.1. dev.twitter.com/docs/api/1.1/overview .
itazzad

3

Sau hai ngày nghiên cứu, tôi cuối cùng đã phát hiện ra rằng để truy cập các tweet công khai, bạn chỉ cần bất kỳ thông tin đăng nhập ứng dụng nào chứ không cần thông tin đăng nhập của người dùng cụ thể. Vì vậy, nếu bạn đang phát triển cho một khách hàng, bạn không cần phải yêu cầu họ làm bất cứ điều gì.

Để sử dụng Twitter API 1.1 mới, bạn cần hai điều:

Đầu tiên, bạn có thể (thực sự phải) tạo một ứng dụng bằng thông tin đăng nhập của riêng mình và sau đó nhận Mã thông báo truy cập (OAUTH_TOKEN) và bí mật Mã thông báo truy cập (OAUTH_TOKEN_SECRET) từ phần "Mã thông báo truy cập của bạn ". Sau đó, bạn cung cấp chúng trong phương thức khởi tạo cho đối tượng TwitterOAuth mới. Bây giờ bạn có thể truy cập bất kỳ tweet công khai nào.

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

Thực ra tôi nghĩ đây cũng là điều mà Pavel đã gợi ý, nhưng câu trả lời của anh ấy không quá rõ ràng.

Hy vọng điều này sẽ cứu ai đó khác trong hai ngày đó :)


2

Bạn cần gửi customerKeycustomerSecret tới 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

Điều này có thể giúp những người sử dụng Zend_Oauth_Client làm việc với twitter api. Cấu hình hoạt động này:

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

Có vẻ như twitter api 1.0 cho phép phiên bản oauth là 1.1 và 1.0, trong đó twitter api 1.1 chỉ yêu cầu phiên bản oauth là 1.0.

PS Chúng tôi không sử dụng Zend_Service_Twitter vì nó không cho phép gửi các thông số tùy chỉnh khi cập nhật trạng thái.


0

Đảm bảo rằng bạn có quyền đọc VÀ ghi cho ứng dụng trong twitter


0

Tôi đang sử dụng HybridAuth và gặp phải lỗi này khi kết nối với Twitter. Tôi đã theo dõi nó khi (tôi) gửi cho Twitter một loại yêu cầu được viết không chính xác (nhận / đăng thay vì GET / POST).

Điều này sẽ gây ra một 215:

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

Điều này sẽ không:

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

Lưu ý phụ: Trong trường hợp HybridAuth, điều sau cũng sẽ không (vì HA nội bộ cung cấp giá trị được viết đúng cho loại yêu cầu):

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

0

Tôi đã phải đối mặt với cùng một vấn đề mọi lúc, giải pháp duy nhất mà tôi tìm ra là nhập CONSUMER_KEYCONSUMER_SECRETtrực tiếp xác định lớp TwitterOAuth mới.

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

Không sử dụng biến hoặc tĩnh trên điều này và xem sự cố có được giải quyết hay không.


0

Ở đây, đầu tiên mọi người cần sử dụng oauth2 / token api sau đó sử dụng foi người theo dõi / danh sách .
Khôn ngoan khác bạn sẽ nhận được lỗi này. Bởi vì người theo dõi / api danh sách yêu cầu Xác thực.

Trong ứng dụng nhanh (dành cho thiết bị di động), tôi cũng gặp phải vấn đề tương tự.

Nếu bạn muốn biết api và các thông số của nó, hãy theo liên kết này, Nhận danh sách bạn bè trên twitter nhanh chóng?


-1

Tôi biết rằng điều này đã cũ nhưng hôm qua tôi đã gặp phải vấn đề tương tự khi gọi URL này bằng C # và lớp HttpClient với mã xác thực Bearer:

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

Hóa ra giải pháp cho tôi là sử dụng HTTPS thay vì HTTP. Vì vậy, URL của tôi sẽ giống như sau:

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

Vì vậy, đây là một đoạn mã của tôi:

            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
tôi nhận được{"errors":[{"message":"Bad Authentication data","code":215}]}
tq

@tq: Hãy xem câu trả lời này: stackoverflow.com/questions/12684765/…
alejosoft

-1

Hãy thử trình khám phá API twitter này , bạn có thể đăng nhập với tư cách là nhà phát triển và truy vấn bất cứ điều gì bạn muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.