自動化に触れてみた、な話
しろくまです。ありがとうございます。
今日は、以前作った ↓↓ の鬼畜雑アプリを、
ちょっとだけ自動で起動できるようにしてみた話をしようと思います。
やってみようと思った経緯
理由としては、今後のお仕事で「もしかしたら使うかも?」となったからです。
お願いされている作業の中に、以下を検討してくれ~というものがありまして。
「今まではできてなかったけど、実はリリースのたびにやった方がいい作業ないか」
「その作業を楽にできる方法ないか」
楽にできる=自動化!と短絡的に考えたわけです。
世の中に、自動化できるツールがもう無限にあることくらいは知ってます。
いくら、手順に従ってもくもく手作業進めるの好きな私でも。
でもなかなかないチャンスですよね。
勉強したものがすぐに生きるかもしれないんだから。
ということでやってみようとなりました。
どうやってやるのか
先ほども申しました通り、方法なんて無限にありますよね。
私が聞いたことあるものだと、Squishとか聞いたことあります。
でもインストールとか環境構築とかめんどくさそう。でも新しいツールとかって、お客さんの承認を得たりしないといけないとかいろいろ大変そうかも?
じゃあもうすでに入ってるものでうまいことできないのかなと考えました。
結論。
Windows PowerShellでどんなことができるのかやってみよう~~~
いろいろな背景(心の声)を考慮して、今回はそれでやってみることにしました。
実際にやってみた!
どんなことができるのかやってみる
そもそもこの時点で、私はPowerShellで動く何かを作るとかやってみたことありません。
でも、なんとなく大体何でもできるんだろーと思ってました。
とりあえず、「キーボード 自動入力」とかでGoogle先生に聞いてみました。
こちらの記事を参考にさせていただきました。
お世話になります。ありがとうございます。
もうすでにいっぱい書いてあります。
しかも私とほとんど同じ思考回路でたどり着かれているご様子でした。
本当に先人の方々偉大過ぎる。
とりあえず同じことをしてみようがモットーなのでやってみようとしましたが、ペイントはうまくいかなさそうだったので。
「Googleで検索」これをやってみます。
#System.Windows.Formsなどのインポート
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
# Windows APIの宣言
$signature=@'
[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
'@
$SendMouseClick = Add-Type -memberDefinition $signature -name "Win32MouseEventNew" -namespace Win32Functions -passThru
# Windowsキー(Ctrl+Escキー)押下
[System.Windows.Forms.SendKeys]::SendWait("^{ESC}")
Start-Sleep -m 100
# 検索窓に「google」と入力
[System.Windows.Forms.SendKeys]::SendWait("google")
Start-Sleep -m 100
# Enterボタン押下
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
# googleが起動するまで待機(待機時間は適宜調整)
Start-Sleep -m 1000
PowerShell で実行⇒勝手にWindowsメニューが開かれる⇒勝手に検索窓に「google」と入力される⇒無事開かれました。え。すご。こわ。
これでキーボード操作系は大体何とかなるんだということがわかりました。
こうなると欲が出てきますね。
参考にさせていただいたサイト様に記載がある通り、マウス操作系もやってみます。
もっとどんなことができるのかやってみる
マウス操作系を自動でやってもらうために、場所がわからないといけないということは何となく知ってました。
これまた先人の方々の知恵を生かさせていただいて、
場所を知るためのものを作りました。
#System.Windows.Formsなどのインポート
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
# Windows APIの宣言
$signature=@'
[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
'@
$SendMouseClick = Add-Type -memberDefinition $signature -name "Win32MouseEventNew" -namespace Win32Functions -passThru
# 座標の取得
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
Start-Sleep -s 10
$X = [System.Windows.Forms.Cursor]::Position.X
$Y = [System.Windows.Forms.Cursor]::Position.Y
Write-Output "X: $X | Y: $Y"
Read-Host
PowerShell で実行してみると、
10秒後にマウスカーソルがあった場所の座標値が出てきました。
どうやらこの値を使えば、指定した場所にマウスカーソルを移動させるということができるみたいです。
# マウスを指定の場所まで移動(座標値は適宜調整、以下同様)
[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(1069, 174)
Start-Sleep -m 1000
# 左クリック
$SendMouseClick::mouse_event(0x0002, 0, 0, 0, 0);
$SendMouseClick::mouse_event(0x0004, 0, 0, 0, 0);
こんな感じで指定して実行してみたのですが、
確かにマウスカーソルの移動&クリックができました。
そうとうパワープレイではありますが、こんな感じのこともできました。
#System.Windows.Formsなどのインポート
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
# Windows APIの宣言
$signature=@'
[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
'@
$SendMouseClick = Add-Type -memberDefinition $signature -name "Win32MouseEventNew" -namespace Win32Functions -passThru
# Windowsキー(Ctrl+Escキー)押下
[System.Windows.Forms.SendKeys]::SendWait("^{ESC}")
Start-Sleep -m 100
# 検索窓に「google」と入力
[System.Windows.Forms.SendKeys]::SendWait("google")
Start-Sleep -m 100
# Enterボタン押下
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
# googleが起動するまで待機(待機時間は適宜調整)
Start-Sleep -m 1000
# 検索窓に「任意の検索ワード」を入力
[System.Windows.Forms.SendKeys]::SendWait("任意の検索ワード")
Start-Sleep -m 100
# 入力内容を確定
[System.Windows.Forms.SendKeys]::SendWait("{DEL}")
[System.Windows.Forms.SendKeys]::SendWait("{DEL}")
Start-Sleep -m 100
# Enterボタン押下
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
# 検索完了まで待機
Start-Sleep -m 1000
# Tabボタン押下
[System.Windows.Forms.SendKeys]::SendWait("{TAB 20}")
# Enterボタン押下
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
# ページ表示まで待機
Start-Sleep -m 3000
#Alt+Spaceキーを押す(画面表示メニューを表示)
[System.Windows.Forms.SendKeys]::SendWait("% ")
Start-Sleep -m 100
# Xボタン押下(画面表示を最大化)
[System.Windows.Forms.SendKeys]::SendWait("{x}")
Start-Sleep -m 100
# マウスを指定の場所まで移動(座標値は適宜調整、以下同様)
[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(1069, 174)
Start-Sleep -m 1000
# 左クリック
$SendMouseClick::mouse_event(0x0002, 0, 0, 0, 0);
$SendMouseClick::mouse_event(0x0004, 0, 0, 0, 0);
# ページ表示まで待機
Start-Sleep -m 3000
こちらをPowerShell で実行すると、
勝手にGoogleが開かれる
⇒勝手にGoogleの検索窓に検索キーワードが入力される
⇒勝手に検索が実行される
⇒勝手にTabキー*20連打して一番上の検索結果に移動する
⇒勝手にページが表示されたらウィンドウを最大化する
⇒勝手にマウスが移動して左クリックする
ができました。
工夫したところは、マウス操作する前に最大化してるところです。
最大化しとかないと座標値ずれるのでは?と思いましたので、
必ず一緒になるように一応入れておきました。
ま、モニターとか変えちゃったら問題起きそうですけれどそこはご愛嬌ということで一旦見逃します。(私しか使わないんだからなんとかなるやろ)
あと検索ワード入力した後にDeleteしてるのは、予測変換でなんか余計なのがついちゃうことがあったからです。
というか誰でもこんなことができちゃうんですから、悪用されたら怖いよなと思いました。気を付けましょうね。。
勝手に作ったアプリが起動するようにしてみる
ここまでやってから私、気づいちゃったわけです。
ここまでやったことを組み合わせれば、この前作ったアプリを起動するってこともできるのではと。
ひらめいちゃったわけです。
まあ前回の記事を読んでいただいた方であればわかるように、
、、、陳腐なものっです。
何より、別にサーバー立てて動かしたりとかしてません。
VSCodeさんに全体重預けてもたれっきりなわけです。
ページ見れるところまで事前準備があってめんどくさい。
ま、まあ勉強のためにやってみようということです。
こちら。
#System.Windows.Formsなどのインポート
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
# Windows APIの宣言
$signature=@'
[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
'@
$SendMouseClick = Add-Type -memberDefinition $signature -name "Win32MouseEventNew" -namespace Win32Functions -passThru
# Windowsキー(Ctrl+Escキー)押下
[System.Windows.Forms.SendKeys]::SendWait("^{ESC}")
Start-Sleep -m 200
# 検索窓に「Visual Studio Code」と入力
[System.Windows.Forms.SendKeys]::SendWait("Visual Studio Code")
Start-Sleep -m 500
# Enterボタン押下
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
# Visual Studio Codeが起動するまで待機(待機時間は適宜調整)
Start-Sleep -m 5000
# フルスクリーン表示
[System.Windows.Forms.SendKeys]::SendWait("{F11}")
Start-Sleep -m 200
# フォルダの選択
[System.Windows.Forms.SendKeys]::SendWait("^k")
Start-Sleep -m 100
[System.Windows.Forms.SendKeys]::SendWait("^o")
Start-Sleep -m 500
# フォルダの指定
[System.Windows.Forms.SendKeys]::SendWait("パス\CrazyJourney")
Start-Sleep -m 1000
# フォルダを開く
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
Start-Sleep -m 100
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
Start-Sleep -m 2000
# ファイルの選択
[System.Windows.Forms.SendKeys]::SendWait("^p")
Start-Sleep -m 100
# ファイルの指定
[System.Windows.Forms.SendKeys]::SendWait("run.py")
Start-Sleep -m 200
# ファイルを開く
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
Start-Sleep -m 2000
# マウスを指定の場所まで移動(座標値は適宜調整、以下同様)
[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(20, 198)
Start-Sleep -m 1000
# 左クリック
$SendMouseClick::mouse_event(0x0002, 0, 0, 0, 0);
$SendMouseClick::mouse_event(0x0004, 0, 0, 0, 0);
Start-Sleep -m 1000
# マウスを指定の場所まで移動(座標値は適宜調整、以下同様)
[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(170, 86)
Start-Sleep -m 1000
# 左クリック
$SendMouseClick::mouse_event(0x0002, 0, 0, 0, 0);
$SendMouseClick::mouse_event(0x0004, 0, 0, 0, 0);
Start-Sleep -m 1000
# マウスを指定の場所まで移動(座標値は適宜調整、以下同様)
[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(715, 79)
Start-Sleep -m 1000
# 左クリック
$SendMouseClick::mouse_event(0x0002, 0, 0, 0, 0);
$SendMouseClick::mouse_event(0x0004, 0, 0, 0, 0);
Start-Sleep -m 6000
# Windowsキー(Ctrl+Escキー)押下
[System.Windows.Forms.SendKeys]::SendWait("^{ESC}")
Start-Sleep -m 200
# 検索窓に「google」と入力
[System.Windows.Forms.SendKeys]::SendWait("google")
Start-Sleep -m 200
# Enterボタン押下
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
# googleが起動するまで待機(待機時間は適宜調整)
Start-Sleep -m 1000
# 検索窓に「ページのURL」を入力
[System.Windows.Forms.SendKeys]::SendWait("URL")
Start-Sleep -m 500
[System.Windows.Forms.SendKeys]::SendWait("{F10}")
Start-Sleep -m 100
# 入力内容を確定
[System.Windows.Forms.SendKeys]::SendWait("{DEL}")
[System.Windows.Forms.SendKeys]::SendWait("{DEL}")
Start-Sleep -m 100
# Enterボタン押下
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
# 検索完了まで待機
Start-Sleep -m 3000
#Alt+Spaceキーを押す(画面表示メニューを表示)
[System.Windows.Forms.SendKeys]::SendWait("% ")
Start-Sleep -m 200
# Xボタン押下(画面表示を最大化)
[System.Windows.Forms.SendKeys]::SendWait("{x}")
Start-Sleep -m 100
ちょっと長いですが、ほとんど使いまわしです。
VSCodeのショートカットキーとか使ってます。
勝手にVSCode開かれて、勝手にサーバー起動されて、勝手に画面にアクセスしてくれました!やったぜええうおおお。
まとめ
今回もほとんど自分で考えた部分はなかったです。
でもやっぱりその分、「もっとこうなったら便利だな」とか「こういうのにも使えるかも」とか「こんなことできたら素敵」っていうことを考える方に頭を使うことができた気がします。
自分自身は割と、実際に使う知識じゃないと覚えられないなというのがありました。
でも実際に使える知識を覚えている過程で出会ったものって、何とかしてうまいこと使えないかなという発想に。
私の場合はなるんだな、と思いました。
その結果、これやりたいあれやりたいが出てきている気になっています。
アウトプットよがりのインプットってあんまりよくないのかなと思っていましたが、
その過程でこれも入れとこう、入れたからには使ってみようの循環が勝手にできていくのなら。
別にスタートはなんだっていいんだなって。
毎回まとめ方が難しいです。
ありがとうございました。それでは。