2023-10-7「Python 自動実行で遊ぶ」
お仕事で毎回おんなじ作業をするのがめんどうなので、Pythonにやらせることを考えています。
同じ作業といわず、仕事を全部やってくれたらいいのに。
それはともかく、参考にしているのはこの本です。
それではやっていきます。
ブラウザを開く
ブラウザを開くくらい簡単ではあるのですが、このあと、ログインも自動でやってほしいので、一連の動作としてブラウザもPythonに開いてもらうというのをやってみます。
ブラウザを開くには webbrowser というモジュールを使うらしいです。
import webbrowser
webbrowser.open("https://xxxx.xxxxxxxxxxx.com/jp/")
うん、普通に開くことができました。
だけれどこのトップページ結構重めなんですよね。ロードが終わったかどうか確認できないとログイン押しても反応しませんよね。
単純に何秒か待ってもいいんですが、もっとエレガントな方法があればそっちがいいですね。
ふむ……
こういうのはどうでしょう?
PyAutoGUI を入れて、マウス座標をおしえてくれる PyAutoGUI のツール MouseInfo を起動します。
import pyautogui
pyautogui.mouseInfo()
このツールで対象の画面の「ログイン」の位置にマウスを持っていき、その座標をメモします。
メモした値を自動化スクリプトに追加します。ブラウザを開く・マウスを移動する、の連続動作です。
import webbrowser
import pyautogui as auto
# webブラウザを開く
webbrowser.open("https://line.worksmobile.com/jp/")
# マウスを移動する
auto.moveTo(1384, 140)
ブラウザを開いて、マウスを移動させることができましたが、思ったような動きをしません。左下にURLが表示されるかと思ったのですが……
どうやらこの位置にマウスカーソルが瞬時に飛ぶだけではだめで、人間がやるような微細な動きが必要みたいです。ちょっと動きを入れてみます。
# 少しだけ移動させる
for i in range(0, 100):
auto.sleep(0.3)
auto.moveRel(-1, -1)
auto.moveRel(+1, +1)
マウスカーソルがピクピクするようになりました。左下にURLも表示されるようになったようです。
このURL表示をロード完了の合図とみなして、URLが表示されたらクリックを押すようにしてみます。ええっと……
ああ~ だめっぽいですね。このブラウザのURL表示はポップアップなので、
スクリーンショットには映らない=PyAutoGUIには感知できない
ということのようです。おそらく。
ですのでこのURL表示ではなく、ブラウザのタブ部分にページアイコン、いわゆる「Favicon」が表示されたらロード完了とみなすことにします。
スクリプトを修正です。
# アイコンが表示されたらロード完了とみなす
for i in range(0, 100):
auto.sleep(0.3)
ret = auto.locateOnScreen("favicon.png")
if ret == None:
break
else:
auto.alert("起動が感知できなかった。起動に時間がかかりすぎてるかアイコンや解像度が変わったか")
exit
# ログインをクリック
auto.click(1384, 140)
favicon.png はスクリーンショットから、アイコン部分を切り取ってpngにして保存しておきます。もし note だったらこんな感じです。
無事ログイン画面の次の画面、IDを入力したり連動アプリを選んだりする画面を表示させることができました。
この画面でも同様の処理をします。画像を認識して、連動アプリのログインボタンが表示されるのを待って、ボタンのところをクリックします。すると、今度は連動アプリのログイン画面が出てくるのですが……
この連動アプリのログイン画面も同じように、ちょこちょこっとつっついてみたり、ボタンが出るのを待ってみたり、ということをやってログインします。(集中力が切れてまいりました)
なんとか自動ログインを達成いたしました。
しかしこのサイト、「一度ログインに成功すると、さきほどのログイン画面はスキップされて出てこなくなる」ということが判明しました。
なので、「即時にログインできたか」「ログイン画面が表示されたか」どちらなのかを判断するような仕組みが必要になろうかと思います。
思ったより大変です。
この修正と、ログイン後の動作の話はまた改めて。
以上、ここまで読んでいただいてありがとうございました。