ターニングポイントさん!?

無料だからPowerAutomateDesktop使って寝マクロ書く

無料だからね…

いずれはOSの基本ソフトにもなるらしい。

「Power Automate Desktop」と「Windows Terminal」がOSに同梱 ~プレビュー版でテスト魚拓

◆おことわり

(2021年3月時点)なんかプレビュー版って書いてあるな。その名に恥じず色々足りてないような気がしている。機能でいえば足りてるっちゃ足りてるんだが、細かいところが。

説明画像とか載せたくないので載せない。表示遅くなるしギガが減るし、CDN用意したりでブログ引っ越す時とか面倒だし。

◆寝マクロとは

むかーしむかし、エンドレスバトルっていうブラウザで遊べるゲームがありました。ポチポチとクリックすると経験値やゲーム内通貨が稼げるので、当然自動で動かせばいいんじゃないのと言う話になる。

寝ながら何かPCの操作をしたい。寝ながらクッキーをクリックしたい。そのデザイアはプログラムを書けば達成できる。そうして書かれたプログラムの事を寝マクロという。

寝マクロをオンラインゲームで使うと永BANされる可能性ある。以下をゲームに適用したいのであれば、バレねぇように且つ自己責任でやれ。

◆Power Automate

プログラム書かなくても、なんかを自動で動かしておけるやつ。Windows10ではPowerAutomateDesktopが無料で提供されたんで、使おうよ。

PowerAutomateDesktopのことを、以下PADと呼んだりする。

▼ダウンロード

PowerAutomate | Microsoft

◆考え方

すげぇ色々できる。すげぇ色々できるので迷うんだけど基本は以下。

  • ウィンドウを捕まえる。
  • 捕まえたウィンドウの中にある特定の要素を見つける。
  • 要素に対して操作する。

要素ってのは、入力欄とか、ボタンとか、リンクとか。そこに文字を入力したりクリックしたりってのは自動化できよう。

ウィンドウを捕まえるっていう戦略以外では、キーボードもマウスも自由に操作できるんでそれを使えば良い。今回はそのパターンについては説明しないけど。

デスクトップアプリの操作とブラウザ(Web)操作の2例挙げさせていただく。先にデスクトップアプリ。

◆例)チャットアプリで一時間に一度嫌がらせメッセージを送る

Telegramというアプリを使って、3600秒に一度、「うんち!」という嫌がらせのメッセージを送信する。「Telegramってなに?」ってひとはLINEでもなんでもいいけど。

Telegram Desktop

パソコン版LINE(Windows)

制限事項:これらアプリは複数のウィンドウで開けないんで、自分で利用するときに少し面倒かもね。PADくんが急にコントロールを奪ってくるだろう。

▼フローの新規作成

インストールしたPADを起動して、「新しいフロー」ってのを押す。

編集画面に入っただろう。左に使える道具が並んでっから、そっからドラッグアンドドロップでフローを組み立てる。

・余談:保存場所

OneDriveに保存されているんじゃないかと思う。さがせば、テキストで記載されているフローを見つけることが出来るかも。俺には見つけられなかったけど。

https://japan.flow.microsoft.com/manage/environments

同じMicrosoftアカウントでログインして「デスクトップ フロー」ってタブを見てみれ。

▼Windowの取得

取得方法に二通りあって、「既に起動しているアプリを取得」「アプリを起動して取得」って感じ。既に起動してるパターンでいく。安定するから。

  • 「UIオートメーション > Windows > ウィンドウの取得」ってのを、ドラッグドロップしてフローに追加する。
  • 「UI 要素」の「新しい UI 要素の追加」をクリック。
    • Ctrlボタン押しながら操作したいウィンドウを選択…しようとしても「ウィンドウだけ」を選択できないんで、とりあえず適当な要素を選んで「完了」。
    • もっかい「UI 要素」を選んで、ウィンドウだけを選択する。
  • 「詳細」欄を開き、ウィンドウを取得する待機時間を入れる。10とかでいいよ。

「ウィンドウだけの取得」ってことをもっとすんなりやりたい場合は、画面右の「UI要素」を示すアイコンをクリックして、「UI 要素の追加」ボタンの右側のエキスパンドボタンを押して「画面の追加」ってやつをクリックすればいい。

表示は以下の感じになるだろう。

%appmask['Window \'Telegram\'']%

・余談:選びづらい

追記:2021/5/7
前方一致とか「含む」とか正規表現での指定ができるようになってた。勝ったな。ウィンドウタイトル以外ではプロセス名で引っ掛けられるようになってるね。「UI要素」から「セレクターの編集」の画面までこぎつけろ。右端のひし餅みたいなアイコン。がんばれ。
この記事はいずれ最新情報で全部更新しておく。

プレビュー版だからか知らんけど、ウィンドウの選択でタイトル引っかける方法がちょっと辛い。何が辛いかって、ウィンドウのタイトルが変わってしまうと取得できなくなるんすね。タイトルが完全一致しないとウィンドウを特定できない。

さっきウィンドウを選択したときに「Telegram」って文字列入ってたでしょう。でもTelegramってやつは新着が来ると「Telegram (1)」みたいに未読件数がタイトルに入っちゃう。そうなるとウィンドウを捕まえられなくなってくる。

んだもんで、本当は「Telegram」って文字が先頭に入ってるウィンドウを捕まえるべき。前方一致っていう検出方法なんだけど、いまんところその設定はウィンドウの取得ではできないみたい。いずれ使えるようにもなろう。実装を待ってろ。

Power Automate Desktop | 条件

▼入力

無事にウィンドウを捕まえられたんでテキストボックスに「うんち!」と入力したい。テキストボックスが表示されてないとPADくんがそれを見つけられないので、送信先を選択しておく。とりあえずお前の親とかでいいだろう。

さっき捕まえたウィンドウは初期値で「AutomationWindows」って変数に格納されているから、そのウィンドウを指定したい。だが、できない。

どうなってやがる!

と叫びながら「UI オートメーション > フォーム入力 > ウィンドウ内のテキスト フィールドに入力する」をフローにドラッグドロップする。

さっきのように「UI追加」でテキストボックスを選べ。

%appmask['Window \'Telegram\'']['Edit \'QTextEdit\'']%

そいだら「入力するテキスト」欄に「うんち!」って入力しておく。

入力された値を見ればわかる通り、「Telegram」っつってウィンドウのタイトルを扱ってそう。でも、前段で「ウィンドウの取得」をしてさえいれば「Telegram (1)」ってタイトルになっててもエラーにはならない。どういう理屈なんだろう。本当は「ウィンドウの取得」で変数に格納したウィンドウを指定したいところではある。なぜかできない。

登録したUI要素を削除したいときは、フロー編集画面右のUI要素アイコンをクリックしてそっから削除しろ。

「要素を具体的に選択したいでやんす」ってひとは、セレクタービルダーを使えばよい。画面右の「UI 要素」を示すアイコンでUI要素一覧が出るんで、そこにならんでるのをダブルクリックして、さらにセレクタをダブルクリックすれば編集できます。分かりやすいもんではないけど。

UI 要素を使用して自動化する | Power Automate Desktop

・余談:Emoji

入力テキストに絵文字を指定してもいいんだけど、Telegramの絵文字は「:sob:」で😭、「:tada:」で🎉みたいに代替できまする。

▼送信

「UI オートメーション > フォーム入力 > ウィンドウ内のボタンを押す」ってやつ使ってなんとかしろ。

▼動かしてみる

PADの画面を開きながらF5で実行してみる。動くはず。

ウィンドウを取得できなかったんならタイトルを疑え。要素が取得できなかったんなら、もう一度要素の取得をやってみること。

▼ループしてみる

一発動いて終わったんなら寝マクロにはならん。だからスケジュールで実行させたい。でもスケジュール実行機能が無いような気がするから、ループと待機でなんとかしよう。

「ループ > ループ条件」をドラッグドロップ。2つのオペランドの両方に「t」とか適当な文字列を入れる。これで無限ループの作成完了。

「ループ条件」「End」っていう2つの要素が並ぶんで、どっちかを掴んで上下させ、さっき作った「入力」「送信」してる要素を囲む。「ウィンドウの取得」までは囲まなくてよい。

このままだとスゲー速度でループが回っちまうので、各ループで一時間くらい待機したい。

▼待機

「遅延 > Wait」(あるいは「フローコントロール > Wait」)を、さっき作った「End」の前にドラッグドロップする。一時間に一度送信したいなら「3600」と入力。

▼完成

できあがり。保存して編集画面を閉じて良し。PADのトップ画面から実行しなされ。

ただパソコンをシャットダウン、あるいはスリープしてたら当然動かんわけだから、パソコンを立ち上げておく必要がある。PCやサーバーの発火には気を付けようね。火災保険に入ろう。

プレビュー版だからかわからんけど、スリープを経由するとフローが停止できなくなったりする。Windowsのタスクマネージャーからプロセスを右クリックして「タスクの終了」して差し上げろ。

◆その他のツール

Webの話に入ってもいいけど、できることについて色々説明してみる。使わんかもしれんけど一応。

PADは寝マクロ作るためのおもちゃではなく、ボタンポチーで自動的に色々動かしてくれる偉い奴なんです実は。

「どうでもいいよ」って思うクズは適当に読み飛ばしてね。

▼マウスとキーボード

これは寝マクロに使うかも。キーボード/マウス操作できる。

ウィンドウの指定が出来ないんで、操作したいウィンドウが前面に来てないと変なことしちゃうかも。「UI オートメーション > Windows > ウィンドウにフォーカスする」等と組み合わせて使えば良いだろう。

▼変数

変数扱えます。つまり、値を記憶しておくための場所を作ることができる。その値を取り出して計算に使ったりできるでしょうね。

「変数 > 変数の設定」で新しい変数を宣言してみなされ。

これバックエンド何で動いてんの?数値の変数に文字列で上書きできてしまうんだけど。やめてくれ。殺すぞ。あと「1」とか「01」って文字列を格納する変数どう作るのコレ。数値になっちゃうんですけど。型指定させろ。

「条件」系と組み合わせれば色々出来るでしょうね。

▼テキスト

テキスト変数を操作するのに便利だと思う。Right相当の機能がないのはちょっと気になるが、正規表現が使えるね。いいね。

▼システム

いろいろできるな。コマンド実行もできてしまえば、PCのシャットダウンまでできる。シェルに書くのが通例だった「一時間後にシャットダウンする」みたいなフローも簡単に作れるよね。

▼ファイル/フォルダ操作

ファイルのコピー、移動、削除、名前変更、テキスト抽出までできる模様。ファイルの作成できないのこれ?「テキストをファイルに書き込みます」ってので作れるみたいだが。

CSVをListの変数に落とすことまでできるらしい。「変数 > データ テーブル列をリストに取得」と合わせて使えばいいんかね。あとJSONもカスタムオブジェクトに落とせるみたいだしループも回せるんだけど、型がやっぱ不安。実行時エラーを見たくない。

ファイルリストの取得はフォルダのほうにある「フォルダー内のファイルを取得」だな。

▼Excel

操作できるらしい。やりたくねぇけど、Excel主義社会で働いているプロレタリアートは何らかの革命を起こせるかもね。

SQLも叩けるらしいがAccessの操作はできるんだろか?

と思ったら、なんかコネクタがいっぱいあるね。Desktop版でこれらコネクタを使える日は訪れるのだろうか。

◆例)ブラウザ操作

TelegramのWebアプリを使って同じことをしてみる。

PADから操作するために、ブラウザに拡張機能を入れてあげる必要がある。ってのと、ウィンドウの取得がまぁまぁ不安定。そこさえ越えればそれなりに安定して動いてくれる。

▼ウィンドウ取得

「Web オートメーション > 新しい Chrome を起動する」とかを選択。

起動するか、既に立ち上がってるブラウザに接続できる。「実行中のインスタンスに接続する」ってやつだな。立ち上がってる奴に接続したほうが無難だろう。URLをキーにしてタブを選択できるし、TelegramのWebアプリ版チャットにはURLが振られているからそれを指定するんだろな。頑張れ。

実行時にブラウザを起動するパターンで行きたいなら、ブラウザ起動後に10秒くらいWaitを入れてあげるのがよい。

Webアプリに限らんけど、ログイン状態が一定期間で解除されるサイトもある。ものによっては止まるかもしれないってのは認識しといた方が良い。

▼テキスト入力

「Web オートメーション > Web フォーム入力 > Web ページ内のテキスト フィールドに入力する」を使って、テキストを入力したれ。UI 要素の追加はデスクトップアプリとほぼ同じやり方。

これも、要素の取得とかをもうちょい柔軟に書きたい。セレクタを書きたい。だってclassとかJavaScriptでどうにでも操作されちゃうじゃない。

ブラウザ操作でもセレクタービルダーは使えるんで、「画面開きなおしたり幅を変更したりすると要素が選択できなくなる」って症状が発生したらば不要な階層を削ってみりゃいいと思う。

▼ボタン押下

同じノリ。頑張れ。

それでもうお前の望む機能は達成されるだろう。イェイイェイ。

◆苦情

UI要素の指定を手入力したい。UI要素の削除をわかりやすくしてほしい。

「JavaScriptの実行」「Pythonの実行」「VBScriptの実行」とかあってクッソ不穏。C#やらRustやらTypeScriptで書かせてくれるんなら分かるけど。

変数の型を指定したい。

スケジュール実行させたい。

PCをシャットダウンした状態でも動かしたい。(無理め)

「私はロボットではありません」を越えられるようにして。(難しめ)

起動やら編集が遅い。

フローのインポート/エクスポートに対応してくれ。gitで管理させろ。むしろgitインテグレーションしろ。

たまにフローの停止できなくなって詰むんだが。強制的にPADを終了できるようにしてくりゃれ。

あとこれ、OSSではないんだね?まぁ別に構わんけど。

◆結

そんな感じ。まだ未完成な感じを残しつつ、それでも便利じゃね?簡単なものであればコードをガリガリ書かなくて済む。そして、プレミア版はあるけど基本無料。マイクロソフトも太っ腹なことだよ。ありがとなー。

アイデア次第で可能性は無限大!…ではない。無限大ではないけど。何かに活かしてみそ。

かたやPowerFxっていう馬鹿みたいな言語魚拓)が開発されておるらしく、それもPADで使えるようになるんだらしい。「Excelの数式をベースとした」ってなに。気持ちは分からんでもないが、こんなの絶対おかしいよ。過去の過ちをもう一度繰り返そうとしているようにしか見えない。

プレビューが外れたら、この記事はまた更新しておく。

花鳥風月を40ループしたからオススメを10曲教える

BraveブラウザでTwitterのプロモツイートを消す

3件のコメント

  1. 草っぱ

    質問させて下さい。
    大昔にbesicを習った程度の学習度です。

    power autometo desktopで
    指定したフォルダ内のファイル情報をExcelに書き込む
    をしたいのですが、

    フォルダー内のファイルを取得の
    変数File(の一覧ファイル)の詳細表示にある
    FileのプロパティをExcelに書き込むところで躓いております。

    Excelワークシートに書き込むの
    書き込む値でフロー変数からFileと.Countしか書き込めません。
    (データ型が違うから?)

    指定のデータ型をテキスト型として扱うようなアクションがあれば、この問題は解決できそうなのですが見つけ出すことができませんでした。

    何か方法があればご教授いただけますと幸いです。

    • メガネ

      「フォルダー/フォルダー内のファイルを取得」
      ではなくて
      「ファイル/ファイルからテキストを読み取ります」
      を使うんだと思う。

      • 葉っぱ

        解決しました。
        リスト変数という仕組みがよく理解できていなかったのが原因でした。
        リスト変数の使い方を理解して解決できました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


Powered by WordPress & Theme by Anders Norén