Python × Selenium × Cloud Runで手軽にブラウザ操作botを作ってみよう!

アソビューでふるさと納税事業・ギフト事業の開発責任者をしております、川又です。

アソビューでは「アソビュー!」「ウラカタ」に次ぐ第3の主要サービスを目指し、 新規事業として「アソビュー!ふるさと納税」「アソビュー!ギフト」を展開しております。

furusato.asoview.com

store.asoview.com

これら新規事業の開発責任者とは名ばかりで、少数精鋭な開発チームなので私も第一線で様々なシステムの開発を行っています。 学生の頃からパソコンを駆使して身の回りの課題を解決することが好きだったため、これからも開発を続けて行きたいものです。

さて、今回はそんな私がプライベートで「とあるサイトでの予約を自動化したい」という怠惰願望から 自動でブラウザを操作し予約ボタンをポチッと押してくれるbotを開発しましたので、botを構築・デプロイするまでの流れをご紹介したいと思います。

※今回ご紹介するブラウザ操作botはアソビューのサービス開発とは全く関係ありません。

はじめに

世の中に様々な予約サービスが普及し、飲食店や病院の予約など、普段の生活で日常的に利用されていると思いますが

「あのお店の予約が煩雑で面倒なんだよね...」
「病院の予約が先着順で、いつも先を越されちゃう...」

こんなふうに感じたことはありませんか?

bot対策が行われているサイトについては自動予約が難しいですが、そうでないサイトであれば PythonとSelenium(Webブラウザの操作を自動化するフレームワーク)で自動で予約を行うことができます。

また、例えば特定の日時になったら予約が可能になるサイトであれば、botを予約可能時間の少し前に起動しておき、 予約可能時間になったら予約ボタンを押すようプログラムを組むことも可能です。

私の場合は、特定の日時に予約可能となるサイトを複数人で予約するケースがあったため、botを誰もが使えるようにデプロイする必要がありました。

今回はPython x Selenium で作成したbotをクラウド環境にデプロイし、任意のタイミングで動かせるようにする仕組みについてご紹介します。

開発する前の注意事項

botによる自動予約を行う前に、対象サイトの利用規約を必ず確認してください。多くのサイトでは、botによるアクセスを禁止している場合があります。規約違反はアカウント停止や法的措置につながる可能性があるため、必ず規約に従って予約を行いましょう。

実行環境について

先にデプロイするクラウド環境についてご紹介します。

Python x Seleniumを実行できるサーバーレスでなるべくコストがかからないクラウド環境、という観点からGoogle Cloudにて提供されているCloud Runを使用します。

Cloud Runはコンテナ化されたWebアプリケーションをサーバーレスで実行できるサービスです。 完全マネージド型で自動スケーリングに対応しており、デプロイしたWebアプリケーションにリクエストがあった時のみ課金されるという仕組みになっています。

リクエストを受け付けた際のCPUやメモリ使用量に依存しますが、毎月200万件リクエストまでは無料(2024年10月24日現在)であるため あまり複雑なbotを作成しない限りは無料で動かすことができます。

今回はCloud Runにデプロイする観点から、リクエストによってブラウザを起動し予約を行うAPI形式のbotを作成していきます。

ブラウザ操作botを作ってデプロイしてみよう

まずはbotとDockerイメージを作成してきます。

GoogleからCloud Runにデプロイするマイクロサービスのテンプレートが、Webアプリケーションの言語毎に用意されており、こちらを流用するのが一番手軽です。 Pythonであればcloud-run-microservice-template-pythonテンプレートが用意されていますので、こちらから新しいリポジトリを作成しましょう。

リポジトリの中で主に編集するファイルは以下になります。

  • Dockerfile : Dockerイメージの設定
  • requirements.txt : 必要なPythonパッケージを記載するファイル
  • app.py : botのソースコード

Dockerイメージの設定

Dockerfile に必要な設定を記載します。 テンプレートにはデフォルトで python:3.10.6-slim を実行できるイメージ設定がされていますので、必要に応じてPythonのバージョンを変更しましょう。

また、Seleniumを動かすためにはヘッドレスブラウザとして chrominium が必要になります。 以下を追記し、 chrominium をインストールする設定を行いましょう。

RUN apt-get update && apt-get install -y \
chromium chromium-driver

requirements.txt の設定

requirements.txt に必要なパッケージを記載します。 デフォルトで大体必要なパッケージが揃っているので、Seleniumを追記しましょう。

selenium==4.15.2   

app.pyの実装

最後に app.py にbot本体のソースコードを記載して行きましょう。 サンプルとして、URLを受け取りページにアクセスして予約ボタンを押すAPIを実装しています。

from flask import Flask, request, jsonify
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

app = Flask(__name__)

# ブラウザの設定
def create_chrome_driver():
    chrome_options = Options()
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--disable-dev-shm-usage")
    chrome_options.add_argument("--disable-gpu")
    driver = webdriver.Chrome(options=chrome_options)
    return driver

@app.route('/reserve', methods=['POST'])
def reserve():
    url = request.json.get('url')
    driver = create_chrome_driver()

    try:
        driver.get(url)
        time.sleep(3)
        reserve_button = driver.find_element("xpath", "//button[contains(text(), '予約')]")
        reserve_button.click()
        time.sleep(2)
        return jsonify({"status": "success", "message": "予約が完了しました"})
    except Exception as e:
        return jsonify({"status": "error", "message": str(e)})
    finally:
        driver.quit()

botをデプロイしてみる

さて、いよいよCloud Runにデプロイしてみましょう。 gcloud コマンドでデプロイする方法もありますが、今回はGoogle Cloudコンソールからデプロイしてみます。

まず、Cloud Runの「コンテナをデプロイ」から「サービス」を選択します。

次に「リポジトリから継続的にデプロイする」を選択し、作成したGitHubリポジトリを選択し、ビルドするブランチやビルドタイプを選択し保存を押します。

リージョンによって料金が変わる可能性がありますので、リージョンは特別な理由がない限りasia-northeastを選択しましょう。

公開APIのため認証では「未認証の呼び出しを許可」を、上り(内向きの制御では)「すべて」を設定しましょう。また、APIリクエスト時以外はオートスケールするように「リクエストの処理中にのみCPUを割り当てる」を設定しましょう。常にインスタンスを立ち上げる必要はないため、最小数も0で良いです。

作成ボタンを押せば、Cloud Buildによりビルドが実行され、デプロイまで自動で完了してくれます!botの修正を行いたい場合は、GitHubに作成したリポジトリを修正してpushすれば、自動でビルド・デプロイまでやってくれます!便利!!

APIのURLはサービスの詳細ページに記載してありますので、こちらにリクエストしてみてください。

さいごに

今回はPython x Selenium x Cloud Runでお手軽にbotを作成する流れをご紹介しました。botの実装を工夫すれば、ログインから予約までを自動で行ったり、特定の時間になったら予約ボタンを押すことも自由に行うことができます。 是非試してみてください。

業務でbot開発は行なっていませんが、アソビューではより良いプロダクトを世の中に届けられるよう共に挑戦していくエンジニアを募集しています。 カジュアル面談もやっておりますので、お気軽にエントリーください! お待ちしております。

www.asoview.com

speakerdeck.com