【Laravel 11対応】Twitter API v2でツイートをスケジュール投稿する方法【キュー活用】

はじめに

本記事では、Laravel 11 を使用し、Twitter API v2 に対応したスケジュール投稿の方法を紹介します。
従来の statuses/update エンドポイントではなく、Twitter API v2 の “tweets” エンドポイントを利用します。

使用する技術

  • Laravel 11
  • Twitter API v2
  • abraham/twitteroauth ライブラリ
  • Laravelのキューワーカー(非同期処理)

Twitter API v2のセットアップ

Twitter API v2 を使用するには、Twitter Developer Portal でアプリを作成し、
以下のキーを取得してください。

  1. API Key(Consumer Key)
  2. API Secret Key(Consumer Secret)
  3. Bearer Token
  4. Access Token
  5. Access Token Secret

🔗 Twitter APIの取得方法については、以下の記事を参考にしてください。
Twitter API v2の取得と設定方法

取得したAPIキーを .env に設定します。

TWITTER_CONSUMER_KEY=your_consumer_key
TWITTER_CONSUMER_SECRET=your_consumer_secret
TWITTER_BEARER_TOKEN=your_bearer_token
TWITTER_ACCESS_TOKEN=your_access_token
TWITTER_ACCESS_SECRET=your_access_secret

必要なパッケージのインストール

Twitter APIとの連携には abraham/twitteroauth を使用します。

composer require abraham/twitteroauth

composer.json には以下のように記載されます。

"require": {
"php": "^8.3",
"abraham/twitteroauth": "^7.0",
"laravel/framework": "^11.31"
}

Twitter APIを扱うリポジトリの作成(API v2対応)

statuses/update は API v1.1 のエンドポイントですが、API v2 では tweets エンドポイントを使用します。

app/Repositories/InitTwitterRepository.php

<?php

namespace App\Repositories;

use Abraham\TwitterOAuth\TwitterOAuth;

final class InitTwitterRepository
{
protected TwitterOAuth $connection;

/**
* Twitter API v2 に接続するためのコンストラクタ
*/
public function __construct()
{
$this->connection = new TwitterOAuth(
config('services.twitter.consumer_key'),
config('services.twitter.consumer_secret'),
config('services.twitter.access_token'),
config('services.twitter.access_secret')
);

// API v2 を使用するために Bearer Token をセット
$this->connection->setApiVersion('2');
}

/**
* Twitter API v2 でツイートを投稿する
*
* @param string $message 投稿するツイートの本文
* @return bool 成功時は true, 失敗時は false
*/
public function postTweet(string $message): bool
{
$response = $this->connection->post('tweets', [
'text' => $message
], true); // API v2 の場合は true を指定

// エラー処理
if ($this->connection->getLastHttpCode() == 201) {
return true; // 成功
} else {
\Log::error('Twitter API Error: ' . json_encode($response));
return false; // 失敗
}
}
}

💡 ポイント

  • Twitter API v2 を利用 (setApiVersion('2'))
  • tweets エンドポイントを使用
  • APIレスポンスをチェックし、成功したら true を返す

投稿処理を非同期で実行するキュージョブ

キューを使用して非同期でTwitter投稿を実行します。

app/Jobs/PostToTwitterJob.php

<?php

namespace App\Jobs;

use App\Repositories\InitTwitterRepository;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class PostToTwitterJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

protected string $message;

/**
* ジョブのコンストラクタ
*
* @param string $message 投稿するツイートの本文
*/
public function __construct(string $message)
{
$this->message = $message;
}

/**
* ジョブの実行処理(Twitterに投稿する)
*
* @param InitTwitterRepository $twitterRepository
* @return void
*/
public function handle(InitTwitterRepository $twitterRepository)
{
if (!$twitterRepository->postTweet($this->message)) {
\Log::error('Twitter投稿に失敗しました: ' . $this->message);
}
}
}

スケジュール投稿のコントローラー

ユーザーがツイートを予約投稿できるAPIエンドポイントを作成します。

app/Http/Controllers/CreateScheduledTwitterPostController.php

<?php

namespace App\Http\Controllers;

use App\Jobs\PostToTwitterJob;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

final class CreateScheduledTwitterPostController
{
/**
* ツイートの予約投稿を受け付ける
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function scheduleTweet(Request $request)
{
// バリデーション
$validator = Validator::make($request->all(), [
'message' => 'required|string|max:280', // ツイートは280文字まで
'scheduled_at' => 'required|date' // 予約時間は日付型
]);

if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 400);
}

// 指定時間までの遅延を計算
$delay = now()->diffInSeconds($request->scheduled_at, false);
PostToTwitterJob::dispatch($request->message)->delay($delay);


// 最新のジョブIDを取得 ※同時実行が多いと他のジョブのIDを取得するリスクあり。
$jobId = DB::table('jobs')->latest('id')->value('id');
Log::info('JobId: '. $jobId);

return response()->json(['message' => 'Tweet scheduled successfully']);
}
}

キューの設定と実行

キューを利用するために、データベースドライバを設定し、マイグレーションを実行します。

php artisan queue:table
php artisan migrate

キューをリスンするには、以下のコマンドを実行します。

php artisan queue:work

CRONでキューワーカーを自動起動

予約ツイートを確実に実行するため、CRONジョブでキューを定期実行します。

* * * * * php /path-to-project/artisan schedule:run >> /dev/null 2>&1

まとめ

この記事では、Laravel 11Twitter API v2 に対応したスケジュール投稿を実装しました。
従来の API v1.1 ではなく、“tweets” エンドポイントを使用し、
より最新の方法でツイートを投稿できます。

今後の拡張

  • 画像付きツイートの投稿
  • スレッド投稿の実装
  • エラーハンドリングの強化