2024.06.14
STAFF BLOG
スタッフブログ
TECHNICAL
テクログ
はじめに
chrome-php というPHPのパッケージがあり、こちらを使用すると下記のようなことができます。
・Chromeからウェブサイトにアクセス
・ページのスクリーンショットやPDFを作成
・特定の箇所をクリックする等のマウスイベントの実行
・ボタンやリンクを押下することでウェブサイト内をクロール
・JavaScriptの実行 等
環境構築
ディレクトリ構成です。
/
├─ docker/
│ └─ Dockerfile
├─ docker-compose.yml
└─ index.php
Dockerfileとdocker-compose.ymlファイルを作成します。
使用可能なPHPのバージョンは7.4.15と8.0.2がありますが、8.0.2だとchrome-phpのパッケージ内でエラーが出るので注意です。
FROM php:7.4.15-cli
COPY --from=composer /usr/bin/composer /usr/bin/composer
RUN apt update && apt install -y curl zip unzip wget
RUN cd /tmp && wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
RUN cd /tmp && apt install -y --fix-missing ./google-chrome-stable_current_amd64.deb
RUN apt install -y task-japanese
RUN apt install -y fonts-ipafont
RUN fc-cache -fv
services:
chrome-php:
image: chrome-php
container_name: chrome-php-container
build: ./docker
shm_size: '1gb'
tty: true
volumes:
- ./:/app
- /tmp/.X11-unix:/tmp/.X11-unix
environment:
- DISPLAY=$DISPLAY
- XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR
working_dir: /app
下記コマンドを実行します。
# イメージのビルドとコンテナの作成
docker-compose up -d
# chrome-phpをインストール
docker-compose exec chrome-php composer require chrome-php/chrome
サンプルコード
index.phpを作成します。
使用するのは chrome-php のページにあるサンプルを一部修正したコードです。
<?php
require_once __DIR__ . '/vendor/autoload.php';
use HeadlessChromium\BrowserFactory;
$browserFactory = new BrowserFactory('google-chrome');
// starts headless Chrome
$browser = $browserFactory->createBrowser([
'noSandbox' => true,
'headless' => true, // falseに変更するとブラウザが表示される
'customFlags' => [
'--remote-allow-origins=*',
'--disable-dev-shm-usage',
],
]);
try {
// creates a new page and navigate to an URL
$page = $browser->createPage();
$page->navigate('http://example.com')->waitForNavigation();
// get page title
$pageTitle = $page->evaluate('document.title')->getReturnValue();
// screenshot - Say "Cheese"! 😄
$page->screenshot()->saveToFile('./foo/bar.png');
// pdf
$page->pdf(['printBackground' => false])->saveToFile('./foo/bar.pdf');
} finally {
// bye
$browser->close();
}
index.phpを実行します。
docker-compose exec chrome-php php index.php
下記、実行される処理の内容です。
・http://example.com にアクセス
・ウェブページのタイトルを取得
・ウェブページのスクリーンショットを撮影して、./foo/bar.png に保存
・ウェブページのPDFファイルを作成して、./foo/bar.pdf に保存
よく使う処理
■ ボタンを押下
$page->mouse()->find('#button')->click(); // "#button"はセレクタ
ボタンの押下でページを遷移する場合、直後に下記の処理を追加する必要があります。
$page->waitForReload();
■ JavaScriptを実行
evaluateメソッドの引数に、JavaScriptの処理を文字列として渡します。
$page->evaluate('document.querySelector("h1").textContent')->getReturnValue();
おわりに
作業効率化のスクリプトを作成したり、E2Eテストなどで活用できそうです。