Laravel6でTwitterAPIを使ってみる

Laravel6でTwitterAPIを使っていきます。

今回はTwitterOAuthというライブラリを使用していきます。

##まずはTwitterDeveloperにてアプリを作成

ここは割愛します。

##envファイルにて初期設定

```.env
TWITTER_CLIENT_ID=
TWITTER_CLIENT_SECRET=
TWITTER_CLIENT_ID_ACCESS_TOKEN =
TWITTER_CLIENT_ID_ACCESS_TOKEN_SECRET =
CALLBACK_URL=http://127.0.0.1:8000/login/twitter/callback
```

空白は自分のやつを入れる。

##config/app.phpにて初期設定

```config/app.php
'twitter' => [
       'client_id' => env('TWITTER_CLIENT_ID'),
       'client_secret' => env('TWITTER_CLIENT_SECRET'),
       'access_token' => env('TWITTER_CLIENT_ID_ACCESS_TOKEN', ''),
       'access_token_secret' => env('TWITTER_CLIENT_ID_ACCESS_TOKEN_SECRET', ''),
       'redirect' => env('CALLBACK_URL')
    ],
```

##TwitterOAuthのインストール

```
composer require abraham/twitteroauth
```

##TwitterServiceProviderの作成と登録

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

app/Providers/TwitterServiceProvider.phpを開いて、下記のように記述。

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

namespace App\Providers;

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

class TwitterServiceProvider extends ServiceProvider
{
    protected $defer = true;

    public function boot()
    {
        //
    }

    public function register()
    {
        $this->app->singleton('twitter', function () {

            $config = config();

            return new TwitterOAuth($config['services.twitter.client_id'], $config['services.twitter.client_secret'], $config['services.twitter.access_token'], $config['services.twitter.access_token_secret']);

        });
    }

    public function provides()
    {
        return ['twitter'];
    }
}
```

`config/app.php`に追加。

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

`$instance = resolve('twitter');`こんな感じでTwitterOAuthのインスタンスを作成する事が可能。

しかし、ファサードを利用して、もっと便利にする。

##ファサードの利用

もう少し手軽にTwitterOAuthを利用できるようにファサードを利用していきます。

###app/Facades/Twitter.phpの作成編集

appフォルダ直下にFacadesディレクトリを作成。
その中にTwitter.phpファイルを作成しましょう。

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

namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class Twitter extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'twitter';
    }
}
```
エイリアスに追加します。

```config/app.php
'aliases' => [
    // TwitterOAuthのエイリアス
    'Twitter' => App\Facades\Twitter::class,
],
```

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

```php5

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

##コントローラーの作成
```
php artisan make:controller TwitterController
```

中身は下記の通り。

```php:TwitterController
<?php

namespace App\Http\Controllers;

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

use Auth;

class TwitterController extends Controller
{
    public function index(Request $request)
    {
        //ログイン中のユーザのツイートを取得
        $user = Auth::user();
        $result = \Twitter::get('statuses/user_timeline', ["screen_name"=>$user->unique_id]);

        return view('home', compact('result'));
    }
}


```

ちなみに`use Twitter;`を記述すれば、`\Twitter`のバックスラッシュは不要。

##ルーティングの追加

```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
```