ルームを沢山開いてウインドウを放っておくと、全ルームの音がなって大変なことになるし、ブラウザがクソ重くなって大変なことになる。
ルームを開く前にウインドウを最小化しておけば大丈夫なので、実行時はブラウザを最小化しておきたい。
しかし、これが意外とできない。マジか。最大化はアッサリできるのに。
どうやらSeleniumのAPIでは無理らしいので、キーボードショートカット(Alt+Space→n)を送るという原始的手段で実現するらしい。
- ActionChainsを使う
- win32comモジュールを使う
- ctypesを使ってwin32 dllをインポートする
- JavascriptからActiveXオブジェクトを使う
調べてみると、こんな感じの情報が色々出てくるが、どうやらCygwin+Python+Seleniumだと全滅のようで。素直にWindows用Pythonを使っておけば良かったか・・・。
PerlだとCygin用でもWin32::GuiTestみたいなモジュールが使えるんですけどね・・・。
ので、苦肉の策として外部プログラムを実行することにした。
os.system('cscript close_window.vbs')
Option Explicit On Error Resume Next Dim objWshShell Set objWshShell = WScript.CreateObject("WScript.Shell") WScript.Sleep(2000) objWshShell.SendKeys "% " WScript.Sleep(500) objWshShell.SendKeys "n" Set objWshShell = Nothing
os.systemよりもsubprocess.callを使おう、みたいな情報が山ほど出てくるけど、さらにsubprocessの使い方を調べるの面倒くさいし動くからいいでしょ。(散々調べて全然できなかったので、ここに辿り着くまでに心が折れた)
なんかPythonを使うたびに「え、こんなこともできないの」みたいなことが多くてしんどい。
これなら最初からJavaで書けばよかったかもしれない。。
ま、ともかく必要な機能は無事に実装できた。後は細々とした使い勝手の調整とかリファクタリングとかをしていけばいいかなあ。
星投げと50カウントも自動化できれば便利なんだろうけど、そこまではいいかな。ツールもあるし手動でも何とかなるし。
そもそも、一番大きな動機が「配信が始まる前に★を貯めておくのを忘れる」「捨て★の時間を忘れる」といったものなので、始まってからの自動化はそこまで必要としてないのだ。