こんにちわ、ライオンの中の人です。
よく、ツイッターでログインでログインとかありますよね。ツイッターでログイン機能の付け方と、ログインしたユーザーのタイムラインを表示するコードです。
備忘録です。
Twitterアプリの登録と必要ファイル、ライブラリのダウンロード
まずTwitterのアプリの登録が必要です。こちらについては他のサイトでも多く記事にされているのでそちらをご覧ください。
次に下のファイルをダウンロードしてください。
Abraham Williamsさんという方のファイルです。ツイッターAPIを使うのに便利な機能があります。ダウンロード後、vendorの直下に置いてください。(laravelでプロジェクトを開始するとvendorというファイルがあると思います。)
次に、laravelには socialiteというAPIの機能を使うのに特化したライブラリがあります。下記コマンドでインストールしてください
1 |
composer require laravel/socialite |
ここからコードを書いていきます。まずconfig/services.phpに下記コードを追加してください。
1 2 3 4 5 |
'twitter' => [ 'client_id' => env('TWITTER_CLIENT_ID'), 'client_secret' => env('TWITTER_CLIENT_SECRET'), 'redirect' => env('CALLBACK_URL'), ], |
次に.evnに下記コード
1 2 3 4 5 |
TWITTER_CLIENT_ID=取得したコード TWITTER_CLIENT_SECRET=取得したコード TWITTER_ACCESS_TOKEN=取得したコード TWITTER_ACCESS_TOKEN_SECRET=取得したコード CALLBACK_URL=http://ローカル環境のURL/auth/twitter/callback |
web.phpは以下の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Route::get('/', 'Auth\OAuthLoginController@welcome'); //ログイン:ツイッターの認証にリダイレクト Route::get('auth/{provider}', 'Auth\OAuthLoginController@redirectToProvider'); //コールバック Route::get('auth/{provider}/callback', 'Auth\OAuthLoginController@handleProviderCallback'); //ログアウト Route::get('auth/twitter/logout', 'Auth\OAuthLoginController@logout')->name('twitter_logout'); //タイムライン取得 Route::get('/timelines', 'Auth\OAuthLoginController@index')->name('get_timelines'); //index表示 Route::get('/index', 'Auth\OAuthLoginController@index')->name('index.show'); |
ここからメインのコントローラーです。まずツイッターにログインするコントローラーです。OAuthLoginController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//ツイッターのログイン処理に移動 public function redirectToProvider($provider){ return Socialite::driver('twitter')->redirect(); } //認証後の処理 public function handleProviderCallback($provider){ $user = Socialite::driver('twitter')->user(); //ユーザー作成するかの判定 $authUser = User::findOrCreateUser($user,$provider); Auth::login($authUser, true); //$userからリクエストトークンを取得して、sessionに保存 session()->put('accessToken', [ 'oauth_token'=> $user -> token, 'oauth_token_secret'=> $user -> tokenSecret ]); return redirect('/index'); |
ここのコントローラーでは、初めてログインするユーザーはデータベースにユーザーを作成しています。
それがUser::findOrCreateUser($user,$provider);です。ユーザーを作成するかの判断とユーザー作成は下のApi.phpにまかせています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public static function findOrCreateUser($user,$provider){ //認証ユーザーがデータにあれば変数に代入 $authUser = User::where('twitter_id',$user->id)->first(); //変数にデータがあればそのままリターン if($authUser){ return $authUser; } //なければ作成 return User::create([ 'name' =>$user->name, 'twitter_name'=>$user->name, 'twitter_id'=>$user->id, 'avatar'=>$user->avatar ]); } |
続いてライムラインをviewします。ここのタイムラインとはあなたのタイムラインというわけでなく、ログインしたユーザーのタイムラインです。
OAuthLoginController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//タイムラインを取得してindexをview public function index(){ //timelines取得 $timelines = Api::getTimelines(); //errorがある場合welcome画面表示 if(array_has($timelines,'errors')){ return view('welcome'); }else{ //なければ、リツイートを省いたtimelines取得 $timelines= array_where($timelines, function ($timeline, $key) { return array_has($timeline,'retweeted_status') == false; }); } //sessionに保存 session()->put('timelines',$timelines ); return view('index',['timelines'=>$timelines]); } |
1 2 |
//timelines取得 $timelines = Api::getTimelines(); |
ツイッターAPIから取得したリツイートは、イイネが0になります。また同じ違う人は行った同じツイートのリツイートばかり取得する可能生もあったので、リツイートに関しては省きました。
timelinesの取得に関しては、下のApi.phpに任せています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//タイムライン取得メソッド public static function getTimelines(){ $user = Auth::user(); //sessionを取得 $accessToken = session()->get('accessToken'); //インスタンス生成 $twitter = new TwitterOAuth( env('TWITTER_CLIENT_ID'), env('TWITTER_CLIENT_SECRET'), //自分のAPI Key,API Secret $accessToken['oauth_token'], $accessToken['oauth_token_secret'] //ログイン者のアクセストークン ); $timelines = $twitter -> get('statuses/home_timeline',array( 'user_id'=>Auth::User() -> twitter_id, 'count' => 200, //200件取得 'exclude_replies' =>'true' //リプライは除く )); //タイムライン取得 return $timelines; } |
ちなみにviewのタイムライン表示部分ははこんな感じ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<div class="offset-sm-1 col-sm-8"> @foreach($timelines as $timeline) <div class="row border"> <div class="col-sm-1"> <img src="{{$timeline->user->profile_image_url}}"> </div> <div class="col-sm-11"> <a href="https://twitter.com/{{$timeline->user->screen_name}}/status/{{$timeline->id}}" target="_blank">{{ $timeline->user->name }}</a><br> <p>{{ $timeline->text }}</p> <div class="row"> <div class="align-self-center">イイネ:{{ $timeline->favorite_count }} リツイート:{{ $timeline->retweet_count }}</div> <div class="ml-4"> @include('layouts.favorite_button') </div> </div> </div> </div> @endforeach </div> |
記事は以上です。