← AIバイブコーディングTips 一覧へ Browser Agent / 運用の失敗談

座標クリックは別アカウントを踏む。ブラウザ自動操作に「送信前の現在地確認」を入れた話

AIにブラウザを操作させて、SNSの複数アカウントを毎日切り替えながら運用しています。ある夜、AIが画面の座標をクリックした瞬間、意図しない別のアカウントに切り替わり、そのまま有料プランの勧誘ページへ飛びました。実害はゼロでしたが、同じ種類の事故は約1ヶ月で5回以上起きていました。原因と、最後に落ち着いた「確認の型」をまとめます。

この記事で手に入るもの

ブラウザ操作エージェントで座標クリックが外れる構造と、取り返しのつかない操作の手前に置く「現在地確認」の3点セット。自分の自動化に今日から足せるチェックリストつきです。

01 — 何が起きたか

クリックしたのは「正しい場所」だった。ただし0.5秒前の

運用はシンプルです。AIがブラウザでSNSを開き、アカウント切替メニューから対象アカウントを選び、返信を書いて送る。毎日、朝と夜に回しています。

切替メニューが開かない不具合が出ていたので、AIは切替専用のページに直接移動して回避しました。ここまでは正しい判断です。問題はその次でした。AIはスクリーンショットを撮り、目的のアカウントの行の座標を読み取り、そこをクリックしました。

ところが、一覧の各行にあるアイコン画像は遅れて読み込まれるため、スクリーンショットを撮った直後に行の位置が数十ピクセルずれていました。クリックが落ちたのは、ずれて上がってきた別のアカウントの行。切り替わった先のアカウントでは、有料プランの申込ページが自動で開きました。

AIはそのページで何も操作せず離脱し、記録を残しました。投稿も課金も起きていません。ただ、ログをさかのぼると同じ型の事故は8月下旬から何度も起きていました。


02 — 原因

座標は「見た瞬間の世界」を指している

最初の対策は「クリックの直前に必ずスクリーンショットで位置を確認する」でした。手順書にもそう書きました。それでも再発しました。理由は、確認とクリックのあいだにも画面は動き続けるからです。

01

見てから押すまでに、時間差がある

AIは画像を読み、座標を計算し、ツールを呼ぶ。その数秒のあいだに遅延読み込みやレイアウト調整が走れば、座標が指す中身は入れ替わります。人間なら指を動かしながら目で追い直せますが、座標クリックは撃ちっぱなしです。

02

リスト状のUIほどずれの被害が大きい

アカウント一覧のように「同じ形の行が縦に並ぶ」画面では、数十ピクセルのずれがそのまま隣の選択肢になります。押し間違えてもエラーにならず、成功して別のことが起きるのが一番厄介です。

03

失敗が静かで、結果だけが大きい

切替は1クリックで完了し、確認ダイアログもありません。間違ったアカウントから返信を送れば、それは公開された発言として残ります。取り返しのつかない操作の手前にいる、という自覚が仕組み側に無い状態でした。

ここが核心。「よく見てから押す」は、画面が止まっている前提の対策です。動く画面に対しては、見た目の位置ではなく、中身で対象を指定する必要がありました。


03 — 対策

落ち着いた型:中身で押し、押す前に現在地を読む

最終的に、手順書の該当箇所を「座標クリックは使わない」と書き換えました。中身は次の3つです。

① クリック対象は「位置」ではなく「中身」で指定する

切替ダイアログの中から、目的のアカウント名を含み、他のアカウント名を含まない要素をJavaScriptで探してクリックします。行の位置が何ピクセルずれても、名前で探す限り隣の行は踏みません。

// 考え方の例(実際のセレクタはサイトごとに調べる)
const dialog = document.querySelector('[role="dialog"]');
const rows = [...dialog.querySelectorAll('button, [role="button"]')];
const target = rows.filter(r =>
  r.innerText.includes('@目的のアカウント') &&
  !r.innerText.includes('@他のアカウント'));
// ちょうど1件に絞れたときだけ押す。0件・複数件なら止まる
if (target.length === 1) target[0].click();

ポイントは最後の行です。候補がちょうど1件のときだけ押す。曖昧なら押さずに止まる。これで「たぶんここ」で押す余地がなくなります。

② 送信の直前に、毎回「今どこにいるか」を読む

切替が成功したかどうかは、切替の直後ではなく送信ボタンを押す直前に確かめます。画面上の表示名はたまに空で返ってくるので、ログイン中のプロフィールへのリンク先など、より確実に取れる値を読んで照合します。一致しなければ送らない。

③ 入力したつもりの文字が、本当に入っているかを読む

同じ夜、もう一つの事象も多発していました。入力欄をクリックしてから文字を打ったのに、欄が空のままになる。クリックで欄が展開されただけでフォーカスが外れていたためです。対策は、入力欄を選び直してから打ち、送信前に欄の中身を読んで本文と一致するかを確かめること。空のまま送信すれば空投稿、半分だけ入っていれば途切れた発言が公開されます。


04 — チェックリスト

自分のブラウザ自動化に足すなら

SNSに限らず、送信・購入・削除・切替のような「押したら戻せない」操作をAIにやらせているなら、次の点を手順書に入れておくと事故の型をまとめて潰せます。

✓
座標クリックは「戻せる操作」に限るスクロールや開閉など、間違えても実害のない操作だけに使う。
✓
戻せない操作は中身で対象を特定する名前・ラベル・リンク先で要素を探し、候補が1件に絞れたときだけ押す。
✓
押す直前に現在地を読むログイン中のアカウント、開いているページ、対象の宛先。切替の直後ではなく、送信の直前に照合する。
✓
入力内容を読み戻す打った文字が欄に入っているかを、送信前に中身で確認する。
✓
想定外のページに飛んだら何も押さずに離脱する勧誘・ログイン・課金画面に着いたら、その場では一切操作せず戻り、記録だけ残す。
✓
ヒヤリハットも記録する実害ゼロでも1行残す。今回、同じ型の再発に気づけたのはこの記録があったからです。

05 — まとめ

「よく見る」から「中身で確かめる」へ

最初の対策が「もっと注意深く見る」だったのは、人間向けの発想をそのままAIに渡していたからだと思います。AIの目は速くて正確ですが、見てから押すまでのあいだに世界が動くことまでは補ってくれません。

だから、注意力に頼る代わりに確認を手順の側に埋め込む。対象は中身で指定し、押す直前に現在地を読み、打った内容を読み戻す。地味ですが、この方式に統一してから1週間あまり、朝晩の運用で同じ型の誤切替は記録されていません。

本記事は筆者のSNS運用自動化の記録(2026年8〜9月)をもとにしています。アカウント名・数値などの具体的な情報は伏せています。コード例は考え方を示すもので、実際の要素の構造はサイトや時期によって変わります。