0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「ChatGPT o4-mini-high」を使ってGoogleChrome拡張機能を公開した話

Posted at

ChatGPT o4-mini-high を使って Google Chrome 拡張機能を公開した話

今回は、ChatGPT o4-mini-high を活用して、Google カレンダーの「コピー」ボタンから Meet の URL のみを抽出してクリップボードに入れる Chrome 拡張機能を開発・公開した手順をまとめました。


🎯 背景

  • 課題:Google カレンダーで「コピー」ボタンを押すと、予定の全文(氏名や日時、タイムゾーンなど)まで全部コピーされてしまう
  • 解決策:イベント詳細ダイアログ内の Meet リンクだけを自動で抽出してコピーする拡張機能を作成

🚀 機能概要

  1. カレンダーでイベント詳細ダイアログを開く
  2. 「コピー」ボタンをクリック
  3. ダイアログ内にある Meet URL(例: https://meet.google.com/xxx-xxxx-xxx)のみがクリップボードにコピーされる

🛠️ 開発手順(コード抜きの概要)

  1. プロジェクト構成

    • manifest.json:拡張のメタ情報と権限設定
    • content.js:ページにスクリプトを注入するだけのファイル
    • injected.js:ページコンテキストで execCommand('copy') をフックしてリンクを抽出
    • icons/:ストア掲載用のアイコン
  2. マニフェスト設定

    • clipboardWrite 権限:クリップボード書き込み用
    • host_permissionshttps://calendar.google.com/* でカレンダーの DOM にアクセス
    • web_accessible_resources:CSP 回避のため外部ファイルを注入
  3. スクリプト注入

    • content.js<script src="…/injected.js"> をページに追加
    • injected.js ではページと同じコンテキストで document.execCommand を上書き
  4. URL 抽出ロジック

    • 開いている “イベント詳細ダイアログ” 要素だけを検索
    • a[href^="https://meet.google.com"] を優先し、なければテキストから正規表現で抽出
    • クエリパラメータ(?authuser=…)を除去してベース URL のみコピー
  5. パッケージ化 & 公開

    • プロジェクトを ZIP にまとめる
    • Chrome ウェブストア デベロッパーダッシュボードにアップロード
    • タイトル・説明・スクリーンショット・プライバシーポリシー URL を登録
  6. プライバシーポリシー & 審査対応

    • ユーザーの個人情報は一切収集せず、権限は最小限
    • clipboardWritehost_permissions の使用理由を明記
    • リモートコードは不使用と明言

🔧 トライ&エラー

  • 最初の試み
    Content Script 内で copy イベントをフックし、全文から Meet リンクを抽出して clipboard.writeText() → 何も変わらず全文コピーされた
  • ChatGPT への質問
    「コピーした内容が変わらないです」
  • 返答
    ページコンテキストで execCommand('copy') を丸ごと乗っ取る注入方法に変更
  • 次の問題
    CSP(Content Security Policy)エラーが発生し、インラインスクリプトがブロックされた
  • ChatGPT への質問
    「Refused to execute inline script because it violates CSP…」
  • 返答
    injected.js を外部ファイル化し、web_accessible_resources 経由でページに注入する方法
  • 追加の課題
    同じカレンダー内の別イベントの URL がコピーされてしまう
  • ChatGPT への質問
    「別の URL がコピーされる…特定のダイアログ内だけから抽出するには?」
  • 返答
    div[role="dialog"] でダイアログを限定してその内部だけを検索
  • 最終的な課題
    コピーした URL に ?authuser=0&hs=… が付与される
  • ChatGPT への質問
    「パラメータがつくんだけどどう除去?」
  • 返答
    new URL()search をクリアする or split('?')[0] でフォールバック削除
  • 結果
    ベースの Meet URL のみが確実にコピーできるようになった

🎉 まとめ

  • ChatGPT o4-mini-high の対話を活用し、要件定義から審査対応まで最速実装
  • CSP 回避、ページコンテキスト注入、ダイアログ限定抽出、クエリ除去など、現場で悩みがちなポイントもクリア

ちなみに、この文章もChatGPTですw

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?