RPAを使ってZoomミーティングの開催を自動化がやっと運用できるレベルになりました。
ちまちま作っていたので、全体の作業時間は72時間もないのではと思います。
目次
0.目的
人の手を介さずに、研究室のオンラインゼミを開催する。
1.仕様
- Googleカレンダーから予定を取得する。
- 予定された時刻になったらZoomミーティングを自動で開催する。
- 予定時刻ぴったりに開催するわけではない。予定時刻より数十秒~1分ほど遅れる。
- ミーティングの終了は実装していない。
- windows環境でのみ動作させることを想定している。
2.外観
3.コード
3-1.メイン部分
3-2.予定取得
3-3.Zoom操作部
4.工夫した点
4-1.画像認識の順番
用いているOpenCVの画像認識は時間がかかるため、認識させる画像の順番を変えることで、ミーティング開催までの最短時間を短縮しました。
ただ、最低でも30秒はかかるため、画像認識自体を高速化する必要があります。
4-2.モジュール化
Zoomの自動操作や予定取得をモジュール化することで、メイン部分のコードを簡略化しています。
競技プログラミングではモジュール化をやらないので、やってみようと思ってしてみた側面もあります。
4-3.無限ループ開始時に予定を取得させる
#30分間隔で予定取得
if count == -1 or count == 30:
#カウンタを戻す
count = 0
#予定を5つ取得し、直近の予定の開始時刻と終了時刻を格納
schedule = gs.get_events()
start_date = schedule[0]
end_date = schedule[1]
予定取得間隔はtimeout時間である60秒(60000ms)に30を掛けた、30分間隔です。
もともと、timeoutを可変にすることでGoogle Calendarへのリクエスト回数を減らそうとしていましたが、timeoutを固定にしてcountという変数で予定取得間隔を調整するようにしました。
これによって、現在時刻は1分ごとに取得するが、予定は30分ごとに取得するようにでき、リクエスト回数を削減できました。
しかし、私の場合countを30に設定していますが、条件がこれだけだとSTARTを押して30分後に予定を取得することになります。一方でcount=0を条件に加えると2回同時に予定を取得することになり無駄です。
よって、countの初期値をループ内では絶対に取り得ない数値にし、その値を条件に加えることで、STARTを押した後だけ予定を即座に取得するようにできました。
5.新しく会得したこと
5-1.GUIを作る
PySimpleGUIは去年少しだけ触っていましたが、今回は公式ドキュメントやcookbookを見ながら作りました。
所定の場所に特定の情報を出力するときはkeyを設定することや、timeoutの設定や注意点を学びました。
5-2.Google Calendar APIを使う
APIを使ったことがなかったので、初めて使ってみました。quickstartをちょっと弄るだけでできてしまったので、会得したかは微妙。
5-3.モジュール化
書いたコードをモジュールにして分割することをやったことがないので、やってみました。1つのファイルにすべて記述するよりスッキリしましたし、テストもやりやすかったです。
5-4.ドライバの作成
並行して基本情報技術者試験の勉強をしていたときにスタブとドライバが出てきました。
必要な部分をモジュール化していたため、基本情報技術者試験で学習した知識を使ってテストをしていました。そのためにドライバが必要になったので制作しました。
資格勉強の知識が意外と役に立つなあと思いました。
5-5.RPAの作成
sikuliなどではなく、PyAutoGUIというモジュールで作成しました。トラブルがよく起こりましたが、しっかり動作するものができました。
人がする操作をそのとおりに記述するので実装は楽でしたが、うまい実装を考えることに苦労しました。
6.今後の展望
Zoomは一定時間経過すると自動で終了します。しかし、終了ができないのはまずいと思ったので、終了時刻になったら終了ボタンを押すようにしたいと思います。ただ、ゼミの終了時刻はまちまちのためどうするか考えています。
7.GitHub
https://github.com/ateruimashin/auto_zoom.git
8.制作過程
Google Calendar APIを使ってカレンダーから予定を習得する