WordPressプラグイン開発でSeleniumを利用するときの知見について

どうもふうやです。

今回は結構ニッチな記事を書いているつもりですが、実際にWordpressのプラグイン開発でSeleniumを利用する機会がある方の一人でも届いてもらえれば嬉しいなという気持ちでコアな部分をしっかり備忘録しておきます。

WordPressプラグイン開発の際にSeleniumを利用する場合の知見をまとめる

環境

  • レンタルサーバー
  • Python
  • PHP(Wordpress)
  • Selenium(PhantomJS)

仕組み

WordPress側で何かをフックした際にPython側でSeleniumを起動し任意の処理をアクションする仕組みです。

注意点

WordPressのプラグインとして開発するため、サーバー側のOSに都度対応しなくてはいけない。

Seleniumで起動したヘッドレスブラウザはエラーを吐くとゾンビタスク化するので、Python側でエラー時強制終了させなくてはいけない。

ソースコード

サーバー側のOSを考慮したプラグインにする

※サーバー側のOSによって参照するPhantomJS本体の実行ファイルが異なるため

またここで開発サポートが終了しているPhantomJSを敢えて選んでいるのは、ユーザーが利用するレンタルサーバーに無許可でChromeやFirefoxをインストールするのを避けるためです。

まずはPhantomJSの本体をダウンロードします。

Linux 64-bit、Linux 32-bitに加えて念の為、Windows本体もダウンロードしておきましょう。

ダウンロード完了後はプラグインフォルダの任意の場所にPhantomJSを格納しておきます。

今回の例では、プラグインフォルダ直下に”phantomjs”フォルダを作成し、その中に本体を格納しているとします。

実際のソースコードについては下記を参照して下さい。

PHP
<?php

$os_info = php_uname("s");

if($os_info == "Linux"){
  $bit = PHP_INT_SIZE;
  if($bit == 4){
    $os_info = $os_info . "-32bit";
  }else{
    $os_info = $os_info . "-64bit";
  }
}

$run_comand = 'python ../wp-content/plugins/プラグインフォルダの名前/init.py ' . $os_info . ' >&2 &';

exec($run_comand);

?>

php_uname関数にstring型のsを渡すと、サーバー側のOS情報が返ってきます。

OSがLinuxである場合はbit数も調べて、それ以外はWindowsという前提で進めます。

そして管理画面で実行していることを前提として(wp-adminフォルダがカレントフォルダ)pythonを実行しています。

そして末尾の” >&2 &”はエラーログを吐かせるコマンドです。

PHP側で返り値を必要としている場合は、必要に応じでごにょごにょしてください。

そしてPython側。

Python
# coding: utf-8

import os,sys

if sys.argv[1] == "Linux-32bit" :
    pjs_path = "../wp-content/plugins/プラグインフォルダの名前/phantomjs/phantomjs-32bit"
elif sys.argv[1] == "Linux-64bit" :
    pjs_path = "../wp-content/plugins/プラグインフォルダの名前/phantomjs/phantomjs-64bit"
else :
    pjs_path = "../wp-content/plugins/プラグインフォルダの名前/phantomjs/phantomjs.exe"

os.chmod(pjs_path, 0777)

phantomjsのパスを変数に格納して、実行するための権限を付与しています。

Seleniumを起動したりゾンビプロセス化させないためにエラー処理したり

そもそもユーザーが利用するサーバーに無許可でseleniumをインストールするのは非常識?なため、手動でseleniumライブラリを入手しましょう。

※gz形式の圧縮ファイルになっています。

ダウンロードして解凍したフォルダ名を”selenium”にリネームして、プラグインフォルダ直下に格納します。

そして、下準備としてデフォルトでWarningsエラーを吐くようになっているので、

selenium/webdriver/phantomjs/webdriver.pyの

Python
warnings.warn('Selenium support for PhantomJS has been deprecated, please use headless '
                      'versions of Chrome or Firefox instead')

という記述と、その下のtry文にある

Python
raise

をコメントアウトしておきましょう。

Python
# coding: utf-8

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

try:
	browser = webdriver.PhantomJS(executable_path=pjs_path)
	####任意の処理####
	browser.quit()
except Exception as e:
	browser.quit()

fromでインポートしている部分は必要なものだけでも構いません。

重要なのはPhantomJSを起動する際に本体のパスを手動で通すことと、何かしらのエラーが吐かれた場合に備えてtry文で必ず最後にはPhantomJSを強制終了させることです。

エラーが吐かれて尚且このように強制終了させないとPhantomJSがサーバー側でどんどんゾンビタスク化してしまうので注意が必要です。

まとめ

今回の事例は実際に自分が開発した際に躓いた点をまとめております。

自分はSSHの環境が無いレンタルサーバーでこれをテストしてしまい、ゾンビプロセスの排除に苦労してしまいました笑笑

そして、php.iniがおかしくなったり、、、、汗

とにかくはこんなニッチな事例ほとんど無いと思うのですが、1人の方でも参考にしてくれれば嬉しいなと思い書き残しました!

ありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です