前記事にて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)
ソース
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をインストールします。
composer require abraham/twitteroauth
TwitterAPIの使用準備
続けてBotで使用するTwitterアカウントの用意に入ります。
TwitterAPIを使用する場合、以下の手順が必要です。
TwitterAPI使用時の申請手順
- Twitterアカウントの作成
- プロフィールで電話番号の入力
- APIの申請
- キーを生成
- Elevated accessの申請(APIv1.1を使用する場合のみ)
まずはTwitterアカウントを作成し、以下からサインアップした上でAPIを申請。
続けて、ProjectのDashboardに移動し、「User authentication settings」からEditを選択。
以下のように入力。
- 「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にしか用意されていないので申請します。
以下の手順を参考に申請させていただきました。
DB設定
今回はSQLiteを使用したいので、DBの設定ファイル /config/database.php を編集します。
'default' => env('DB_CONNECTION', 'sqlite'),
プロジェクトフォルダ直下の.envも修正。
DB_CONNECTIONを"sqlite"、その下のDB_HOST〜DB_PASSWORDまでは削除します。
DB_CONNECTION=sqlite
続けて、touchコマンドでSQLite用の空のDBファイルを生成します。
touch database.sqlite
マイグレーション
Laravelはマイグレーションが使えるので、以下コマンドでマイグレーションファイルを生成。
今回はRTしたツイートを保存するtweetsテーブルを用意したいので、ファイル名はcreate_tweets_tableとしました。
php artisan make:migraion create_tweets_table
注意点として、Laravelのテーブル名は単語の複数形、モデルクラスは単数形にする必要があります。
これを間違えるとモデルとテーブル、コントローラの紐付けがうまくいきません。
作成したマイグレーションファイルは/database/migrations/以下にありますので、これを編集してup関数内にテーブルを定義します。
<?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');
}
};
$table->timestamps();を記述するとテーブル内のカラムに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
これで一通り準備が出来ました。
続いて実装に入ります。