👩‍💻

RailsでPythonのbrowser-useを使う方法

に公開

RailsアプリケーションからPythonスクリプトを呼び出して
browser-useを使う方法を解説します。

概要

概要としては、Railsアプリケーションが置かれている
ルートディレクトリ下にPythonの仮想環境を作成。
Railsのrakeタスクから呼び出して実行する流れです。

前提条件

  • Ruby 3.4.2
  • Rails 8.0.2
  • Python 3.13.2
  • Gemini

Python3がすでにインストールされている前提でお話しします。
今回Geminiを使っています。
事前にGoogle AI StudioからAPIキーを取得し、credentialsに記述しておいてください。

セットアップ手順

まずはPythonの環境をセットアップしていきます

Pythonの仮想環境作成

Pythonはvenvという仮想環境を作ってプラグインなどのインストールを行うようです。

Rails でいう venv(Pythonの仮想環境)に相当するのは、Bundler(と Gemfile)による依存管理 + rbenv や rvm によるRubyバージョンの切り分けです。

ChatGPTより

$ python3 -m venv venv
$ source venv/bin/activate

browser-useのインストール

仮想環境に入った状態でインストールします。

# 仮想環境にbrowser-useなどのPythonパッケージをインストール
$ pip install browser-use requests playwright
# Playwright に必要なブラウザ(Chromium など)をインストール
$ python -m playwright install

requests: PythonでHTTP通信を行うためのライブラリです
playwright: browser-useが内部的に使っているため必要となるブラウザ操作ライブラリです。

browser-useを使う

今回は/script配下のPythonスクリプトを、
lib/tasksに置いたRakeタスクから呼びだして実行します。

my_app
├── app
├── lib
│   └── tasks
|       └──sample.rake
└── script
    └── sample.py

Pythonスクリプトを書く

こちらでは実際にbrowser-useを使って検索するスクリプトを書いていきます。
なお、今回のコードは実際の実装で書いたコードではありません。
このコードでの動作確認は行っておりませんのでご注意ください。

from langchain_google_genai import ChatGoogleGenerativeAI
from browser_use import Agent
import asyncio


async def main():
    agent = Agent(
        task="Googleで東京の最新の天気予報を調べて教えてください",
        llm=ChatGoogleGenerativeAI(model="gemini-2.0-flash-exp"),
    )
    result = await agent.run()
    print(result)


asyncio.run(main())

rakeタスクを書く

本題のRails側から呼び出して実行する方法です。
rakeタスク内でPythonスクリプトを実行します。

require "open3"

namespace :sample do
  desc '今日の天気を調べる'
  task fetch: :environment do
    gemini_api_key = Rails.application.credentials.dig(:gemini, :api_key)
    script_path = Rails.root.join("script", "sample.py")

    # Pythonスクリプト実行
    cmd = ["venv/bin/python", script_path.to_s]
    env = { "GEMINI_API_KEY" => gemini_api_key }
    stdout, stderr, status = Open3.capture3(env, *cmd)

    if status.success?
      puts "#{stdout.strip}"
    else
      puts "#{status}"
    end
  end
end

順番に解説します。

    gemini_api_key = Rails.application.credentials.dig(:gemini, :api_key)
    script_path = Rails.root.join("script", "sample.py")

ここで事前にcredentialsに登録しておいたAPIキーを呼び出します。
今回はGeminiなのでgemini_api_keyとしました。
script_pathにはPythonファイルのパスをしてしています。

    cmd = ["venv/bin/python", script_path.to_s]
    env = { "GEMINI_API_KEY" => gemini_api_key }
    stdout, stderr, status = Open3.capture3(env, *cmd)

Open3でコマンドを実行し、Pythonスクリプトを動かします。
capture3を使っているのは、このあとの実行結果を表示させるためなので、
ここは用途に合わせて使い分けてください。

    if status.success?
      puts "#{stdout.strip}"
    else
      puts "#{status}"
    end

実行結果を表示しています。

おまけ

Pythonの環境のためにvenvを使っており、おそらくルートディレクトリ下にvenvディレクトリが作られているかと思います。
これはGitHubなどのリモートリポジトリにはあげないほうが良いそうなので、
代わりに以下の方法でrequirements.txtを作成してあげてください。

$ pip freeze > requirements.txt

Discussion