はじめに
本記事では、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 でアプリを作成し、
以下のキーを取得してください。
- API Key(Consumer Key)
- API Secret Key(Consumer Secret)
- Bearer Token
- Access Token
- 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
<?phpnamespace 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
<?phpnamespace 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 11 で Twitter API v2 に対応したスケジュール投稿を実装しました。
従来の API v1.1 ではなく、“tweets” エンドポイントを使用し、
より最新の方法でツイートを投稿できます。
✅ 今後の拡張
- 画像付きツイートの投稿
- スレッド投稿の実装
- エラーハンドリングの強化