質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.04%

Twitter公式クライアントのAPIコンシューマーキーを利用する方法

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 410

mer

score 6

Twitter公式のAPIキーがあるとの回答を頂き、その公式APIキーからツイッターの利用をしたいと考えております。
Twitter公式クライアントのコンシューマキー

phpやPythonなどから使用する場合コンシューマーキーとアクセストークンが必要なのですが、
Twitter公式クライアントからどうやってアクセストークンを取得すればできるのでしょうか?

自身で手に入れたAPIキーでならこの下記のコードでアクセストークンを入手することが可能だったのですが、
こちらのコードのコンシューマーキーの項目を公式Twitterのクライアントにすると
echo '失敗!: '.$e->getMessage();
のエラーが出てきて上手くいきません。

TwitterAPIキーでアプリ認証してアクセストークンを取得するために参考にさせていただいたサイト
[Twitter API] bot用のアクセストークンを取得する方法 (PHPでTwitterのOAuth認証)

こちらの手持ちのAPIキーでならすべてこのコードで上手くいっているのですが、公式Twitterではできないのでしょうか?
他にTwitte公式のアクセストークンを取得する方法はないものでしょうか?

<?php
const CONSUMER_KEY = 'コンシューマーキー';
const CONSUMER_SECRET = 'コンシューマーシークレットキー';

session_set_cookie_params(600);
session_start();

try {
    if (empty($_GET)) {
        //--------------------------------------
        // 1. 最初にアクセスした時
        //--------------------------------------
        // セッション削除
        unset($_SESSION['oauth_token']);
        unset($_SESSION['oauth_token_secret']);

        // APIを叩いてリクエストトークン取得して、セッションに保存
        $res = post(
            'https://api.twitter.com/oauth/request_token',
            [
                'oauth_callback' => '', // localhostだとこれは使えないらしいのでカラ。
            ]
        );
        if (!isset($res['oauth_token'])) {
            throw new Exception('レスポンス→ '.var_export($res, true));
        }
        $_SESSION['oauth_token'] = $res['oauth_token'];
        $_SESSION['oauth_token_secret'] = $res['oauth_token_secret'];

        // リクエストトークンを持ってTiwtterの認証画面に行くリンクを表示
        header('Content-Type: text/html');
        $url = 'https://api.twitter.com/oauth/authenticate?oauth_token='.$res['oauth_token'];
        echo '<a href="'.$url.'">'.$url.'</a>';
    }
    else {
        //--------------------------------------
        // 2. Twitterで認証して戻ってきた時
        //--------------------------------------
        // もらったパラメータ『oauth_verifier』をつけてAPIを叩き、アクセストークン取得
        $res = post(
            'https://api.twitter.com/oauth/access_token',
            [
                'oauth_verifier' => $_GET['oauth_verifier'],
            ],
            $_SESSION['oauth_token'],       // セッションに保存していたリクエストトークンを署名に使う
            $_SESSION['oauth_token_secret'] // 同上
        );
        if (!isset($res['oauth_token'])) {
            throw new Exception('レスポンス→ '.var_export($res, true));
        }

        // アクセストークンを画面に表示
        header('Content-Type: text/html');
        echo implode([
            '成功!',
            'Access Token: '.$res['oauth_token'],
            'Access Token Secret: '.$res['oauth_token_secret'],
            'User ID: '.$res['user_id'],
            'Screen Name: '.$res['screen_name'],
        ], '<br />');
    }
}
catch (Exception $e) {
    header('Content-Type: text/plain');
    echo '失敗!: '.$e->getMessage();
}

/**
 * 対象URLにOAuthの署名つきでPOSTし、結果を連想配列で返却する
 */
function post($url, $params, $token = null, $secret = null) {
    // curlでPOST
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_HTTPHEADER => [
            createOAuthHeader($url, $params, $token, $secret)
        ],
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => http_build_query($params),
    ]);
    if (($res = curl_exec($ch)) === false) {
        throw new Exception('通信時にエラーが発生しました。');
    }
    curl_close($ch);
    parse_str($res, $resArr);
    return $resArr;
}

/**
 * OAuth用のヘッダを作成して返却する
 */
function createOAuthHeader($url, $params, $token, $secret) {
    $sigparams = [
        'oauth_consumer_key'     => CONSUMER_KEY,
        'oauth_signature_method' => 'HMAC-SHA1',
        'oauth_timestamp'        => time(),
        'oauth_nonce'            => md5(uniqid(rand(), true)),
        'oauth_version'          => '1.0',
    ];
    if (isset($token)) {
        // リクエストトークンがあればセット
        $sigparams['oauth_token'] = $token;
    }
    $sigparams += $params;

    // ルール通りに署名を作成してセット
    // https://developer.twitter.com/en/docs/basics/authentication/guides/creating-a-signature.html
    ksort($sigparams);
    $data = 'POST&'.rawurlencode($url).'&'.rawurlencode(http_build_query($sigparams, '', '&', PHP_QUERY_RFC3986)); // ここでは関係無いが、パラメータにスペースが含まれてる時用にRFC3986を明示的に指定
    $key  = rawurlencode(CONSUMER_SECRET).'&';
    $key .= isset($secret) ? rawurlencode($secret) : ''; // リクエストトークンがあればセット
    $hash = hash_hmac('sha1', $data, $key, true);
    $sigparams['oauth_signature'] =  base64_encode($hash);

    // ヘッダ文字列にして返却
    return 'Authorization: OAuth '.http_build_query($sigparams, '', ',');
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+2

Twitter公式のAPIキーがあるとの回答を頂き、その公式APIキーからツイッターの利用をしたいと考えております。

少なくとも、おおっぴらに聞いていいような内容ではないと判断します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/26 14:38

    では、回答していただいた方にその回答内容をそのままお伝えさせていただきますね。

    キャンセル

  • 2019/06/26 14:41

    といいますと?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる