Laravel5.7でTwitterOAuthを使ってタイムライン取得（申請から説明）

#TwitterAPIを申請から実際に取得するまでLaravelを使ってやってみる。

- まずはTwitterDeveloper申し込む
- 申し込み、そして開発者へ
- Composerを使って`abraham/twitteroauth`をインストール
- .envファイルの設定
- Tweetを取得する

##まずはTwitterDeveloper申し込む

TwitterDeveloperの公式リンクです。
[TwitterDeveloper](https://developer.twitter.com/en.html)

右上の`Apply`を押してください。

![twitter01.png](https://qiita-image-store.s3.amazonaws.com/0/293438/1b19612a-7078-9755-fcc2-cf97843287b1.png)

そしたら↓の画面に遷移するので
`Apply for a Developer account`を押して自分のTwitterアカウントにログインしてください。

![twitter02.png](https://qiita-image-store.s3.amazonaws.com/0/293438/0a81bea8-fd65-d5c0-90e0-267e93f37505.png)

そしたら色々質問されます（英語で）
ちなみに僕はプライベートアカウントで適当に全部答えてたら**１ヶ月経っても音沙汰なし**です。
**※別アカウント作って真面目に質問答えたら1時間くらいでメールきて申請通った。**

# 申請、そして開発者へ

僕の場合は1時間ほどでTwitterからメールが来てました。
リンクを開くと`ようこそ`みたいな画面が出てきて、
**早速アプリ作れや**みたいになるので作っていきましょう。

WEBサイト名やサイト説明など適当に入れたらとりあえずAPI-Keyが手に入るので、
ちゃちゃっと入力してください。

そしたらよくわらない画面に飛ぶので（日本語対応して欲しい）
右上の`twitter_api`の中の`apps`をクリックしてください。

![twitter03.png](https://qiita-image-store.s3.amazonaws.com/0/293438/3a001bb6-238b-8c5f-8704-292c086d4231.png)

すると先ほど作成したWEBサイト？アプリ？があるのでその`Detail`をクリック。
クリックしたらタブで`Key and Token`があるのでそれが貴方のAPI_KeyとTokenになります。
※Tokenがなければ Create Token的なやつをクリックしてTokenを生成してください。

##Composerを使って`abraham/twitteroauth`をインストール

やっとここまできた。。
それではターミナルからLaravelがインストールされているディレクトリに移動してください。
そして↓のコマンドを使ってcomposerにインストールしましょう。

```terminal
composer require abraham/twitteroauth
```

成功したら↓こんな感じで表示されます。

```terminal
Package manifest generated successfully.
```

これで`abraham/twitteroauth`はインストールできたので、次は.envファイルを触っていきます。

##.envファイルの設定

ここにAPI連携に必要な情報を入れていきやす。
一番下あたりにそのままガサッとコピペして先ほどのAPI_KeyとTokenやらを埋めてください。

```.env
#Twitter

TWITTER_CLIENT_KEY = TwitterのAPI　Key
TWITTER_CLIENT_SECRET = TwitterのAPI　Secret　Key
TWITTER_CLIENT_ID_ACCESS_TOKEN = TwitterのAccess　Token
TWITTER_CLIENT_ID_ACCESS_TOKEN_SECRET = TwitterのAccess token secret
TWITTER_CALLBACK_SECRET = コールバックしたいURL
```

次はconfigディレクトリにtwitter.phpというファイルを作成して以下をそのままコピペしてください。
.envファイルに書いた定数は直接呼び出すのではなく、configファイルから呼びだすようにしてね★

```php:config/twitter.php
<?php

return [
    'api_key' => env('TWITTER_CLIENT_KEY', ''),
    'secret_key' => env('TWITTER_CLIENT_SECRET', ''),
    'access_token' => env('TWITTER_CLIENT_ID_ACCESS_TOKEN', ''),
    'access_token_secret' => env('TWITTER_CLIENT_ID_ACCESS_TOKEN_SECRET', ''),
    'call_back_url' => env('TWITTER_CALLBACK_URL', ''),
];
```

##Tweetを取得する

せっかくなので、サービスプロバイダとファサードを使って、
TwitterOAuthクラスを簡単に提供するためのクラスを作ってみましょう！

ターミナルに戻って`app/`の階層に`cd`で移動してください。
そしたら以下のコマンドで`app/Providers/`にファイルを作成しましょう。

```terminal
php artisan make:provider TwitterServiceProvider
```

`app/Providers/TwitterServiceProvider.php`を開いて下記の内容で作成しましょう！

```php:app/Providers/TwitterServiceProvider
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Abraham\TwitterOAuth\TwitterOAuth;

class TwitterServiceProvider extends ServiceProvider
{
    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = true;

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('twitter', function () {

            $config = config('twitter');

            return new TwitterOAuth($config['api_key'], $config['secret_key'], $config['access_token'], $config['access_token_secret']);

        });
    }

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return ['twitter'];
    }
}
```

上記の`TwitterServiceProvider.php`で何をやっているかの説明引用
>説明を加えると、registerメソッド内で、サービスコンテナ（Laravelで利用するサービスを集めたもの）の中に、TwitterOAuthクラスのインスタンスを'twitter'という名前で登録しています。また、ヘルパー関数のconfigを通じて、先ほど用意したconfig/twitter.phpの中身を参照し、インスタンスを作成しています。

>singletonメソッドを通じて登録すると、何度呼ばれても、中のコンストラクタは1度しか呼ばれず、インスタンスを返します。都度インスタンスを生成し直したい場合は、bindメソッドを利用します。

参考にさせていただきましたm(_ _)m
[Composerで追加したクラスをそのままLaravel 5で使う方法（TwitterOAuth）
](https://s8a.jp/composer-laravel-twitter#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%83%97%E3%83%AD%E3%83%90%E3%82%A4%E3%83%80%E3%81%AE%E4%BD%9C%E6%88%90)

作成した`TwitterServiceProvider`クラスを、アプリケーションに登録シャス
`config/app.php`のproviders配列にクラス名を追加するだけです。

```php:config/app.php
'providers' => [
    // TwitterOAuth
    App\Providers\TwitterServiceProvider::class,
],
```

ここまで行けたら、以下のように記述することでTwitterOAuthクラスのインスタンスが呼べます

```php
$instance = resolve('twitter');
```

さらに簡単に利用するために、サービスコンテナで利用可能なクラスへの静的なインターフェースを提供してくれる、
ファサードを利用しましょう。

ターミナルに戻って`app/`まで移動してから`Facades`ディレクトリ。
その中に`Twitter.php`ファイルを作成しましょう。

```terminal
mkdir Facades
cd Facades/
touch Twitter.php
```

app/Facades/Twitter.phpへ、以下の内容でファイルを作成します。

```php:app/Facades/Twitter.php
<?php

namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class Twitter extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return 'twitter';
    }
}
```

エイリアスを使ってさらに簡略化します。

```php:config/app
'aliases' => [
    // TwitterOAuthAliases
    'Twitter' => App\Facades\Twitter::class,
],
```

これで、以下のようにアクセスできるようになりました。

```php:
// フォロワーのID一覧を取得する
$result = \Twitter::get('followers/ids');
```

>なお、エイリアスはグローバル名前空間に定義されているので、namespace宣言されていない場所では、\Twitterの先頭のバックスラッシュは不要です。

だそうです。

さて、ようやく本題のツイート取得です。
ちゃちゃっとコントローラーとテンプレートとweb.phpをやっていきましょう。

ターミナルでポポイと

```terminal
php artisan make:controller TwitterController
```

Viewは適当に作ってください。（atisanコマンドでやる意味ないしね）

```terminal
cd resources/views/
touch twitter.blade.php
```

それじゃあコントローラーから書いていくよ。

```php:TwitterController
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Abraham\TwitterOAuth\TwitterOAuth;

class TwitterController extends Controller
{
    public function index(Request $request)
    {
        //ツイートを5件取得
        $result = \Twitter::get('statuses/home_timeline', array("count" => 5));

        //ViewのTwitter.blade.phpに渡す
        return view('twitter', [
            "result" => $result
        ]);
    }
}

```

↑は第二引数に件数を指定していますが、制限いらなければ不要です。

```php:TwitterController.php
$result = \Twitter::get('statuses/home_timeline');
```

web.phpにルート情報乗せていく

```php:routes/web.php
Route::get('twitter', 'TwitterController@index');
```

続いてViewファイル

```php:twitter.blade.php
@extends('layouts.app')

@section('content')

    <div class="container">
　　　   {{-- コントローラーで取得した$resultをforeachで回す --}}
        @foreach ($result as $tweet)
            <div class="card mb-2">
                <div class="card-body">
                    <div class="media">
                        <img src="https://placehold.jp/70x70.png" class="rounded-circle mr-4">
                        <div class="media-body">
                            <h5 class="d-inline mr-3"><strong>{{ $tweet->user->name }}</strong></h5>
                            <h6 class="d-inline text-secondary">{{ date('Y/m/d', strtotime($tweet->created_at)) }}</h6>
                            <p class="mt-3 mb-0">{{ $tweet->text }}</p>
                        </div>
                    </div>
                </div>
                <div class="card-footer bg-white border-top-0">
                    <div class="d-flex flex-row justify-content-end">
                        <div class="mr-5"><i class="far fa-comment text-secondary"></i></div>
                        <div class="mr-5"><i class="fas fa-retweet text-secondary"></i></div>
                        <div class="mr-5"><i class="far fa-heart text-secondary"></i></div>
                    </div>
                </div>
            </div>
        @endforeach
    </div>

@endsection

```

CSSは省きますがこんな感じで出力できます。

↓URL叩いて下記のように取得できたらOK！

![FireShot Capture 9 - Fake_Twitter - http___localhost_laravelapp_public_twitter#.png](https://qiita-image-store.s3.amazonaws.com/0/293438/42a67518-4aab-ed60-6a96-e1e5ed0e4058.png)

**今日は疲れたのでここまで。時間見つけてTwitter認証も追記します。（2019.1.24）**

##関連リンク

- [Laravel5.7で前回のTwitterOAuthを使ってツイートやらハッシュタグやらユーザーやらの取得方法一覧（投稿あり）](https://qiita.com/namizatop/items/6cb233f93687eefc5822)
- [Laravel5.7とTwitterOAuth(TwitterAPI)を使ってハッシュタグをAPI制限に掛かる事なくDBに突っ込むクーロンを作る](https://qiita.com/namizatop/items/00e76a3a3e72114aa274)

##参考リンク

- [【Laravel5.5 × abraham TwitterOAuth】PHPでTwitter連携をつくってみた]
(https://qiita.com/daiki_44/items/fe11d57e53647f4b59f4)
- [Composerで追加したクラスをそのままLaravel 5で使う方法（TwitterOAuth）](https://s8a.jp/composer-laravel-twitter)