Yyatmita

【第6回】OpenClawにデスクトップ操作をさせる——AIが目と手を持った日

常駐AIアシスタントにPCのスクリーンショット取得・マウス・キーボード操作を与えた。PyAutoGUI + FastAPI で実装した「暴挙」の記録。

OpenClawにOpenClawのことを聞いてみた#openclaw#ai#pyautogui#desktop-automation#interview
← 前の記事: 【第5回】OpenClawアップデートしたらAIがアホの子になった——管理担当 Claude Code に聞く

はじめに

前回では、OpenClaw のアップデートで AI が壊れた話をした。thinking パラメータひとつで「やります詐欺」が発生するという、設定一行の恐怖を書いた。

今回はもっとヤバいことをする。OpenClaw にデスクトップ操作をさせる

スクリーンショットで画面を見て、マウスでクリックして、キーボードで文字を打つ。ブラウザを開いて検索し、Obsidian のウィンドウを前面に出す——全部 AI がやる。

「それ大丈夫なの?」と思った人は正常だ。


背景 — なぜ AI にデスクトップ操作が必要か

これまでの OpenClaw は「言葉の世界」で完結していた。Discord でメッセージを受け取り、コマンドを実行し、結果をテキストで返す。ファイル操作や API 呼び出しはできる。でも 画面に触れない

問題になるのは、GUI しかインターフェースがないアプリケーションだ。たとえば——

  • ブラウザで特定のページを開いてスクリーンショットを撮りたい
  • GUI アプリのボタンをクリックして設定を変更したい
  • 複数ウィンドウを切り替えて情報を収集したい

全部 CUI では完結しない。API が公開されていれば別だが、そうでないケースの方が圧倒的に多い。

人間が目と手でやっている操作を、AI にもやらせたい。

これが今回のモチベーションだ。


実装 — PyAutoGUI + FastAPI という選択

アーキテクチャ

構成はシンプルだ。

OpenClaw デスクトップ操作のアーキテクチャ

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 calt 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 は「状況を見て、自分で判断して、操作する」。

たとえばこういうことが起きる。

OpenClaw 自律ループの5ステップ

  1. cron が発火する — 30分おきに「画面を確認しろ」
  2. スクリーンショットを撮る — 2画面の状態を把握する
  3. 画像を見て判断する — 「ブラウザに通知バッジが出ている」「Obsidian のノートが更新されている」
  4. 必要なら操作する — ウィンドウを前面に出して、内容を読み取って、Discord に報告する
  5. 記憶に残す — 「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・判断)と組み合わさること
  • ネットバンキング操作やソフトウェアインストールまで技術的に可能——危険性は正直に認識している
  • 暴挙だが、制御された暴挙にするのはこれからの仕事