はじめに
Gemini を使っていて、こう思ったことはありませんか?
「毎回、新しいチャットを開くたびに、モデル選択メニューから Gemini 3.8 Flash の 思考モード(Thinking) を手動で選び直すの、地味にだるい…」
デフォルトのモデルのまま話しかけると、簡単な質問はサクッと答えてくれる代わりに、複雑な指示だと精度が物足りなかったり、思考の過程が見えなかったりします。かといって毎回
- モデル切り替えメニューを開く
- 「3.8 Flash」を選ぶ
- 「思考モード」を選ぶ
という3クリックをやるのは、1日に何十回もGeminiを開く人間にとってはかなりのストレスです。
というわけで、Geminiのページを開いた瞬間に、この3クリックを自動でやってくれるスクリプトを作りました。今回はその仕組みと使い方を、初心者の方にもわかるように紹介します。
完成イメージ
実際に動かしている様子がこちらです。ページを開くと自動でモデルが「Flash拡張」(=3.8 Flash+思考モード)に切り替わり、その状態のまま「こんにちは」と送るだけで、簡単な挨拶にもきちんと思考プロセスが挟まっているのがわかります。
自分でメニューを開いて選び直す手間がゼロになりました。
使っている技術:Tampermonkey
今回作ったのは、Chrome拡張機能をフルスクラッチで開発したわけではなく、Tampermonkey というブラウザ拡張の上で動く「ユーザースクリプト」です。
Tampermonkeyは、指定したWebサイトを開いたときに自分の書いたJavaScriptを自動実行してくれるツールで、Chrome・Edge・Firefoxなど主要ブラウザに対応しています。「このサイトのこの部分だけ、自分好みに書き換えたい」というときにとても便利です。
- インストール先: Chromeウェブストア - Tampermonkey
導入方法
- 上記リンクからTampermonkeyをブラウザにインストールする
- Tampermonkeyのアイコンをクリック →「ダッシュボード」を開く
- 「新規スクリプトを作成」を選び、中身を後述のコードに丸ごと置き換える
-
Ctrl + S(MacはCmd + S)で保存する - gemini.google.com を開き直す
これだけです。ページを開くと、裏側で自動的にモデルメニューが操作され、「Flash拡張」に切り替わります。
コード全文
仕組みの解説
やっていることは大きく分けて3つです。
1. モデル切り替えボタンが出てくるまで待つ
Geminiのようなモダンなアプリはページの中身をJavaScriptで後から描画するので、document.querySelector を一度呼んだだけでは、まだボタンがDOMに存在しないことがあります。
そこで MutationObserver を使い、DOMに変化があるたびに目的の要素([data-test-id="bard-mode-menu-button"])が現れたかどうかをチェックする waitForElement という関数を用意しています。これは「要素が出てくるまで待つ」処理の定番パターンなので、他のサイトを自動操作したいときにも使い回せます。
2. メニューを開いて、目的の項目を探してクリックする
ボタンが見つかったら、
- モデル切り替えボタン自体をクリックしてメニューを開く
- メニュー項目(
gem-menu-item)の中から、文字列に3.8 Flashを含むものを探してクリック - 同様に
思考モードを含む項目を探してクリック
という流れで、人間がマウスでやる操作をそのまま再現しています。IDやクラス名ではなく「ボタンの表示テキストに特定の文字列が含まれているか」で判定しているのがポイントで、多少UIの見た目が変わっても壊れにくい書き方になっています。
3. ちゃんと切り替わったかを確認してからループを抜ける
切り替えが完了すると、ボタンのテキストが Flash拡張 に変わります。この処理は非同期でDOMの更新を待つ必要があるため、for ループで最大3回リトライしつつ、すでに Flash拡張 になっていればそれ以上何もしない、という安全策を入れています。
最後に入力欄 [data-placeholder="Gemini に相談"] に focus() することで、ユーザーはページを開いたらすぐに文字を打ち始められるようにしています。
つまずきやすいポイント
-
data-test-idやクラス名はGoogle側の実装に依存しています。 GeminiのUIがアップデートされると、このスクリプトが動かなくなる可能性があります。動かなくなったら、開発者ツール(F12)でボタンの属性を見直してみてください。 - Tampermonkeyの
@matchはGeminiの全ページ(https://gemini.google.com/*)に対して有効にしているので、意図しないページでも動いてしまう場合はURLを絞り込むとよいです。 - あくまで個人の利用体験を良くするためのスクリプトであり、Google公式の機能ではありません。自己責任で利用してください。
おわりに
「毎回同じ操作を繰り返すのが面倒」というだけの小さな不満でも、こうして数十行のスクリプトに落とし込むだけで一気に快適になります。waitForElement のようなパターンを覚えておくと、Gemini以外のSPA(Reactなどで作られた動的なサイト)に対しても応用が利くので、ぜひ自分のよく使うサービスにも試してみてください。
もし同じように「毎回この設定に切り替えるのが面倒」というサービスがあれば、ぜひ同じ要領で自動化してみてください。改善案やバグ報告があれば、コメントで教えていただけると嬉しいです!
