脱ExcelVBA !PHP で「SPAT4自動投票 システム」を作ってみました(その1:キホンの「キ」)
もうかれこれ6年近く前のネタなんですがね…
「Excel VBAで「SPAT4自動投票システム」を作ってみました。」
という過去ネタがよく読まれておりまして。
あー…やっぱり自動投票システムほしいっすよね。
この過去ネタ、
ExcelVBAをつかって、しかもInternetExplorerを使うっていう
今ではありえないようなアプリケーション構成。
今、管理人の自宅ではこれを派生させて
VB.netで作って、Chromeブラウザで動かしていますが…
もうちょっと手軽に使えないもんかなぁ…ということで
25年近くPHPというプログラム言語を使い続けているPHP信者の管理人が
PHPのWebDriverを使って、Windowsでデフォルトのブラウザ「Edge」を使うように
新たに作り直しました。
皆さまのご参考になれば。
---
今回も最初に書いておきます。
・このプログラムで何か問題が起きても、管理人は責任を負いません。
馬券購入についても当然ですが各個人の責任です。ごちゃごちゃ文句言わないでください。
・ある程度のプログラミングとかの知識がある方を前提にしています。
プログラムの内容についての質問等にはあまり答える気はありません。
わからないことがあれば、個人でググって調べてください。
・自由に改変とかしてください。これで商売されるのも勝手にやってください。
ただ管理人は何の責任もとりません。
何かで紹介するなら『「The Sunday Breeze」のやつを参考にした』程度でも
ひとこと書いてもらえると嬉しいです。強制ではないです。
今回追加
・予想のロジックは自分で考えてください。
それこそ管理人は知らんがな。
・以下ソースを書いていきますが、シングルクオーテーション(’)と円マーク(¥)については
すべて全角にしてますんで…半角に置換してから書いてくださいね。
---
●プログラムを動かす前の前提条件
・PHPが動く環境であること
わからなければこのへんを参考にどうぞ。「6」まででOK。
ここはそんなに障壁にはならないはず。
・composerのインストール、composerを使ってphp-webdriver/webdriverがインストールされていること
ここに書いてある「4」と「5」だけでOK。
(StandAloneのSeleniumは不要)
環境によってはコマンドが違うけど…それは自分で調べてよ。
●基本動作まで(WebDriverのバージョン確認とブラウザ起動まで)
・おまじない(何も考えずに書いておけってこと)
・EdgeのWebDriverのバージョンを確認
shell_execで実際にドライバをたたいてバージョンを見るっていう原始的な方法。
・Edgeブラウザのバージョンを確認
こちらはレジストリからバージョンを確認。
・ブラウザのバージョンとWebDriverのバージョンが違うなら最新版のWebDriverをダウンロード
Zipをダウンロードして解凍して配置するってのはPowerShellをたたく
この時点で、インストールされているEdgeブラウザとPHPのWebDriverまでが準備完了。
・WebDriverを起動する
これもかなり原始的な方法。Seleniumを使わないなら(たぶん)これしか方法がない。
別でコマンドプロンプトから起動してもいいけどね。
・とりあえずPHPから制御できるEdgeブラウザを立ち上げてみますか
この時点でブラウザが立ち上がらないようなら…ググってください。
ちゃんと環境が整っていれば、ブラウザが勝手に立ち上がっているはずです。
---
●メインの処理(SPAT4サイトを開いて、コマンドごとに振り分ける)
基本的には過去ExcelVBAとIEでやってたことと変わりません。
この時は投票のみでしたが、
現在は「入金」「投票」「照会」をできるようにしてます。
なのでこのプログラムを動かすときの引数として
ってな感じで。
$argv[5]はあとで出てきます。
・「SPAT4」サイトを開いてログインする
そんなに難しいことではありません。詳しくは過去ネタを見てください。
VBで書いてた
と同じ。ちょっと書き方が変わっただけ。
これでSPAT4にログインして、メイン画面が出てきたはず。
・「入金」「投票」「照会」で処理を振り分ける
ここで紹介するほどのことでもないですけど…
メインの処理は以上。各処理は関数にしてます。
各処理の関数は明日以降ちょっとずつ書いていきます。
「Excel VBAで「SPAT4自動投票システム」を作ってみました。」
という過去ネタがよく読まれておりまして。
あー…やっぱり自動投票システムほしいっすよね。
この過去ネタ、
ExcelVBAをつかって、しかもInternetExplorerを使うっていう
今ではありえないようなアプリケーション構成。
今、管理人の自宅ではこれを派生させて
VB.netで作って、Chromeブラウザで動かしていますが…
もうちょっと手軽に使えないもんかなぁ…ということで
25年近くPHPというプログラム言語を使い続けているPHP信者の管理人が
PHPのWebDriverを使って、Windowsでデフォルトのブラウザ「Edge」を使うように
新たに作り直しました。
皆さまのご参考になれば。
---
今回も最初に書いておきます。
・このプログラムで何か問題が起きても、管理人は責任を負いません。
馬券購入についても当然ですが各個人の責任です。ごちゃごちゃ文句言わないでください。
・ある程度のプログラミングとかの知識がある方を前提にしています。
プログラムの内容についての質問等にはあまり答える気はありません。
わからないことがあれば、個人でググって調べてください。
・自由に改変とかしてください。これで商売されるのも勝手にやってください。
ただ管理人は何の責任もとりません。
何かで紹介するなら『「The Sunday Breeze」のやつを参考にした』程度でも
ひとこと書いてもらえると嬉しいです。強制ではないです。
今回追加
・予想のロジックは自分で考えてください。
それこそ管理人は知らんがな。
・以下ソースを書いていきますが、シングルクオーテーション(’)と円マーク(¥)については
すべて全角にしてますんで…半角に置換してから書いてくださいね。
---
●プログラムを動かす前の前提条件
・PHPが動く環境であること
わからなければこのへんを参考にどうぞ。「6」まででOK。
ここはそんなに障壁にはならないはず。
・composerのインストール、composerを使ってphp-webdriver/webdriverがインストールされていること
ここに書いてある「4」と「5」だけでOK。
(StandAloneのSeleniumは不要)
環境によってはコマンドが違うけど…それは自分で調べてよ。
●基本動作まで(WebDriverのバージョン確認とブラウザ起動まで)
・おまじない(何も考えずに書いておけってこと)
require_once(’vendor/autoload.php’); // 環境によってパスが変わる
use Facebook¥WebDriver¥Chrome¥ChromeOptions;
use Facebook¥WebDriver¥Remote¥DesiredCapabilities;
use Facebook¥WebDriver¥Remote¥RemoteWebDriver;
use Facebook¥WebDriver¥Remote¥RemoteTargetLocator;
use Facebook¥WebDriver¥WebDriverBy;
use Facebook¥WebDriver¥WebDriverSelect;・EdgeのWebDriverのバージョンを確認
shell_execで実際にドライバをたたいてバージョンを見るっていう原始的な方法。
// $edgeDriverPath にmsedgedriver.exeのパスを指定
$edgeDriverPath = ’C:¥tako¥¥ika¥msedgedriver.exe’; // 環境によってパスが変わる
$driverDirectory = dirname($edgeDriverPath); // あとで使う
$output = @shell_exec($edgeDriverPath . ’ --version’);
if (@preg_match(’/(¥d¥+.¥d¥+.¥d¥+.¥d¥+)/’, $output, $matches)) {
$version_driver = $matches[1];
} else {
$version_driver = null;
}
echo "Driver Version : $version_driver¥n";・Edgeブラウザのバージョンを確認
こちらはレジストリからバージョンを確認。
$output = shell_exec("reg query ¥"HKEY_CURRENT_USER¥Software¥MicrosoftEdge¥BLBeacon¥" /v version");
if (preg_match(’/(¥d¥+.¥d¥+.¥d¥+.¥d¥+)/’, $output, $matches)) {
$version_browser = $matches[1];
} else {
$version_browser = null;
}
echo "Browser Version : $version_browser¥n";・ブラウザのバージョンとWebDriverのバージョンが違うなら最新版のWebDriverをダウンロード
Zipをダウンロードして解凍して配置するってのはPowerShellをたたく
if ($version_driver != $version_browser) {
echo "Update WebDriver...¥n";
// PowerShellでブラウザと同じバージョンのWebDriverをダウンロードして解凍する
$updateCommand = "powershell -Command ¥"Invoke-WebRequest -Uri ’https://msedgedriver.microsoft.com/".$version_browser."/edgedriver_win64.zip’ -OutFile ’edgedriver.zip’; " .
"Expand-Archive -Path ’edgedriver.zip’ -DestinationPath ’$driverDirectory’ -Force; " .
"Remove-Item ’edgedriver.zip’¥"";
exec($updateCommand, $output, $rtn);
if ($rtn !== 0) {
die("Failed Update WebDriver. ".$rtn);
}
echo "Succeeded Update WebDriver.¥n";
}この時点で、インストールされているEdgeブラウザとPHPのWebDriverまでが準備完了。
・WebDriverを起動する
これもかなり原始的な方法。Seleniumを使わないなら(たぶん)これしか方法がない。
別でコマンドプロンプトから起動してもいいけどね。
pclose(popen("start /B ".$edgeDriverPath." --port=9515", ’r’));・とりあえずPHPから制御できるEdgeブラウザを立ち上げてみますか
$options = new ChromeOptions();
$options->setBinary(’C:¥Program Files (x86)¥Microsoft¥Edge¥Application¥msedge.exe’); // Edgeブラウザ本体のパス
$capabilities = DesiredCapabilities::chrome();
$capabilities->setCapability(ChromeOptions::CAPABILITY, $options);
$capabilities->setBrowserName(’MicrosoftEdge’);
$capabilities->setPlatform(’WINDOWS’);
$driver = RemoteWebDriver::create(’http://localhost:9515’, $capabilities);この時点でブラウザが立ち上がらないようなら…ググってください。
ちゃんと環境が整っていれば、ブラウザが勝手に立ち上がっているはずです。
---
●メインの処理(SPAT4サイトを開いて、コマンドごとに振り分ける)
基本的には過去ExcelVBAとIEでやってたことと変わりません。
この時は投票のみでしたが、
現在は「入金」「投票」「照会」をできるようにしてます。
なのでこのプログラムを動かすときの引数として
// ****************************************
// SPAT4自動投票スクリプト
// ****************************************
// 引数
// [1] コマンド(depo,vote,inquiryのどれか)
// [2] 加入者番号
// [3] 利用者ID
// [4] 暗証番号
// [5] 入金額(depoのとき)
// 投票内容が書かれたファイルのフルパス(voteのとき)
// 日付YYYYMMDD(inquiryで過去分を取得するとき)
$command = $argv[1];
$userName = $argv[2];
$userId = $argv[3];
$userPass = $argv[4];ってな感じで。
$argv[5]はあとで出てきます。
・「SPAT4」サイトを開いてログインする
そんなに難しいことではありません。詳しくは過去ネタを見てください。
// SPAT4のログイン画面を開く
$driver->get(’https://www.spat4.jp/keiba/pc’);
// ログイン
$driver->findElement(WebDriverBy::id(’MEMBERNUMR’))->sendKeys($userName);
$driver->findElement(WebDriverBy::id(’MEMBERIDR’))->sendKeys($userId);
$driver->findElement(WebDriverBy::name(’LOGIN’))->submit();
// ログイン後にときどき出てくるポップアップ
// 出てきた時に「閉じる」ボタンを押す
if ($closebutton === $driver->findElement(WebDriverBy::xpath("//input[@value='閉じる']"))) $closebutton->click();VBで書いてた
Driver.Get("https://www.spat4.jp/keiba/pc")
Driver.FindElementById("MEMBERNUMR").ExecuteScript("document.getElementById(’MEMBERNUMR’).value=’" + strUserNo + "’")
Driver.FindElementById("MEMBERIDR").ExecuteScript("document.getElementById(’MEMBERIDR’).value=’" + strUserId + "’")
Driver.FindElementByName("LOGIN").Submit()と同じ。ちょっと書き方が変わっただけ。
これでSPAT4にログインして、メイン画面が出てきたはず。
・「入金」「投票」「照会」で処理を振り分ける
ここで紹介するほどのことでもないですけど…
switch($command) {
case "depo": // 入金のとき
go_deposit($userPass, $argv[5]); // $argv[5]は入金額
break;
case "vote": // 投票のとき
go_vote($userPass, $argv[5]); // $argv[5]は投票内容が書かれたファイルのフルパス
break;
case "inquiry": // 照会のとき
// 引数がなければ当日結果照会
if ($argv[5]=="") $argv[5]=date("Ymd");
go_inquiry($argv[5]); // $argv[5]は日付YYYYMMDD
break;
default: // 上記以外のとき…何もしない
break;
}
// ブラウザとWebDriverを閉じる
$driver->quit();
exit;メインの処理は以上。各処理は関数にしてます。
各処理の関数は明日以降ちょっとずつ書いていきます。
このネタへのコメント:
コメントはありません。
原付生活(3)