2

Twitter のアプリ専用認証を使用して、検索結果を取得しようとしています。ほとんどの部分で Codeigniter を使用していますが、問題のコードは単純な PHP です。

ローカルホストで実行すると検索結果が返されますが、サーバーで実行すると次のエラーが表示されます。

[コード] => 99 [ラベル] => Authenticity_token_error [メッセージ] => 資格情報を確認できません

そのため、ベアラー トークンを取得する最初のリクエストで失敗しています。

これは私には少し厄介なようで、明らかにデバッグが困難です。私はおそらく非常に基本的な何かを見逃しているので、どんな助けも感謝して受け入れられます!

以下は私のコードです:

    // get consumer key and consumer secret from my config files
    $consumer = array(
        'key' => $this->config->item($provider.'_key'),
        'secret' => $this->config->item($provider.'_secret'),
    );

    // encode it into the format Twitter expects
    $bearerTokenCred = base64_encode($consumer['key'].":".$consumer['secret']);

    // set up request
    $opts = array('http' =>
        array(
            'method'  => 'POST',
            'header'  =>    'Authorization: Basic '.$bearerTokenCred."\r\n".
                            "Content-type: application/x-www-form-urlencoded;charset=UTF-8\r\n",
            'content' => 'grant_type=client_credentials'
        )
    );

    $context  = stream_context_create($opts);

            // send request
    $result = file_get_contents('https://api.twitter.com/oauth2/token', false, $context);

    $result2 = json_decode($result, true);

            // this is where it prints my error - prior to doing anything else
    print_r($result2);

    if ($result2["token_type"] != "bearer"){
        echo $result2["token_type"];
        return;
    }

    $opts = array('http' =>
        array(
            'method'  => 'GET',
            'header'  => 'Authorization: Bearer '.$result2["access_token"]       
        )
    );

    $context  = stream_context_create($opts);

    $result3 = file_get_contents('https://api.twitter.com/1.1/search/tweets.json?q='.urlencode($search), false, $context);
4

1 に答える 1

1

述べたように実際に問題を解決することはできませんでしたが、送信されたヘッダーでの文字列と配列の使用に関して、いくつかのグースチェイスを行いました(http://www.php.net/manual/en/function.stream -context-create.php#99353 ) - それでも私には何もしませんでした。

結局、私は仕事をしたCURLを使用することに頼りました。

私の推測では、これは私のサーバー構成に関係していると思われますが、何なのかはわかりません!

以下の最終的な作業コード

    $provider = 'twitter';

    // Get keys from the config
    $consumer = array(
        'key' => $this->config->item($provider.'_key'),
        'secret' => $this->config->item($provider.'_secret'),
    );
    $bearerTokenCred = base64_encode($consumer['key'].":".$consumer['secret']);

    $data = array ('grant_type' => 'client_credentials');
    $data = http_build_query($data);

    $header = array(
        "Authorization: Basic $bearerTokenCred",
        "Content-type: application/x-www-form-urlencoded;charset=UTF-8",
        "Content-Length: " . strlen($data) 
    );

    $options = array( 
        CURLOPT_HTTPHEADER => $header,
        CURLOPT_HEADER => false,
        CURLOPT_URL => "https://api.twitter.com/oauth2/token",
        CURLOPT_RETURNTRANSFER => true
    );

    $options[CURLOPT_POSTFIELDS] = $data;

    $feed = curl_init();
    curl_setopt_array($feed, $options);
    $result = curl_exec($feed);
    curl_close($feed);

    $result2 = json_decode($result, true);

    if ($result2["token_type"] != "bearer"){
        echo "error - invalid token type";
        return;
    }

    $header = array(
        'Authorization: Bearer '.$result2["access_token"]
    );

    $options = array( 
        CURLOPT_HTTPHEADER => $header,
        CURLOPT_HEADER => false,
        CURLOPT_URL => 'https://api.twitter.com/1.1/search/tweets.json?q='.urlencode('"#'.$search.'"'),
        CURLOPT_RETURNTRANSFER => true
    );

    $feed = curl_init();
    curl_setopt_array($feed, $options);
    $result = curl_exec($feed);
    curl_close($feed);

    $result3 = json_decode($result, true);

    foreach($result3['statuses'] as $status){
        echo "<p>".$status['text']."</p>";
    }

これが誰かに役立つことを願っています!

于 2013-08-22T14:59:29.060 に答える