PyAutoGUIを用いてZoomミーティングの開催を自動化した

投稿者: | 2021年2月22日

1.はじめに

RPAでZoomミーティングを自動的に開始させようとしています。今回はRPA部分の説明になります。

2.使うRPAツール

もともと余っていたubuntu機でRPAツールを動かす予定でした。そのため、無料RPAであるsikuliを使おうとしました。しかし、sikuliはpython2.7系で記述する必要があるため除外しました。

また、同時にPyAutoGUIというモジュールを見つけていました。こちらはpython3系でも動くため、python3系しか書けない私としてはこちらのほうが開発のしやすさという面で優位にありました。

最終的に、PyAutoGUIを用いて開発することにしました。

3.動作マシン

  • OS : windows10 Home
  • CPU : Intel i5-4690K
  • M/B : ASUS Z97-PRO Gaming
  • メモリ : 8GB
  • SSD : 256GB

すべて私の家で余っていたものになります。

もともとubuntu機で開発する予定と書きましたが、いろいろな事情でwindows機での開発に移行しています。

4.やりたいこと

  • ログイン状態のZoom、または自動ログイン設定のZoomを起動し、ウィンドウを最前面に持ってくる
  • ミーティングボタンを押す
  • ミーティングルームを選ぶ
  • 開始ボタンを押す

Zoomは一定時間経つと自動的にミーティングが終了されるため実装予定ではありません。

5.コード

6.内容

6-1.フェールセーフ機能

なにかあった時のための機能でpyautoguiに標準で搭載されています。消す必要もないのでそのままです。

6-2.ズーム起動

windowsキーを押してZoomと入力しEnterキーを押せば起動します。いちいち休止を入れているのはタイミング調整です。秒数は適当です。

6-3.定期ミーティング起動

6-3-1.ボタンの画像の用意

Zoomのボタンを画像認識で認識し、そのボタンを押すという行動を繰り返します。

ここでボタンを画像認識とは、色味も含めた画像認識です。例えばZoomのボタンはActive時と非Active時では次のようになっています。

button

これらは別のボタンとしてRPAでは捉えられるため、ボタンの状態は予めすべて把握しておく必要があります。

このような理由で、押す予定のある全てのボタンのActive時、非Active時の画像を用意しています。開始ボタンは非Active時の状態が無いため、1種類しか用意していません。

6-3-2.pathの扱い

画像のpathの含まれるバックスラッシュによって、その部分がエスケープシーケンスで展開されます。そのため、pathの文字列の頭にrをつけてエスケープシーケンスで展開されないようにしています。

また、\とバックスラッシュを2つつなげることで同様に回避できますが、頭にr(またはR)をつけたほうが楽だと思います。

6-3-3.ボタン操作

今回のボタン操作はミーティングタブを選択、定期ミーティングを選択、開始ボタンを押すの3つです。ここで、ボタンのActiveと非Activeがあるのはミーティングタブとミーティングルームなので、この2つと開始ボタンを分けて処理します。

2回同じ操作を繰り返すのでforループで処理します。このとき、2つのリストの要素を取得するようにしたためzip関数を用いています。

ボタンの探索では、非アクティブのボタン、アクティブのボタンの順に探索しています。ボタンが見つからない時の判別は、変数がNoneであるかどうかで判別します。また比較は==演算子ではなくis演算子で行います。

この行動を2回繰り返し、最後に開始ボタンを押してミーティング開始が開始されます。

6-3-4.メイン部分

関数を呼び出すだけです。

7.ubuntu機開発で躓いた点

PyAutoGUIの説明文には次のようにありました。

PyAutoGUI lets your Python scripts control the mouse and keyboard to automate interactions with other applications. The API is designed to be as simple. PyAutoGUI works on Windows, macOS, and Linux, and runs on Python 2 and 3.

しかし動きませんでした。どこが動かなかったかと言うと、そもそもキーを自動で押せませんでした。a,b,cのようなアルファベットのキーは押せるようですが、winキーなどの装飾キーが押せませんでした。ただし、ファンクションキーは押せましたし、Enterキーも押せました。押下されたキーの確認はxevで行いました。

また、テストとしてマウスポインタの位置を取得するコードを実行してみました。コードは以下のようになっています。

これは部分的に動作しました。マウスポインタの座標を取得することはできましたが、マウスポインタを指定の座標に動かすことができませんでした。理由はよくわかっていません。

MacOSでこのコードを実行したときは権限を与えるかどうかの確認が出たので、もしかしたら操作する権限がないのかもしれません。しかし、そのような設定を見つけることはできませんでした。

8.windows機開発で躓いた点

公式ドキュメントではモジュールをインストール以外操作は必要ないと書かれていますが、実際は動かすときにPillowと言うモジュールが必要です。pipでインストールしましょう。

9.動かした所感

画像認識に時間がかかります。大きなボタンほど時間がかかるようです。開始から終了まで最大25秒ほど必要となりました。計測コードは次のとおりです。

(Pythonで処理の時間を計測する冴えた方法より)

10.おわりに

予定取得とRPAは完成したので、次は2つの統合です。そう考えていたら、GUIを組み込むということを思いつきました。

常にバックグラウンドで動かすため、動作中のログ出力などができればいいと考えたからです。また、そこでRPAのON/OFFも行いたいと考えています。

11.参考文献

PyAutoGUI

Pillow

【python】TypeError: ‘NoneType’のエラー原因と対処法まとめ

null判定とNoneとNoneType

Pythonでエスケープシーケンスを無視(無効化)するraw文字列

Python, zip関数の使い方: 複数のリストの要素をまとめて取得

組み込み関数

xevを使用してキーコード調べる

Pythonで処理の時間を計測する冴えた方法

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください