PHP + Laravel でTwitterBot作成 #1『事前準備』

<a href = "https://qiita.com/H_Tsukamoto/items/b2a76f8dcc3fd2995e28">前記事</a>にてNode.jsで作ったBotをPHP Laravelで改めて作成したいと思います。

### Botの仕様
- 特定ジャンルの100RT以上のツイートを自動でリツイートする
- 同一ソースで別ジャンルのBotも作成可能にする

### BotのTwitterアカウント

https://twitter.com/foot_rt_bot (ジャンル：サッカー)



### 環境
- 言語： PHP 8.1
- フレームワーク： Laravel (9.42.2)
- DB： SQLite 
- Twitter操作用ライブラリ: twitteroauth
- IDE: VSCode
- OS: MacOS X 12.6 (M1)

### ソース

https://github.com/tsubame/FootRTBot-PHP

　
# Laravelのインストール

composerでLaravelをグローバル環境にインストール。
```
composer global require laravel/installer     
```

　
# プロジェクト作成

以下コマンドでプロジェクトを作成。

```
composer create-project --prefer-dist laravel/laravel FootRTBot
```

"Larevel new"でもプロジェクトが作成できますが、私の環境ではうまく動きませんでした。

以下コマンドを実行し、http://localhost:8000/ にアクセスし、トップページが表示されることを確認。
```
cd FootRTBot
php artisan serve
```
　

# TwitterOAuthのインストール

TwitterAPI操作用のTwitterOAuthをインストールします。

https://twitteroauth.com/

```
composer require abraham/twitteroauth  
```

　
# TwitterAPIの使用準備

続けてBotで使用するTwitterアカウントの用意に入ります。
TwitterAPIを使用する場合、以下の手順が必要です。

:::note warn 
<strong>TwitterAPI使用時の申請手順</strong>
- Twitterアカウントの作成
- プロフィールで電話番号の入力
- APIの申請
- キーを生成
- Elevated accessの申請（APIv1.1を使用する場合のみ）
:::

まずはTwitterアカウントを作成し、以下からサインアップした上でAPIを申請。

https://developer.twitter.com/en/docs/twitter-api/getting-started/getting-access-to-the-twitter-api

続けて、ProjectのDashboardに移動し、「User authentication settings」からEditを選択。

https://developer.twitter.com/en/portal/dashboard

以下のように入力。

- 「App permissions」 … "Read and Write"
- 「Type of App」 … "Web App, Automated App or Bot"
- 「CallbackURL、WebSiteURL」 … "https://twitter.com/" 

これでAPIに必要なClientID、ClientSecretが発行されるので忘れずにメモします。
続けて、Dashboardの「Keys And Tokens」から「Access Token and Secret」を生成し、メモしておきます。
APIv2を使用する場合はここまでの手順でOKです。

ただ、APIv1.1を使用したい場合は「Elevated access」の申請が必要です。
今回はTwitterのトレンドを取得したい処理があり、トレンド用のAPIはv1.1にしか用意されていないので申請します。
以下の手順を参考に申請させていただきました。

https://tensei-shinai.com/2022/04/27/twitter-api-elevated/

　
# DB設定

今回はSQLiteを使用したいので、DBの設定ファイル /config/database.php を編集します。


```database.php
    'default' => env('DB_CONNECTION', 'sqlite'),
```

プロジェクトフォルダ直下の.envも修正。
DB_CONNECTIONを"sqlite"、その下のDB_HOST〜DB_PASSWORDまでは削除します。
```.env
DB_CONNECTION=sqlite
```
続けて、touchコマンドでSQLite用の空のDBファイルを生成します。

```
touch database.sqlite
```
　
# マイグレーション

Laravelはマイグレーションが使えるので、以下コマンドでマイグレーションファイルを生成。
今回はRTしたツイートを保存するtweetsテーブルを用意したいので、ファイル名はcreate_tweets_tableとしました。

```
php artisan make:migraion create_tweets_table
```

注意点として、<strong>Laravelのテーブル名は単語の複数形、モデルクラスは単数形</strong>にする必要があります。
これを間違えるとモデルとテーブル、コントローラの紐付けがうまくいきません。

作成したマイグレーションファイルは/database/migrations/以下にありますので、これを編集してup関数内にテーブルを定義します。

```create_tweets_table.php
<?php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{

    /**
     * テーブル生成用マイグレーション
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tweets', function (Blueprint $table) {
            // ID            
            $table->increments('id');
            // Twitter内の数値形式のID
            $table->string('id_str_in_twitter');
            // Twitterアカウント名　例：田中
            $table->string('user_name');
            // Twitter内のユーザの文字列形式のID 	例：@test
            $table->string('user_screen_name');            
            // 本文
            $table->string('tweet_text');  
            // RT数
            $table->integer('rt_count');
            // クライアント名
            $table->string('client_name');  
            // 投稿日時
            $table->dateTime('posted_date');
            // DB登録、更新日時
            $table->timestamps();
        });
    }

    /**
     * テーブル削除用マイグレーション
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tweets');
    }
};
```

<strong>$table->timestamps();</strong>を記述するとテーブル内のカラムにcreated_at, updated_atが用意され、それぞれレコード作成日時、レコード更新日時が自動的にセットされます。

この状態でmigraion実施。
```
php artisan migrate
```
これでSQLiteDBにtweetsテーブルが生成されました。
　
　
# ORM用のモデルを生成

次にORM（Object-Relational Mapping）用のモデルクラスTweetを以下コマンドで生成します。

```
php artisan make:model Tweet
```

これでTweetモデルはTweetsテーブルに自動的に関連付けされます。

　
# コントローラ生成

以下コマンドでTweetモデルに対応するコントローラを生成。

```
php artisan make:controller TweetController
```

これで一通り準備が出来ました。
続いて実装に入ります。