Twitter API가 오류 215, 잘못된 인증 데이터를 반환합니다.


110

사용자의 팔로어 목록을 얻기 위해 Twitter의 API를 호출하려고합니다.

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

응답으로이 오류 메시지가 표시됩니다.

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

이 오류 코드와 관련된 문서를 찾을 수없는 것 같습니다. 누구든지이 오류에 대해 알고 있습니까?


2
우리 중 많은 사람들이 같은 배에 있습니다. 이 문제를 해결할 수 있었습니까? 1.0이 더 이상 사용되지 않기 때문에 1.1에 대한 솔루션을보고 싶습니다.
RCNeil 2010 년

1
불행히도 여전히 적절한 해결책을 찾을 수 없었습니다. 현재 버전 1에서 작업 중입니다. 하지만 내가 할 때 여기에 확실히 게시 할 것입니다. 당신이 그 전에 그것을 얻을 경우에, ... 몫을 해 주시기 바랍니다
딥 Dhingani에게

1
Twitter oauth 도구에서 "/1.1"이 포함 된 URL이 생성 된 것을 발견 한 사람이 있습니까?하지만 cURL 명령은 "oauth_version = 1.0"이라고 말합니다. dev.twitter.com/apps/XXXXXX/oauth?nid=10364
systemblogger

1
@systemblogger 음, OAuth 버전과 트위터 API 버전은 같은 것이 아닙니다. OAuth는 1.0 atm과 2.0 atm이 있으며 Twitter는 여전히 1.0을 사용하는 것이 기쁩니다.
Vlasec 2013

여기에서 먼저 모든 사람은 oauth2 / token api를 사용하고 팔로어 / list api를 사용해야합니다. 그렇지 않으면이 오류가 발생합니다. 팔로워 / 목록 API에는 인증이 필요하기 때문입니다. Swift에서 다음 링크를 따르십시오. stackoverflow.com/questions/12053159/…
iOS

답변:


26

다른 php 파일이없는 매우 간결한 코드에는 oauth 등이 포함됩니다. 다음 키를 얻으려면 https://dev.twitter.com 에 가입하고 애플리케이션을 만들어야합니다.

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

?>

문안 인사


이것은 "CURLOPT_SSL_VERIFYPEER = false"때문에 작동합니다. 우리는 트위터 라이브러리가 항상 빈 응답을 반환하게 만드는 cURL SSL 인증서 확인 오류임을 추적했습니다.
lubosdz

11

지금까지 찾은 유일한 해결책은 다음과 같습니다.

  • Twitter 개발자 패널에서 응용 프로그램 만들기
  • 애플리케이션 (또는 사용자 계정의 애플리케이션)으로 사용자를 승인하고 Twitter에서 제공하는 "oauth_token"및 "oauth_token_secret"을 저장합니다. 이를 위해 TwitterOAuth 라이브러리를 사용하십시오. 매우 쉽습니다. 라이브러리와 함께 제공되는 예제를 참조하십시오.
  • 이 토큰을 사용하여 사용자를 대신하여 인증 된 요청을 할 수 있습니다. 동일한 라이브러리로 할 수 있습니다.

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

그러면 사용자의 친구 목록이 반환됩니다.


7

해결책을 찾았습니다-Abraham TwitterOAuth 라이브러리 사용 . 이전 구현을 사용하는 경우 새 TwitterOAuth 개체를 인스턴스화 한 후 다음 줄을 추가해야합니다.

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

처음 두 줄은 이제 Abraham 라이브러리 Readme 파일에 문서화되어 있지만 세 번째 줄은 문서화되어 있지 않습니다. 또한 oauth_version이 여전히 1.0인지 확인하십시오.

다음은 새로 인증 된 사용자로 'users / show'에서 모든 사용자 데이터를 가져오고 1.1로 사용자 전체 이름과 사용자 아이콘을 반환하는 코드입니다. 다음 코드는 인증 콜백 파일에서 구현됩니다.

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

다음 코드는 인증 및 토큰 요청 후 리디렉션에 있습니다.

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

이걸 알아내는 데 너무 오래 걸렸습니다. 이것이 누군가를 돕기를 바랍니다 !!


5

URL /1.1/ 이 정확하며 새로운 Twitter API 버전 1.1입니다.

그러나 애플리케이션이 필요하고 oAuth를 사용하여 애플리케이션 (및 사용자)을 인증합니다.

Twitter 개발자 문서 사이트 에서 이에 대해 자세히 알아보십시오. :)


141
문서 사이트를 참조한다고해서 실제로 질문에 대한 답은 없습니다.
moluv00

4
@ moluv00 OP는 "이 오류 코드와 관련된 문서를 찾을 수없는 것 같습니다."라고 말했습니다.
strangerstudios

4
일반 링크를 게시 한 이유는 무엇입니까? 이것은 대답이 아닙니다.
Brice Favre

5

Gruik의 답변은 아래 스레드에서 저에게 효과적이었습니다.

{발췌 | Zend_Service_Twitter-API v1.1 준비 }

ZF 1.12.3에서 해결 방법은 옵션에서 직접적으로가 아니라 oauthOptions 옵션에서 consumerKey 및 consumerSecret을 전달하는 것입니다.

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

5

최신 정보: Twitter API 1은 이제 더 이상 사용되지 않습니다. 위의 답변을 참조하십시오.

Twitter 1.1은 해당 구문으로 작동하지 않습니다 (이 답변을 작성했을 때). 1.1이 아니라 1이어야합니다. 이것은 작동합니다.

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


3
네 맞습니다. 그러나 그것은 Twitter의 문서가 저에게 그렇게하라고 제안했기 때문입니다. ( dev.twitter.com/docs/api/1/get/followers/ids ). 그들은 버전 1이 더 이상 사용되지 않으며 1.1로 이동해야한다고 말했습니다. 버전 1은이 웹 서비스에서 확실히 작동합니다. 하지만 왜 1.1이 나를 위해 작동하지 않는지 혼란 스러웠습니까?
Dip Dhingani

7
버전 1은 2013 년 3 월부터 6 개월 후에 사용이 중단되므로 버전 1.1
K Weber

내가 충실 다른 OAuth는 라이브러리 테스트 트위터 비동기를 그냥이 라인 변경, protected $apiVersion = '1.1';EpiTwitter.php 트위터 API 버전 1.1에 대한 벌금을 작동 파일에
K. 웨버

2
트위터 API (1)는 사용되지 않습니다
qasimzee

4
Twitter REST API v1은 더 이상 활성화되지 않습니다. API v1.1로 마이그레이션하십시오. dev.twitter.com/docs/api/1.1/overview .
itsazzad

3

연구 이틀 후 나는 마지막으로 액세스 때문에 공개 트윗에 당신은 단지 필요가 발견 어떤 응용 프로그램 자격 증명을, 그리고 특정 사용자들 것이다. 따라서 클라이언트를 위해 개발하는 경우에는 그들에게 아무것도 요청하지 않아도됩니다.

새로운 Twitter API 1.1을 사용하려면 다음 두 가지가 필요합니다.

먼저 자신의 자격 증명으로 응용 프로그램을 만든 다음 (실제로해야 함) " Your access token "섹션 에서 액세스 토큰 (OAUTH_TOKEN) 및 액세스 토큰 암호 (OAUTH_TOKEN_SECRET)를 가져올 수 있습니다 . 그런 다음 새 TwitterOAuth 개체의 생성자에이를 제공합니다. 이제 모든 공개 트윗에 액세스 할 수 있습니다 .

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

사실 나는 이것이 Pavel 이 제안한 것이라고 생각 하지만 그의 대답에서는 그렇게 분명하지 않습니다.

이것이 이틀 동안 다른 사람을 구하기를 바랍니다. :)


2

Zend_Service_Twitter에 customerKeycustomerSecret 을 보내야합니다.

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

2

이것은 Zend_Oauth_Client를 사용하여 트위터 API로 작업하는 사람에게 도움이 될 수 있습니다. 이 작업 구성 :

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

twitter api 1.0은 oauth 버전이 1.1과 1.0이되도록 허용하는 것 같습니다. twitter api 1.1은 oauth 버전 만 1.0이되도록 요구합니다.

추신 : Zend_Service_Twitter는 상태 업데이트시 사용자 지정 매개 변수 전송을 허용하지 않으므로 사용하지 않습니다.


0

Twitter에서 애플리케이션에 대한 읽기 및 쓰기 권한이 있는지 확인하십시오.


0

HybridAuth를 사용 하고 있습니다. 있으며 Twitter에 연결하는 동안이 오류가 발생했습니다. 나는 트위터에 부정확 한 요청 유형 (GET / POST 대신 가져 오기 / 게시)을 보내는 것으로 추적했습니다.

이로 인해 215가 발생합니다.

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

이것은 :

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

참고 : HybridAuth의 경우 다음도 그렇지 않습니다 (HA가 내부적으로 요청 유형에 대해 올바른 케이스 값을 제공하기 때문에).

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

0

내가 알아 낸 유일한 해결책은 타이핑 CONSUMER_KEYCONSUMER_SECRET새로운 TwitterOAuth 클래스 정의에 직접 연결하는 것뿐입니다 .

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

이것에 변수 또는 정적을 사용하지 말고 문제가 해결되었는지 확인하십시오.


0

여기에서는 먼저 모든 사람이 oauth2 / token api를 사용해야하고 followers / list api를 사용해야합니다 .
그렇지 않으면이 오류가 발생합니다. 팔로워 / 목록 API에는 인증이 필요하기 때문입니다.

신속하게 (모바일 앱의 경우) 나도 같은 문제가 발생했습니다.

이 링크를 따라 API와 매개 변수를 알고 싶다면 신속하게 트위터 친구 목록을 얻으시겠습니까?


-1

이것이 오래되었다는 것을 알고 있지만 어제 Bearer 인증 토큰과 함께 C # 및 HttpClient 클래스를 사용하여이 URL을 호출 할 때 동일한 문제에 직면했습니다.

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

저에게 해결책은 HTTP 대신 HTTPS를 사용하는 것이 었습니다. 따라서 내 URL은 다음과 같습니다.

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

그래서 다음은 내 코드의 일부입니다.

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.