macOS 自動化の日本語入力はクリップボードペースト一択、ただし復元はセッション終了時に遅らせる(キーイベントは投函までしか保証されない)
AppleScript
macOS
自動化
知識
判断
運用
macOS で System Events / cliclick を使ってアプリに日本語(マルチバイト)テキストを入力する自動化の判断基準と、クリップボード復元タイミングのレース。
入力方式の選択
- cliclick のテキストタイプは ASCII キーコード限定で日本語は打てない。
- System Events の keystroke に日本語文字列を渡す方式も、1字ずつの合成キー入力が日本語 IME(ライブ変換)を経由するため未確定のまま化ける(実機確認)。
- 確実なのはクリップボード経由: テキストを pbcopy 相当で stdin からクリップボードに入れ、Cmd+V のキーストロークを送る。stdin 経由なら AppleScript 文字列エスケープも不要。保険として JIS「英数」キー(仮想キーコード 102)を直前に送ると IME 未確定状態を潰せる(非 JIS 環境では無視されるだけで無害)。
- アクセシビリティ(AXValue)で直接値をセットする案は、Electron/Web 系アプリでは内部状態(React 等)に反映されない懸念があり、クリップボード方式が安定するなら選ばない。
復元タイミングのレース(落とし穴)
osascript で Cmd+V を送った呼び出しの完了は「キーイベントがシステムに投函された」ことまでしか保証せず、対象アプリが実際に貼り付けを処理するのは非同期。CPU 負荷が高い状況(画面録画・エンコード併走など)では処理が数百 ms の固定待ちを超えて遅延する。この状態でクリップボードを元の内容に即復元すると、アプリは復元後の旧内容を貼り付ける。旧内容が空なら「何も入力されない」、旧内容が既存表示と同一なら「無変化」に見え、単体実行では再現せず負荷時のみ発症するため切り分けが難しい。
対策は「入力ごとに即復元」をやめ、退避は自動化セッションの最初の入力時に1回・復元はセッション終了処理まで遅らせること。固定待ちの延長はレースの確率を下げるだけで根絶できない。
切り分け・検証手法
- 貼り付け失敗か復元レースかの判別: 入力欄を空にし、クリップボードに判別用マーカー文字列を入れてから自動化を実行する。結果がマーカー文字列なら「復元後の旧内容が貼られた」=レース確定、空のままなら「イベント未達」、期待テキストなら正常。
- 入力欄の実内容の読み戻しは、スクリーンショット目視より「全選択→コピー→pbpaste 相当」でテキスト取得する方が確実。ただし空欄だとコピーが no-op でクリップボードが変化せず誤判定するため、コピー前に番兵文字列をクリップボードへ入れておき、読み戻し結果が番兵のままなら空と判定する。