LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-12-04

前記事にて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 を編集します。

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

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

作成したマイグレーションファイルは/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');
    }
};

$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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0