前提条件#
- Laravel 10+ のプロジェクト
- Firecrawl APIキー — 無料で取得する
設定#
.env に API key を追加します。
FIRECRAWL_API_KEY=fc-YOUR-API-KEYconfig/services.php に設定項目を追加します:
'firecrawl' => [ 'api_key' => env('FIRECRAWL_API_KEY'), 'base_url' => env('FIRECRAWL_API_URL', 'https://api.firecrawl.dev/v2'),],サービスクラスを作成#
app/Services/FirecrawlService.php を作成します:
<?phpnamespace App\Services;use Illuminate\Support\Facades\Http;class FirecrawlService{ private string $apiKey; private string $baseUrl; public function __construct() { $this->apiKey = config('services.firecrawl.api_key'); $this->baseUrl = config('services.firecrawl.base_url'); } public function search(string $query, int $limit = 5): array { $response = Http::withToken($this->apiKey) ->post("{$this->baseUrl}/search", [ 'query' => $query, 'limit' => $limit, ]); return $response->json(); } public function scrape(string $url, array $options = []): array { $response = Http::withToken($this->apiKey) ->post("{$this->baseUrl}/scrape", array_merge(['url' => $url], $options)); return $response->json(); } public function interact(string $url, string $prompt, ?string $followUp = null): array { // 1. ブラウザセッションを開くためにスクレイピング $scrapeResult = $this->scrape($url, ['formats' => ['markdown']]); $scrapeId = $scrapeResult['data']['metadata']['scrapeId']; // 2. 最初のプロンプトを送信 Http::withToken($this->apiKey) ->post("{$this->baseUrl}/scrape/{$scrapeId}/interact", [ 'prompt' => $prompt, ]); // 3. フォローアッププロンプトを送信 $result = null; if ($followUp) { $result = Http::withToken($this->apiKey) ->post("{$this->baseUrl}/scrape/{$scrapeId}/interact", [ 'prompt' => $followUp, ])->json(); } // 4. セッションを閉じる Http::withToken($this->apiKey) ->delete("{$this->baseUrl}/scrape/{$scrapeId}/interact"); return $result ?? $scrapeResult; }}コントローラーを作成#
app/Http/Controllers/FirecrawlController.php を作成します:
<?phpnamespace App\Http\Controllers;use App\Services\FirecrawlService;use Illuminate\Http\Request;class FirecrawlController extends Controller{ public function __construct(private FirecrawlService $firecrawl) {} public function search(Request $request) { $validated = $request->validate(['query' => 'required|string']); return response()->json( $this->firecrawl->search($validated['query'], $request->input('limit', 5)) ); } public function scrape(Request $request) { $validated = $request->validate(['url' => 'required|url']); return response()->json($this->firecrawl->scrape($validated['url'])); } public function interact(Request $request) { $validated = $request->validate([ 'url' => 'required|url', 'prompt' => 'required|string', ]); return response()->json( $this->firecrawl->interact( $validated['url'], $validated['prompt'], $request->input('followUp') ) ); }}ルートを登録する#
routes/api.php で:
use App\Http\Controllers\FirecrawlController;Route::post('/search', [FirecrawlController::class, 'search']);Route::post('/scrape', [FirecrawlController::class, 'scrape']);Route::post('/interact', [FirecrawlController::class, 'interact']);試す#
php artisan serve# ウェブを検索するcurl -X POST http://localhost:8000/api/search \ -H "Content-Type: application/json" \ -d '{"query": "firecrawl web scraping"}'# ページをスクレイピングするcurl -X POST http://localhost:8000/api/scrape \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com"}'# ページをInteractするcurl -X POST http://localhost:8000/api/interact \ -H "Content-Type: application/json" \ -d '{"url": "https://www.amazon.com", "prompt": "Search for iPhone 16 Pro Max", "followUp": "Click on the first result and tell me the price"}'
