となりのJohnの気まぐれ

気の向くままに

【Power Automate Desktop】429 Too Many Requestsを自動化で解決する

f:id:newbie29979:20210505145757p:plain

はじめに

「何でも簡単に自動化する」との触れ込みで最近リリースされたPower Automate Desktopだが,実際にそれを使って自動化を試みたので記事にする.
自動化の対象はブラウザ操作.ブラウザ操作を対象にするため,AutomateDesktopではchromeを始めとしてブラウザの拡張機能が提供されているらしいが,2021/05/05現在不評である.そのため,ショートカットを使ったアプローチを試みる.これは恐らくブラウザに限らず他のソフトでも適用可能なノウハウのはず.

背景

普段私はブラウジングしているときタブを開き過ぎることが多い.そんなとき,同一サーバに同一IPから多数アクセスがあると,サーバから以下のようなステータスコードが返ることがある.

f:id:newbie29979:20210505145321p:plain
429 Too Many Requests

意味はそのままで,ユーザからのリクエストが余りにも多いためページを返せていないという状態である.これは同一サーバへのアクセスする多数のタブを同時に開くとよく遭遇するが,大抵の人間は複数のタブを同時に確認することはなく,タブを逐次確認していくのでいざタブを開くと429,だと少しげんなりする(もちろん,悪いのは自分であるが).
解決方法は時間を置いて更新すればいいのであるが,少し面倒であることから自動化したい.そこでPowerAutomateDesktopの出番である.

PowerAutomateDesktop

PowerAutomateDesktopは,Microsoftが近日リリースした「Win10なら無料」の自動化ツールである.
flow.microsoft.com
自動化と聞くとコーディングが必要なように思われるが,最近のノーコードのトレンドよろしくPowerAutomateDesktopはコーディングが原則不要で自動化できる.もちろん,任意のスクリプトを走らせることもできる.

起動時の画面はこんな感じで非常にシンプルである.

f:id:newbie29979:20210505151317p:plain
起動時の画面

新しく自動化フローを作成するときは,左上の「+新しいフロー」を選択する.すると,エディタ画面が立ち上がる.

f:id:newbie29979:20210505151620p:plain
フローを編集するエディタ画面

自動化による解決

今回の場合に実現したいのは以下の2つの機能である.

  1. 429が表示されたら自動で更新する
  2. 一定時間操作がなければタブを閉じる

2.に関しては本記事の趣旨から外れるオプションであるが,逐次タブを"処理"していくためには重要な機能である.

「429が表示されたらで自動で更新する」を実現する

最初に実装するのがメインとなる機能である.
フローの開始地点は画面上に「429 Too Many Requests」が表示されることであるため,OCRを使用した実装を試みる.少し認識精度は気になるが,所詮コンピュータのテキストなのでほぼほぼ認識可能であろう,という判断である.普通はブラウザ経由でステータスコードを吸い出すのが誤りもなく良さそうだが,他のソフトの自動化への流用に向けた手法と考えてもらいたい.

必要な処理としては以下のようなものである.

  1. 429 Too Many Requestsを認識する
  2. ブラウザでWebページを更新するショートカットである"Ctrl+r"を押下する

以上をフローで記述すると,以下のようになる.

f:id:newbie29979:20210505154402p:plain
429を認識したら自動で更新する

PowerAutomateDesktopでOCRを使うためには,最初にOCRエンジンなるものを作成するらしい.
qiita.com
OCRエンジンが「429 Too Many」を認識したとき,ショートカット「Ctrl+r」を送信する.「429 Too Many Requests」までを認識の対象としていないのは,認識誤りがあったときにもある程度動作するようにするため.
このフローは常に動いてほしいので,無限ループで閉じておく.

「一定時間操作がなければタブを閉じる」を実現する

次に実装するのは,一定時間操作がなければタブを閉じる機能である.「一定時間操作がない」とは,「マウス操作がない」とする.

必要となる処理は以下のようなものである.

  1. マウスの位置を取得し操作があるかどうかを判定する
  2. ブラウザでタブを閉じるショートカットである"Ctrl+w"を押下する

以上をフローで記述する.

f:id:newbie29979:20210505161356p:plain
一定時間操作がなければタブを閉じる

あるタイミングでマウスの座標を取得し,そのx,y両座標ともに一定時間後のタイミングで取得した座標と変わりなければ操作がなかったものとしてショートカットを送信する.各タイミングの座標はそれぞれ変数PrevMousePos[X,Y],CurrentMousePos[X, Y]に格納している.
プログラミング言語であれば複数条件では大体&&が使えるものであるが,どうやら未実装の模様.

マージする

以上2つのフローをマージする.
今回のメインは「429が表示されたら自動で更新する」機能であるため,「一定時間操作がなければタブを閉じる」機能はサブフローとする.

f:id:newbie29979:20210505162313p:plain
フローAutoCloseTabをサブフローにする

サブフローは左上の「サブフロー」から追加できる.

サブフロー化の際に注意することは変数の扱いである.
PowerAutomateDesktopでは,メインフロー/サブフローともに変数が共通のものとして扱われるようである.そのため,変数の衝突に注意する.

f:id:newbie29979:20210505162833p:plain
フローの変数

今回の「一定時間操作がなければタブを閉じる」フローでは無限ループも扱っていたため,その点も注意しつつ実装したのが以下のサブフローである.

f:id:newbie29979:20210505163215p:plain
一定時間操作がなければタブを閉じるサブフロー

単独では2秒かける設定になっていたが,ターンアラウンドタイムを早くするためサブフロー化の際に1秒に短縮した.本来はこうした統合も考慮し単独のフローを記述する際に綺麗な実装ができているとよいのだが,無限ループのフロー変更に伴うロジック変更もされている.変数PrevMousePos[X, Y]の初期化もできているとよいと思う.

まとめ

以上日々のブラウジング生活の中で遭遇する作業を自動化する流れを紹介した.PowerAutomateDesktopは大まかな流れをノーコードで実現,細々したところはスクリプトで従来通り実装していくのが良いように思われる.
ノーコードとはいえ,そのロジックは十分にプログラミングであり,実現したい機能を切り分けていく力は変わらず重要である.

個人的にはOCRを簡単に実装できるのが強みに思う.コンピュータの出力装置は大抵がディスプレイであり,その中でも文字は情報として非常に重要な意味合いをもつため,これを情報としてここまで簡単に扱えるのが強い.
ほかにも,PowerAutomateDesktopにもGitHubのようなノーコードコード共有サービスがデフォルトで提供されているとより良いように思った.

コンピュータはいまの時代の労働者である.使われるのではなく,さらに使いこなせるのがこれからの時代の生産性を向上させるための重要なスキルである.
労働者が反乱を起こすのが世界の歴史であるが...それはまた別のお話.