はじめに
カブステを用いた自動取引システムを構築中です。
カブステは仕様で毎朝6時15分にログアウトされてしまいます。
そのため、最初はPAD (Power Automate Desktop)を使い、自動で6時半以降に再ログインするワークフローを作成していましたが、Windows起動時にフローを自動実行するのが難しいため、諦めてpsを書くことにしました。
方針
超愚直な方法です。
- キーボード操作のシグナルを送り、アプリの再起動とログイン操作を行うpowershellスクリプトを作成
- 毎朝7時にそのスクリプトを実行するようタスクをスケジューリング
これだけです。
1. Powershellスクリプトの作成
スクリプトには起動やダウンロードに時間がかかることを想定し、スリープさせている部分があります。
ネットワーク環境、ハードウェア性能により、もっと多くの時間がかかる場合は、スリープ時間を調整してください。
スクリプトが完成したら.ps1
形式で任意の場所に保存します。
ループと条件分岐でウィンドウの存在有無を定期的に確認する方が安全です。
起動し、ログインするスクリプト(Open.ps1
)
Write-Output "オートメーションを開始しました..."
# あなたの環境でのkabuステーションの実行ファイルのパスに置き換えてください。
Start-Process "C:\Users\{YOUR_USER_NAME}\AppData\Local\Apps\2.0\LXKRZOKH.6EN\49NJPHOV.92O\kabu..tion_8b82ea2bcd5b054d_0005.0019_a6173a0f29241bd5\KabuS.exe"
Write-Output "アプリケーション起動中..."
# 10秒待機する
Start-Sleep -Seconds 10
ここでの想定画面↓ (想定時間1秒、アップデートがある場合は確認に5秒くらいかかる)
WshShellのインスタンスを作成
$wshell = New-Object -ComObject WScript.Shell
条件分岐1: もしインストール画面が表示された場合
ショートカットの作成確認(次回から表示されたくないので「はい」を選択)
ここまでのスクリプト↓
$update_window = $wshell.AppActivate("アプリケーションのインストール - セキュリティの警告")
if ($update_window) {
$wshell.SendKeys("i") # インストール(`i`キー)
Start-Sleep -Seconds 60 # インストールに必要な時間(想定60s)
$wshell.SendKeys("y") # Desktopにアイコンを設置
Start-Sleep -Seconds 3 # ウィンドウ待機(3s)
}
条件分岐2: もし"Kabuステーション用の必要な更新"というウィンドウが表示された場合
アプデの時にスクショ取り忘れた;;
確か、Enterキーだけでアプデ始まったはず。。。。。?
どなたかスクショください!!
(スクリプトには念のためyとiも入力してる)
$update_window = $wshell.AppActivate("Kabuステーション用の必要な更新")
if ($update_window) {
$wshell.SendKeys("yi{ENTER}")
Start-Sleep -Seconds 60 # インストールに必要な時間(想定60s)
}
条件分岐3: もし"ログイン"というウィンドウが表示された場合
口座番号は予め保存された状態にしておいてください。
アップデートされても、再インストールしても、この値は保持されます。
$login_window = $wshell.AppActivate("ログイン")
if ($login_window) {
$wshell.SendKeys("YOUR_LOGIN_PASSWORD{ENTER}")
}
パスワードをハードコードすることは、セキュリティ上危険です。
別途変数等で設定することが望ましいです。
ログイン画面が取得できない場合(想定外)
例外処理を書いてください。
else {
# そうでなければWindowsをシャットダウンする
$wshell.Run("shutdown.exe /s /t 0")
}
kabuステーションを終了するスクリプト(Close.ps1
)
$wshell = New-Object -ComObject WScript.Shell
$wshell.AppActivate('kabuステーション')
# 終了シグナル(Alt+F4キー)を送信
$wshell.SendKeys('%{F4}') # `%`はAltキー
Start-Sleep -Seconds 1
# Yキーを送信する
$wshell.SendKeys('y')
# 終了を待つ
Start-Sleep -Seconds 1
Windowsのタスクスケジューラに登録
設定する項目は2つ
- 起動ルーティーン:ログオン時に
Open.ps1
を実行 - 再起動ルーティーン:毎朝7時に、
Close.ps1
を実行した後、Open.ps1
を実行
起動ルーティーンの設定
-
タスク スケジューラ
を起動->タスクの作成...
- 全般->名前-> 好きなように設定
- 全般->セキュリティオプション->最上位の特権で実行する✅
- トリガー->新規->タスクの開始=
ログオン時
- 操作->新規->操作(=
プログラムの開始
)、プログラム(powershell
を指定)、オプション(-File C:\PATH/TO/Open.ps1
<-ps1ファイルのフルpath) - 条件->ネットワーク->次のネットワーク接続が使用可能な場合のみタスクを開始する✅
再起動ルーティーンの設定
-
タスク スケジューラ
を起動->タスクの作成...
- 全般->名前-> 好きなように設定
- 全般->セキュリティオプション->最上位の特権で実行する✅
- トリガー->新規->タスクの開始(=
スケジュールに従う
)->毎日✅->時刻(=7:00:00
) - 操作->新規->操作(=
プログラムの開始
)、プログラム(powershell
を指定)、オプション(-File C:\PATH/TO/Close.ps1
<-ps1ファイルのフルpath) - 操作->新規->操作(=
プログラムの開始
)、プログラム(powershell
を指定)、オプション(-File C:\PATH/TO/Open.ps1
<-ps1ファイルのフルpath) - 条件->ネットワーク->次のネットワーク接続が使用可能な場合のみタスクを開始する✅