前提条件#
- Ruby 3.0+ および Rails 7+
- Firecrawl APIキー — 無料で取得する
設定#
API キーを Rails の認証情報または環境変数に追加します。
export FIRECRAWL_API_KEY=fc-YOUR-API-KEYサービスを作成#
app/services/firecrawl_service.rb を作成します。
require "net/http"require "json"require "uri"class FirecrawlService BASE_URL = "https://api.firecrawl.dev/v2" def initialize(api_key: ENV.fetch("FIRECRAWL_API_KEY")) @api_key = api_key end def search(query, limit: 5) post("/search", { query: query, limit: limit }) end def scrape(url, **options) post("/scrape", { url: url }.merge(options)) end def interact(url, prompt, follow_up: nil) # 1. ブラウザセッションを開くためにスクレイピング scrape_result = scrape(url, formats: ["markdown"]) scrape_id = scrape_result.dig("data", "metadata", "scrapeId") # 2. 最初のプロンプトを送信 post("/scrape/#{scrape_id}/interact", { prompt: prompt }) # 3. フォローアッププロンプトを送信 result = nil if follow_up result = post("/scrape/#{scrape_id}/interact", { prompt: follow_up }) end # 4. セッションを閉じる delete("/scrape/#{scrape_id}/interact") result || scrape_result end private def post(endpoint, payload) uri = URI("#{BASE_URL}#{endpoint}") request = Net::HTTP::Post.new(uri) request["Authorization"] = "Bearer #{@api_key}" request["Content-Type"] = "application/json" request.body = payload.to_json response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http| http.request(request) end JSON.parse(response.body) end def delete(endpoint) uri = URI("#{BASE_URL}#{endpoint}") request = Net::HTTP::Delete.new(uri) request["Authorization"] = "Bearer #{@api_key}" Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http| http.request(request) end endendコントローラーを作成する#
コントローラーを生成します:
rails generate controller Firecrawl search scrape interact --skip-routesapp/controllers/firecrawl_controller.rb を編集します。
class FirecrawlController < ApplicationController skip_before_action :verify_authenticity_token def search service = FirecrawlService.new result = service.search(params.require(:query), limit: params.fetch(:limit, 5).to_i) render json: result end def scrape service = FirecrawlService.new result = service.scrape(params.require(:url)) render json: result end def interact service = FirecrawlService.new result = service.interact( params.require(:url), params.require(:prompt), follow_up: params[:followUp] ) render json: result endendルートを追加#
config/routes.rb で:
Rails.application.routes.draw do post "api/search", to: "firecrawl#search" post "api/scrape", to: "firecrawl#scrape" post "api/interact", to: "firecrawl#interact"end試してみる#
rails server# ウェブを検索するcurl -X POST http://localhost:3000/api/search \ -H "Content-Type: application/json" \ -d '{"query": "firecrawl web scraping"}'# ページをスクレイピングするcurl -X POST http://localhost:3000/api/scrape \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com"}'# ページを操作するcurl -X POST http://localhost:3000/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"}'
