PHPでTwitter APIのアクセストークンを取得する

# はじめに
初投稿です。
初めて触ったWebAPIなので備忘録がてらに書き残しておきます。

# 前準備
TwitterDeveloppersから開発者アカウントを取得します。Appを作成しConsumerKeyの生成を取得までを済ませてください。
開発者アカウントの取得方法については割愛します。今日の時点(2019年7月1日)では私が申請した頃と申請フローが変更されていました…

それから[TwitterOAuth](https://github.com/abraham/twitteroauth)のライブラリを導入してください。TwitterAPIのリクエストが格段に便利になるすごいライブラリです。
導入方法はComposerでも何でもいいですがComposerが楽だと思います。[公式](https://twitteroauth.com/)の*With Composer*が参考になるはずです。


# 手順
1. ```oauth/request_token```からリクエストトークンを取得する
2. ```https://api.twitter.com/oauth/authorize```に取得したリクエストトークンを合わせて飛ばす
3. Twitter上でログイン→連携アプリを認証→コールバックに指定したページに戻ってくる
4. ```oauth/access_token```で認証

だいたいこんな流れです。

# 実装
```php:access_token.php
<?php
session_start();
require_once($_SERVER['DOCUMENT_ROOT'] . "/vendor/autoload.php");

use Abraham\TwitterOAuth\TwitterOAuth;

// 設定項目
$con_key = "*****"; // Consumer Key
$con_secret = "*****";  // Consumer Secret
$callback_url = "http://" . $_SERVER["HTTP_HOST"]  . "access_token.php";  // Callback URL

// 3. コールバックに指定したページに戻ってくる
if ($_GET) {
    // 
    $twitter = new TwitterOAuth($con_key, $con_secret, $_GET['oauth_token'], $_SESSION['oauth_secret']);

    // 4. oauth/access_tokenで認証
    $params = [
        'oauth_verifier' => $_GET["oauth_verifier"],
    ];
    $access_token = $twitter->oauth('oauth/access_token', $params);

    foreach ($access_token as $key => $value) {
        echo $account_status[$key] = $value;
        echo "<br/>";
    }

    session_destroy();
    ?>
    <a href="<?= $callback_url ?>">もう一度認証する</a>
<?php

    // 1. oauth/request_tokenからリクエストトークンを取得する
} else {
    //TwitterOAuthの仕様準備
    $twitter = new TwitterOAuth($con_key, $con_secret);
    $params = [
        "oauth_callback" => $callback_url,
        "x_auth_access_type" => "write"
    ];

    $request_token = $twitter->oauth('oauth/request_token', $params);
    $_SESSION["oauth_secret"] = $request_token["oauth_token_secret"];

    // 2. https://api.twitter.com/oauth/authorizeに取得したリクエストトークンを合わせて飛ばす
    header("Location: https://api.twitter.com/oauth/authorize?oauth_token=" . $request_token["oauth_token"]);
}
```

# 解説
手順辿りつつピックアップ。

```php
$callback_url = "http://" . $_SERVER["HTTP_HOST"]  . "access_token.php";  // Callback URL
```

1枚のページでアクセストークンの取得を行うため```$callback_url```にはこのページを指定。


```php
$request_token = $twitter->oauth('oauth/request_token', $params);
```

oauthメソッドで手順1.のリクエストトークンを取得。

```php
$_SESSION["oauth_secret"] = $request_token["oauth_token_secret"];
```

この後Twitterに遷移するためセッションに```oauth_token_secret```を保存。

```php
header("Location: https://api.twitter.com/oauth/authorize?oauth_token=" . $request_token["oauth_token"]);
```

``` header ```でTwitterの認証ページへ飛ばす。パラメータにさっき取得したリクエストトークンをつける。

---
ここからTwitter上の認証ページから戻ってきた処理

```php
$twitter = new TwitterOAuth($con_key, $con_secret, $_GET['oauth_token'], $_SESSION['oauth_secret']);
```
TwitterOAuthを再度newする。今度は引数にConsumer Keyと取得したOAuth Key指定する。

```php
$params = [
    'oauth_verifier' => $_GET["oauth_verifier"],
];
$access_token = $twitter->oauth('oauth/access_token', $params);
```

戻ってきた際に取得した```oauth_verifier```をパラメータに```oauth/access_token```へリクエスト。

これでアクセストークンが取得できました！これさえあれば好きなようにTwitterAPIが叩けます！

# TwitterOauthがすごい話
初めて触ったときはCurlでリクエストしてたんでもう必死でした。TwitterOAuthが無かったら生きていけなかった。

今回はアクセストークンを取得する話でしたが，個人で使う分にベアラートークンさえあればAPIは叩けます。
以前はAPI叩くのにいちいちベアラートークンを取得してられっかよ！という状態だったので，1度取得してからローカルに大事に大事に保存していました。
しかしこのTwitterOAuthはConsumer Keyさえあれば勝手にベアラートークンを取得してgetなりpostのリクエストを飛ばしてくれるすごいやつなんです。すごい！
いつかTwitterOAuthがすごいって紹介記事書きたい。

ちなみに[tmhOAuth](https://github.com/themattharris/tmhOAuth)という同様にTwitterAPIを叩くライブラリがあるのですが，こちらは5,6年前に更新が止まってます。
時間があるときにTwitterOAuthとtmhOAuthの比較記事も書けたらなーと考えています。

# まとめ
うまくまとめられないなー至らないなーとぼやきながら四苦八苦で初投稿してみました。
引き出し開けつつこれはこれだよなあれはあれって頭の整理ができたことは事実なので今後も続けていきたいですね。
あとTwitterAPIの情報探してるとログイン認証だとかアプリ認証だとかコンシューマーキーだとかAPIキーだとか同じモノを指していても言葉が違ったりします。
その辺の認識？定義？を自分で整理できていると情報探すのが楽。

# 参考
[Twitter REST APIの使い方](https://syncer.jp/Web/API/Twitter/REST_API/)