【Laravel5.5 × abraham TwitterOAuth】PHPでTwitter連携をつくってみた

色々なTwitterライブラリがありますが、今回は`abraham/twitteroauth`を使って、Twitterログイン・タイムライン、フォロー・フォロワーの取得をやってみました。
※ライブラリのgithubは[こちら](https://github.com/abraham/twitteroauth)から

# 1. TwitterAppの作成
まずはTwitterAPIを利用するために必要な、TwitterAppを作成していきます。
手順は以下のような感じです。

1. https://apps.twitter.com/ へアクセス

2. 右上の「Create New App」をクリック
![twitter_app.png](https://qiita-image-store.s3.amazonaws.com/0/178137/2f28a304-9a66-3c7c-fe34-380085f3a0ec.png)

3. App名・詳細・Websiteを入力して作成
Websiteは割と適当でもOKです。
![twitter_create_app.png](https://qiita-image-store.s3.amazonaws.com/0/178137/501ec90d-f42c-cb54-5903-6fb280968d42.png)

4. 「Keys and Access Tokens」から自分のAPI Keyを取得
![twitter_app_keys.png](https://qiita-image-store.s3.amazonaws.com/0/178137/86e0257d-c155-9a05-ed4b-928b7259b88d.png)

これでTwitterApp作成は完了です。
続いて早速Appを用いてApiを使っていきましょう。


# 2. Twitter連携
ここからはLaravel上でTwitterAPIをどのように使っていくのかについて書いていきます。
Laravelはインストールされている前提で話を進めていきます。

## 2-1. abraham/twitteroauth のインストール

```bash
composer require abraham/twitteroauth 
```

## 2-2. OAuth認証でログインする
これでTwitterOAuthは使えるようになったので、続いてOAuth認証を行っていきます。

### 2-2-1. configファイルの作成
認証を行う際に、先ほど発行したAPI Keyを利用するのですが、環境によって異なると思うので`.env`と`config`に記載しておきましょう。

```php:.env
TWITTER_CONSUMER_KEY=xxxxxxxxxxxx
TWITTER_CONSUMER_SECRET=xxxxxxxxxxxx
TWITTER_ACCESS_TOKEN=xxxxxxxxxxxx
TWITTER_ACCESS_TOKEN_SECRET=xxxxxxxxxxxx
TWITTER_CALLBACK_URL=http://xxxx.com/login/twitter/callback
```

```php:config/twitter.php
<?php
# configファイルは自作してください。
return [
    'consumer_key' => env('TWITTER_CONSUMER_KEY', ''),
    'consumer_secret' => env('TWITTER_CONSUMER_SECRET', ''),
    'access_token' => env('TWITTER_ACCESS_TOKEN', ''),
    'access_token_secret' => env('TWITTER_ACCESS_TOKEN_SECRET', ''),
    'callback_url' => env('TWITTER_CALLBACK_URL', ''),
];
```
API Keyを記載し、使う準備が整ったので、OAuth認証をしていきます。

### 2-2-2. request_tokenの取得
```php:LoginController.php@twitter
# useを忘れずに！
use Abraham\TwitterOAuth\TwitterOAuth;

class LoginController extends Controller
    public function twitter()
    {
        $twitter = new TwitterOAuth(
            config('twitter.consumer_key'),
            config('twitter.consumer_secret')
        );
        # 認証用のrequest_tokenを取得
        # このとき認証後、遷移する画面のURLを渡す
        $token = $twitter->oauth('oauth/request_token', array(
            'oauth_callback' => config('twitter.callback_url')
        ));

        # 認証画面で認証を行うためSessionに入れる
        session(array(
            'oauth_token' => $token['oauth_token'],
            'oauth_token_secret' => $token['oauth_token_secret'],
        ));

        # 認証画面へ移動させる
        ## 毎回認証をさせたい場合： 'oauth/authorize'
        ## 再認証が不要な場合： 'oauth/authenticate'
        $url = $twitter->url('oauth/authenticate', array(
            'oauth_token' => $token['oauth_token']
        ));

        return redirect($url);
    }
```

### 2-2-3. callback処理
続いてrequest_tokenを取得する際にパラメーターとして渡した、`oauth_callback`に遷移するので、こちら側の処理を書いていきます。

```php:LoginController.php@twitterCallback
    public function twitterCallback(Request $request)
    {
        $oauth_token = session('oauth_token');
        $oauth_token_secret = session('oauth_token_secret');

        # request_tokenが不正な値だった場合エラー
        if ($request->has('oauth_token') && $oauth_token !== $request->oauth_token) {
            return Redirect::to('/login');
        }

        # request_tokenからaccess_tokenを取得
        $twitter = new TwitterOAuth(
            $oauth_token,
            $oauth_token_secret
        );
        $token = $twitter->oauth('oauth/access_token', array(
            'oauth_verifier' => $request->oauth_verifier,
            'oauth_token' => $request->oauth_token,
        ));

        # access_tokenを用いればユーザー情報へアクセスできるため、それを用いてTwitterOAuthをinstance化
        $twitter_user = new TwitterOAuth(
            config('twitter.consumer_key'),
            config('twitter.consumer_secret'),
            $token['oauth_token'],
            $token['oauth_token_secret']
        );

        # 本来はアカウント有効状態を確認するためのものですが、プロフィール取得にも使用可能
        $twitter_user_info = $twitter_user->get('account/verify_credentials');
        dd($twitter_user_info);
    }
```

## 2-3. タイムラインを取得する
一度、OAuth認証に成功してしまえば、`user_id`か`screen_name`が取得できるので、こちらの値を用いて問い合わせを行うことが可能となります。

```php:LoginController.php@getTimeline
    public function getTimeline(Request $request)
    {
        # userがある前提です
        $user = User::find(Auth::user()->user_id);

        $twitter = new TwitterOAuth(
            config('twitter.consumer_key'),
            config('twitter.consumer_secret')
        );
        # 指定したユーザーのタイムラインを取得
        $timeline = $twitter->get('statuses/user_timeline', array(
            'user_id' => Auth::User()->twitter_id,
        ));
        dd($ret);
    }
```

## 2-4. フォローを取得する
```php:LoginController.php@getFollowList
    public function getFollowList(Request $request)
    {
        # userがある前提です
        $user = User::find(Auth::user()->user_id);

        $twitter = new TwitterOAuth(
            config('twitter.consumer_key'),
            config('twitter.consumer_secret')
        );
        # 指定したユーザーのフォローを取得
        $timeline = $twitter->get('friends/list', array(
            'user_id' => Auth::User()->twitter_id,
        ));
        dd($ret);
    }
```

## 2-5. フォロワーを取得する
```php:LoginController.php@getFollowerList
    public function getFollowerList(Request $request)
    {
        # userがある前提です
        $user = User::find(Auth::user()->user_id);

        $twitter = new TwitterOAuth(
            config('twitter.consumer_key'),
            config('twitter.consumer_secret')
        );
        # 指定したユーザーのフォロワーを取得
        $timeline = $twitter->get('followers/list', array(
            'user_id' => Auth::User()->twitter_id,
        ));
        dd($ret);
    }
```

# 参考文献
- [Twitter REST APIの使い方](https://syncer.jp/Web/API/Twitter/REST_API/)
- [TwitterOAuthでログイン認証をおこなう[OAuth]](
http://noumenon-th.net/programming/2016/03/08/twitteroauth/)