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

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

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

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

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

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



답변

다른 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;

?>

문안 인사


답변

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

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

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


답변

해결책을 찾았습니다-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/>';
}

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


답변

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

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

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


답변

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

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

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

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


답변

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

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

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


답변

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

새로운 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 이 제안한 것이라고 생각 하지만 그의 대답에서는 그렇게 분명하지 않습니다.

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