1

Twitter フィードに oAuth2 ベアラー アクセス トークン メソッドを実装する必要があります。Twitter開発者のWebサイトの詳細を正しくフォローしましたが、「Twitterの資格情報を確認できません」というメッセージが表示され続けます...

資格情報を開発サーバー (5.3.10 マシン) にコピーすると、実際にログインしてトークンを取得し、ツイートを取得できますが、別のクライアントのサーバー (5.2.17 マシン) では、まったく同じコード。

以下のコードで、PHP の違いについて何か思い当たることはありますか? file_get_content httpsストリームラッパーオプションと関係があるに違いないと思いますが、それについてのドキュメントには何も見つかりません。(Openssl サポートはクライアント サーバーにインストールされます)

$twitter_bearer_access_token = get_option('twitter_bearer_access_token', null);
if($twitter_bearer_access_token == null)
{

    //Request a bearer access token
    $encodedAccessToken = base64_encode(TWITTER_CONSUMER_KEY.':'.TWITTER_CONSUMER_SECRET);

    //Setup the stream context options and create the stream to POST to twitter
    $options = array(
        'http' => array(
            'method' => 'POST',
            'header' => 'Authorization: Basic '.$encodedAccessToken,
            'content' => 'grant_type=client_credentials',
        ),
    );
    $context  = stream_context_create($options);
    $result = json_decode(@file_get_contents('https://api.twitter.com/oauth2/token', false, $context));
    if(isset($result->token_type) && $result->token_type == 'bearer')
    {
        $twitter_bearer_access_token = $result->access_token;
        update_option('twitter_bearer_access_token', $twitter_bearer_access_token);
    }
    else
    {
        $twitter_bearer_access_token = false;
    }

}

編集#1

すべての変数が両方のサーバーで同じであることを事前に確認し、それらを出力して比較しました。file_get_contents だけが異なる結果を返します。

また、5.3 サーバーで取得したベアラー アクセス トークンを 5.2 サーバーにコピーしようとしましたが、値は一致しますが、無効な認証に関するエラーが発生し続けます...

編集#2

詳細については、送信するヘッダーとは関係がないようです。プロキシヘッダーなど、私に関係のないものを除いて、実質的にすべてのヘッダーを追加しました。PHP が 5.2 または 5.3 であることとは関係ありません。ステージング サーバー ホストでテストされ、5.2 に切り替えても動作します...

4

1 に答える 1

0

cURL を使用するとうまくいくようです。依存関係を制限したいことを考えると、コードの 2 つのバージョンを持つことに頼る必要があります (または、最終的にスワップ可能なコンポーネントを使用して離れたデータを取得します)。

//Init curl
$request = curl_init();
curl_setopt($request, CURLOPT_SSLVERSION, 3);
curl_setopt($request, CURLOPT_URL, 'https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name='.TWITTER_ACCOUNT.'&count=100');
curl_setopt($request, CURLOPT_HTTPHEADER, array('Authorization: Bearer '.$twitter_bearer_access_token));
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);

$result = json_decode($content = curl_exec($request));
curl_close($request);

それだけです

PS: これが失敗する理由はまだありません。これは単なるフォールバックです!

于 2013-03-21T17:47:05.673 に答える