web-dev-qa-db-ja.com

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";
}

このエラーコードに関連するドキュメントが見つかりません。誰でもこのエラーについて知っていますか?

108
Dip Dhingani

oauthなどの他のphpファイルを含まない非常に簡潔なコード。サインアップに必要な次のキーを取得することに注意してください 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;

?>

よろしく

24
A Bright Worker

私がこれまでに見つけた唯一の解決策は次のとおりです。

  • Twitter開発者パネルでアプリケーションを作成する
  • ユーザーをアプリケーション(またはユーザーアカウントのアプリケーション)で認証し、Twitterから提供される「oauth_token」と「oauth_token_secret」を保存します。これには TwitterOAuth libraryを使用します。これは非常に簡単です。ライブラリに付属の例を参照してください。
  • このトークンを使用すると、ユーザーに代わって認証済みのリクエストを作成できます。同じライブラリでそれを行うことができます。

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

これにより、ユーザーの友達のリストが返されます。

11
Pavel

ソリューションを見つける- Abraham TwitterOAuthライブラリ を使用します。古い実装を使用している場合、新しいTwitterOAuthオブジェクトがインスタンス化された後に次の行を追加する必要があります。

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

最初の2行はAbrahamライブラリのReadmeファイルに記載されていますが、3行目はそうではありません。また、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/>';
}

これを理解するのに時間がかかりすぎました。これが誰かを助けることを願っています!!

7
Dante Cullari

/1.1/を含むURLは正しいです。新しいTwitter APIバージョン1.1です。

ただし、アプリケーションが必要であり、oAuthを使用してアプリケーション(およびユーザー)を認証します。

詳細については Twitter Developers documentation site :)をご覧ください

5
spiele_r

UPDATE:Twitter API 1は非推奨になりました。上記の回答を参照してください。

Twitter 1.1はその構文では動作しません(この回答を書いたとき)。 1.1ではなく1である必要があります。これは動作します:

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

5
christopher

Gruikの答えは、以下のスレッドでうまくいきました。

{抜粋| Zend_Service_Twitter-API v1.1を準備する }

zF 1.12.3では、回避策は、オプションで直接ではなく、oauthOptionsオプションでconsumerKeyとconsumerSecretを渡すことです。

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

2日間の調査の後、私はようやくs.oにアクセスすることがわかりました。必要な公開ツイートany特定のユーザーのものではなく、アプリケーションの資格情報。したがって、クライアント向けに開発している場合は、クライアントに何かを依頼する必要はありません。

新しいTwitter API 1.1を使用するには、2つのことが必要です:

最初に、独自の資格情報を使用してアプリケーションを作成し(実際に必要)、アクセストークンを取得します(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日間で他の人が救われることを願っています:)

3
nobug

これは、Zend_Oauth_Clientを使用している人がTwitter 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はステータスの更新時にカスタムパラメータを送信できないため、使用していません。

2
Maksim Kotlyar

customerKeyおよびcustomerSecretを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
Juan de Parras

Twitterのアプリケーションの読み取りおよび書き込みアクセス権があることを確認してください

0
Victor

私が考え出した唯一の解決策は、新しいTwitterOAuthクラスの定義にCONSUMER_KEYCONSUMER_SECRETを直接入力することだけで、常に同じ問題に直面していました。

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

これに変数や静的変数を使用しないで、問題が解決するかどうかを確認してください。

0
Salem

ここでは、最初にすべてのユーザーがoauth2/token apiを使用する必要があり、次にfollowers/list apiを使用します。
それ以外の場合は、このエラーが発生します。フォロワー/リストAPIには認証が必要だからです。

Swift(モバイルアプリの場合)でも同じ問題が発生しました。

Apiとそのパラメーターを知りたい場合は、このリンクをたどってください swiftでTwitterの友達リストを取得しますか?

0
iOS

HybridAuth を使用していますが、Twitterへの接続時にこのエラーが発生していました。私はそれを追跡して、(私が)誤って大文字と小文字を区別した要求タイプ(GET/POSTではなくget/post)をTwitterに送信しました。

これにより、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
Skrivener