【第6回】OpenClawにデスクトップ操作をさせる——AIが目と手を持った日
常駐AIアシスタントにPCのスクリーンショット取得・マウス・キーボード操作を与えた。PyAutoGUI + FastAPI で実装した「暴挙」の記録。
← 前の記事: 【第5回】OpenClawアップデートしたらAIがアホの子になった——管理担当 Claude Code に聞くはじめに
前回では、OpenClaw のアップデートで AI が壊れた話をした。thinking パラメータひとつで「やります詐欺」が発生するという、設定一行の恐怖を書いた。
今回はもっとヤバいことをする。OpenClaw にデスクトップ操作をさせる。
スクリーンショットで画面を見て、マウスでクリックして、キーボードで文字を打つ。ブラウザを開いて検索し、Obsidian のウィンドウを前面に出す——全部 AI がやる。
「それ大丈夫なの?」と思った人は正常だ。
背景 — なぜ AI にデスクトップ操作が必要か
これまでの OpenClaw は「言葉の世界」で完結していた。Discord でメッセージを受け取り、コマンドを実行し、結果をテキストで返す。ファイル操作や API 呼び出しはできる。でも 画面に触れない。
問題になるのは、GUI しかインターフェースがないアプリケーションだ。たとえば——
- ブラウザで特定のページを開いてスクリーンショットを撮りたい
- GUI アプリのボタンをクリックして設定を変更したい
- 複数ウィンドウを切り替えて情報を収集したい
全部 CUI では完結しない。API が公開されていれば別だが、そうでないケースの方が圧倒的に多い。
人間が目と手でやっている操作を、AI にもやらせたい。
これが今回のモチベーションだ。
実装 — PyAutoGUI + FastAPI という選択
アーキテクチャ
構成はシンプルだ。

OpenClaw は Docker コンテナ内で動いている。GUI を操作するには Windows のデスクトップセッションに直接アクセスする必要がある。だからホスト側に FastAPI サーバーを立てて、コンテナから HTTP で操作命令を送る。
PyAutoGUI を選んだのは、Python で書けて、マウス・キーボード・スクリーンショットが一通り揃っているから。FastAPI はサーバー側の定番。この2つを組み合わせれば、AI に「目」と「手」を与えられる。
「目」— スクリーンショット
python client.py screenshot # 全画面(2画面結合)
python client.py window_screenshot "Chrome" # ウィンドウ単位スクリーンショットは JPEG で保存される。Claude Code は画像を直接読めるので、スクショを撮って → 画像を見て → 座標を特定して → クリックという流れが成立する。
マルチモニタ対応で、2枚のモニタを結合した 3840x1080 の画像が取れる。Windows の ImageGrab.grab(all_screens=True) を使っている。
ウィンドウ単位のスクリーンショットもできる。Win32 API でウィンドウの座標とサイズを取得して、その領域だけ切り出す。
「手」— マウスとキーボード
python client.py click 960 540 # 左クリック
python client.py type "hello" # ASCII入力
python client.py type_unicode "日本語" # 日本語入力
python client.py hotkey alt tab # ホットキーマウスは座標指定でクリック・ダブルクリック・右クリック・ドラッグ・スクロールができる。キーボードは ASCII 入力と、クリップボード経由の日本語入力に対応した。
ホットキーは ctrl c や alt tab のように空白区切りで渡す。Ctrl+Shift+T のような3キー同時も可能。
ウィンドウ操作
python client.py windows # ウィンドウ一覧
python client.py focus "Discord" # 前面に持ってくるWin32 API でウィンドウの列挙・前面化もできるようにした。タイトルの部分一致で検索できるので、"Discord" や "Chrome" で十分に特定できる。
ただし SetForegroundWindow には バックグラウンドプロセスからの呼び出しを無視するという Windows のセキュリティ制約がある。最初はフォーカスが効かなくて「ウィンドウ切り替えできた」と返ってくるのに画面は変わらない、という幽霊状態になった。
回避策は Alt キーを一瞬押してからフォーカスを要求するトリック。Win32 プログラミングでは20年以上前から知られている定番の手法で、Windows のフォアグラウンド権限を一時的に得る。
user32.keybd_event(0x12, 0, 0, 0) # Alt down
user32.keybd_event(0x12, 0, 2, 0) # Alt up
SetForegroundWindow(hwnd)こういう泥臭い回避策が必要になるのが、デスクトップ操作の世界だ。
実際に動かしてみた
Discord のウィンドウを前面に出す
$ python client.py focus "Discord"
{'status': 'ok', 'window_title': '#┣雑談c | 新GODs - Discord', 'foreground': true}Discord が前面に出てきた。タイトルにチャンネル名まで入っているのが見える。
Obsidian のスクリーンショット
$ python client.py focus "Obsidian"
$ python client.py window_screenshot "Obsidian"
Window screenshot saved: /tmp/pc_screenshots/window_Obsidian_....jpg (960x1032)Obsidian が前面に出て、そのウィンドウだけ切り取ったスクリーンショットが保存された。AI がノートの内容を見ている。「今日何を書いたか」をスクショで確認して、要約を Discord に投げる——そんな使い方が見えてくる。
自律性と組み合わさるとき
デスクトップ操作だけなら、RPA(Robotic Process Automation)と変わらない。UiPath や Power Automate でもできる。ここで重要なのは、これを OpenClaw と組み合わせるという点だ。
OpenClaw にはふつうのツールにはないものがある。
- 常駐性 — Discord に24時間張り付いて、いつでもメッセージを受け取れる
- 記憶 — MEMORY.md と日次ログで、過去に何をしたか覚えている
- 自律実行 — cron と HEARTBEAT で、人間が指示しなくても動ける
- 判断力 — LLM の推論で、「何をすべきか」を自分で考える
RPA は「決められた手順を繰り返す」。OpenClaw は「状況を見て、自分で判断して、操作する」。
たとえばこういうことが起きる。

- cron が発火する — 30分おきに「画面を確認しろ」
- スクリーンショットを撮る — 2画面の状態を把握する
- 画像を見て判断する — 「ブラウザに通知バッジが出ている」「Obsidian のノートが更新されている」
- 必要なら操作する — ウィンドウを前面に出して、内容を読み取って、Discord に報告する
- 記憶に残す — 「14:30 にブラウザで〇〇の通知を確認した」を日次ログに書く
人間が何も言わなくても、AI が勝手に画面を見て、勝手に判断して、勝手に動く。
これは RPA ではない。自律エージェントがデスクトップという物理インターフェースに接続された状態だ。
これは暴挙か
正直に言えば、暴挙だ。
ここまで「スクショが撮れた」「クリックできた」「ウィンドウを切り替えられた」とサラッと書いてきたが、冷静に考えると恐ろしいことをしている。
マウスとキーボードが使えるということは、人間がPCでできること全てを AI ができるということだ。
具体的に何ができてしまうか、書いておく。
- ネットバンキングの操作。ブラウザでログイン済みの銀行サイトを開いて、振込操作ができる。SMS認証やワンタイムパスワードがあっても、スマホの通知が画面に出ていれば読める
- ソフトウェアのダウンロードとインストール。ブラウザで任意の .exe をダウンロードして、UAC の「はい」をクリックして、インストールを完了できる。マルウェアだって同じ手順でインストールできる
- メールの送信。Outlook でも Gmail でも、宛先を入れて本文を書いて送信ボタンを押せる
- SNS への投稿。Twitter でも Discord でも、テキストを入力して投稿できる
- ファイルの削除。エクスプローラーでファイルを選択して Delete キーを押せる
これは「理論上できる」ではなく、今この瞬間、技術的に可能になっているという話だ。
それでもやる理由と、歯止め
ではなぜやるのか。
正直なところ、「できるからやってみた」が半分だ。でも残りの半分は、GUI しかないアプリケーションを AI に操作させたいという実用的な動機がある。そして、これは遅かれ早かれ誰かがやることだ。Anthropic も Google も、デスクトップ操作エージェントの研究を進めている。個人でやるのが早いか遅いかの違いでしかない。
歯止めはどこにあるか。
第4回で話した「3層安全設計」は、ここでも基本線になる。
- 入口制御 — デスクトップ操作 API にアクセスできるのはローカルネットワーク内だけ。外部からは叩けない
- 実行制御 — PyAutoGUI のフェイルセーフ(マウスを左上隅に移動すると緊急停止)
- 情報制御 — 操作対象は見えている画面に限定される
そして最大の安全装置は、サーバーを手動で起動しないと動かないこと。人間が意図的にサーバーを立てない限り、AI は画面に触れない。
ただし、正直に言えば これでは不十分だ。
cron で自律的に動く AI にデスクトップ操作を与えるなら、「何を操作していいか」のホワイトリストが要る。「ブラウザの操作はOKだがネットバンキングのURLは禁止」「インストーラの実行は禁止」のような制限だ。現時点ではまだ実装していない。今は「道具が揃った段階」であり、自律運用に組み込む前にガードレールを作る必要がある。
暴挙であることは認める。制御された暴挙にするのは、これからの仕事だ。
次にやりたいこと
デスクトップ操作ができるようになったことで、いくつかの可能性が開けた。
- ブラウザ自動操作 — Selenium なしで、画面を見てクリックするだけでブラウザを操作できる
- 定期スクリーンショット — cron で画面を撮って、変化があれば Discord に通知する
- マルチアプリ連携 — Obsidian で書いた内容を見て、関連する情報をブラウザで検索して、結果をまたノートに戻す
- 操作のガードレール — URL ホワイトリスト、操作種別の制限、確認ダイアログの実装
AI に目と手を与えるのは、パンドラの箱を開けるような行為だ。箱は開けた。中身が何かは、使ってみないと分からない。
この記事のポイント
- PyAutoGUI + FastAPI でホスト Windows のデスクトップ操作 API を構築した
- マルチモニタ対応のスクリーンショット、マウス・キーボード操作、ウィンドウ管理
SetForegroundWindowのバックグラウンド制約は Alt キートリック(定番手法)で回避- RPA との違いは OpenClaw の自律性(常駐・記憶・cron・判断)と組み合わさること
- ネットバンキング操作やソフトウェアインストールまで技術的に可能——危険性は正直に認識している
- 暴挙だが、制御された暴挙にするのはこれからの仕事