twitter oauth2 でログインして、ツイートさらにトークンの更新

参考
https://qiita.com/ma7ma7pipipi/items/45f7177c99ea3934a7e2

# リフレッシュトークンを用いて、アクセストークンを更新。

2時間しかアクセストークンは保持できないらしい。
また、リフレッシュトークンは6ヶ月？

今回は、2時間で終わってしまうアクセストークン、並びにリフレッシュトークンを使おう。

```hoge_controller.php
$twi2 = new Twiv2(296640879);//oauth2.0 認証済みの social_id
$twi2->tweet("ツイートテストだ".time());
```

```Twiv2.php

<?php

namespace App\Models;

use App\Models\Social;
use Carbon\Carbon;
use GuzzleHttp\Client as Gclient;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Http;
use Abraham\TwitterOAuth\TwitterOAuth;

class Twiv2 extends Model
{
    protected $guarded = ['hoge2'];
    public $client;
    public $social;

    public function __construct($social_id)
    {
        $sql = Social::query()//単数形 User
            ->where('id',$social_id);

        //結果に関わらずtokenを更新
        //refleshtokenの期限が切れそうなものは、別途cronなどで更新していくか
        //更新した場合は、もう一度DBから結果を取得
        $social = $sql->first();

        if(self::refreshToken($social)){
            $social = $sql->first();
        }

        $this->client = new TwitterOAuth(
            env('TWITTER_CLIENT_ID'),
            env('TWITTER_CLIENT_SECRET'),
            null,
            $social->token,
        );

        $this->client->setApiVersion("2");
        $this->social = $social;

        parent::__construct();
    }



//    期限切れで更新した場合は true
    public function refreshToken($social)
    {
        $now = new Carbon();

        //日時比較
        $target = new Carbon($social->expires_in);//比較したい日付

        if($target < $now){

            $tokenUrl = 'https://api.twitter.com/2/oauth2/token';

            $client = new Gclient();
            try {
                // トークン更新のリクエスト
                $response = $client->post($tokenUrl, [
                    'auth' => [env('TWITTER_CLIENT_ID'), env('TWITTER_CLIENT_SECRET')],
                    'form_params' => [
                        'grant_type' => 'refresh_token',
                        'refresh_token' => $social->refresh_token,
                        'client_id' => env('TWITTER_CLIENT_ID'),
                    ],
                    'headers' => [
                        'Accept' => 'application/json',
                    ],
                ]);

                // レスポンスの処理
                $responseData = json_decode($response->getBody(), true);

                //        更新
                $model = Social::firstOrNew(['id' => $social->id]);
                $model->token = $responseData['access_token'];
                $model->refresh_token = $responseData['refresh_token'];
                $now = Carbon::now();
                $futureTime = $now->addSeconds($responseData['expires_in']);//7200プラスして有効期限を伸ばす
                $model->expires_in = $futureTime->toDateTimeString();
                $model->save();

//                echo "アクセストークンが更新されました。";
            } catch (Exception $e) {
//                echo "トークンの更新中にエラーが発生しました: " . $e->getMessage();
            }

            return true;

        } else {
            return false;
        }

    }

    public function tweet($text)
    {
        $res = $this->client->post("tweets", ["text" => $text], true); # trueを忘れないよう
        return $res;
    }


}


```

こんな感じでアクションを起こす前にかならず
トークンが最新かどうかを確認してからツイートをしていく。