Noriyo Akita's Today I Learned

# Chrome拡張を Chrome Web Store に公開した

Table of Contents

デベロッパーアカウントを登録する
https://developer.chrome.com/docs/webstore/register?hl=ja

登録はデベロッパーコンソールで行う
https://chrome.google.com/webstore/devconsole?hl=ja

登録料を払う。1回のみ5ドル

Chrome Extension > Get Started

https://developer.chrome.com/docs/extensions/get-started?hl=ja

「Chromeウェブストアに公開する」のセクションを見てみる

Program Policies の翻訳と要約

https://developer.chrome.com/docs/webstore/program-policies/policies

  1. Chrome ウェブストアのポリシーの概要: Chrome ウェブストアは、信頼と透明性に基づいた安全な環境を提供することを目指しており、すべての開発者は開発者プログラムポリシーと開発者契約を遵守する必要があります。これらのポリシーは、拡張機能の審査における指針となり、マーケティング資料、ユーザー生成コンテンツ、広告、ランディングページなど、アプリケーション/拡張機能/テーマのすべてのユーザーエクスペリエンスに適用されます。

  2. ベストプラクティスとガイドライン: 開発者は、Chrome ウェブストアのポリシーを理解し遵守する必要があります。拡張機能はChrome ウェブストアに価値を付加するものでなければならず、不正行為は禁止されています。ユーザーデータの収集、使用、開示に関する厳格なガイドラインを遵守し、ユーザーの同意を得る必要があります。拡張機能の情報とメタデータは最新かつ正確である必要があり、提出前にクラッシュ、バグ、機能不全がないかテストする必要があります。連絡先情報を確認し、Chrome ウェブストアからの重要な連絡に対応する必要があります。機能の目的を明確にし、顧客サポートを提供し、ポリシーの変更に常に注意を払う必要があります。

  3. 安全なエコシステムの促進: 露骨な性的コンテンツ、悪意のある製品(ウイルス、マルウェアなど)、およびヘイトスピーチや暴力的行動は禁止されています。児童ポルノに対するゼロ容認ポリシーがあり、発見した場合は関係者を当局に通報します。規制対象の商品やサービス(違法行為、賭博、医薬品、アルコール、武器など)の販売促進も禁止されています。

  4. ユーザープライバシーの保護: ユーザーデータを扱う場合、正確かつ最新のプライバシーポリシーを掲載する必要があります。プライバシーポリシーでは、データの収集、使用、共有方法、共有先を包括的に開示する必要があります。データの使用は開示した内容に限定し、ウェブ閲覧履歴の収集と利用は、製品のChrome ウェブストアページとユーザーインターフェースで明確に説明されているユーザー向け機能に必要な範囲に限定されます。ユーザーデータの使用は単一の目的に限定され、個人広告のためのデータ転送、使用、販売は禁止されています。

  5. 責任あるマーケティングと収益化の確保: 他者のなりすましや知的財産権の侵害は禁止されています。拡張機能のマーケティングは責任を持って行い、明確かつ透明な方法で提供される機能を明記する必要があります。誤解を招くインストール戦術は使用できません。ユーザーから支払いを受け付ける場合、クレジット カードなどの機密性の高い個人情報を安全に収集、保存、送信する必要があります。誤解を招く行為や予期しない動作、虚偽の情報は禁止されています。広告はコンテンツ ポリシーに準拠する必要があり、ユーザーの同意なしに広告をクリックさせたり、個人情報を送信させたりすることは禁止されています。アフィリエイト広告は、製品のChrome ウェブストアページ、ユーザーインターフェース、およびインストール前に明確に説明する必要があります。

  6. 高品質な製品の構築: Chrome ウェブストアでは、基準と価値観に合致し、価値のあるユーザーエクスペリエンスを生み出す製品が紹介されます。スパムや不正行為は禁止されており、重複したエクスペリエンスや機能を提供する複数の拡張機能を提出することはできません。拡張機能の配置を操作したり、製品の評価やレビューを不正な手段で操作したりしてはなりません。通知の乱用や、ユーザーが内容と送信先を確認できないままメッセージを送信する拡張機能は禁止されています。

  7. 品質に関するガイドライン、リスト要件、および最小限の機能: 拡張機能は、狭く理解しやすい単一の目的を持つ必要があります。無関係な機能をまとめて受け入れる必要のある拡張機能を作成しないでください。製品に空白の説明フィールドがある場合、またはアイコンやスクリーンショットがない場合は、拒否されます。製品の説明には、最新かつ正確な情報を含める必要があります。拡張機能は、Chrome ウェブストアのカタログに価値を提供する基本的な機能とユーティリティを提供する必要があります。

  8. Chrome アプリ: Chrome ウェブストアを通じて配布される Chrome アプリは、優れたユーザーエクスペリエンスを確保するために、追加の品質ガイドラインに従う必要があります。

  9. 技術要件: 開発者は、コードを難読化したり、拡張機能の機能を隠したりしてはなりません。既存の Chrome API を使用する必要があります。マニフェスト V3を使用する拡張機能は、拡張機能のコードに関する追加要件を満たす必要があります。具体的には、拡張機能のすべての機能を、提出されたコードから容易に判別できるようにする必要があります。

  10. 2段階認証: Chrome ウェブストア アカウントのセキュリティを確保するため、拡張機能を公開する前、または既存の拡張機能を更新する前に、すべての開発者アカウントで 2 段階認証が必須になります。

  11. 執行、通知および不服申し立て、および繰り返しの虐待: 意図された制限または執行措置を回避しようとすると、開発者アカウントが即時停止され、場合によっては関連する開発者アカウントも停止されます。製品が Chrome ウェブストアから削除された場合、その旨を通知するメールが送信されます。違反の決定に対する不服申し立ては 1 回のみ許可されます。Chrome ウェブストアの配布契約またはこれらのプログラム ポリシーに対する重大な違反または繰り返しの違反は、開発者アカウントの停止につながります。

拡張機能のセキュリティを強化

https://developer.chrome.com/docs/extensions/develop/migrate/improve-security?hl=ja

先に GitHub で公開していたので GitHub Copilot に調べてもらった

ありがとうございます! manifest.json(生成済み)と wxt.config.ts の内容をもとに、Chrome拡張のセキュリティ要件違反があるか確認しました。
---
## チェック結果
### manifest.json のポイント
- **manifest_version: 3** → 最新のセキュリティモデル
- **background.service_worker** → 拡張のバックグラウンドは service worker 方式
- **permissions: ["tabs"]** → 権限は必要最小限
- **action.default_popup** など → ポップアップもローカルリソース
- **icons** → すべてローカル画像
- **外部リソース指定なし** → "content_security_policy" や「web_accessible_resources」等に外部URL指定はありません
### wxt.config.ts のポイント
- vite/tailwindcss プラグインなど、すべてnpm経由でローカルビルド
- React等のモジュールもnpmインストール&ローカル利用
### 違反の可能性がある点
- **外部CDNやリモートコード読込** → manifest.json・wxt.config.tsともに該当なし
- **eval, Function の利用** → コード断片では未検出
- **インラインイベントハンドラ** → index.htmlやpopup.htmlを見ても未検出
- **CSP(Content Security Policy)** → manifest.jsonで特に独自CSP指定なし(MV3ではデフォルトで安全側)
---
## まとめ
**Chrome公式の「外部コード禁止」や「CDNからのライブラリ利用禁止」ルールに違反している箇所はありません。**
- すべてのJS/CSSリソースはローカル(npmビルド)で提供されています
- manifest.jsonに外部URL指定もありません
- 危険なeval/Function等も使っていません(追加で全コード検索も可能)
---
**追加調査が必要な場合(例:全コードで eval や Function 検索、web_accessible_resources の拡張確認など)はご指示ください。**
現在の状態では、Chrome拡張のセキュリティ指針(該当記事内容)に違反する箇所は見当たりません。

欧州経済領域(EEA)の消費者保護法についての対応

欧州経済領域(EEA)の消費者保護法に関して、パブリッシャーのアカウントが取引業者とみなされるか、非取引業者とみなされるかを宣言します。

非取引業者アカウントを選択しておいた

https://developer.chrome.com/docs/webstore/program-policies/trader-disclosure

  1. トレーダー/非トレーダーの透明性要件: 2018年4月11日に欧州委員会が採択した「消費者に関する新たな取引(New Deal for Consumers)」は、EU消費者法の執行強化と市場の発展を考慮したEU消費者保護規則の近代化を目的としています。このNew Dealの条項の一つとして、2022年5月28日に施行され、オンラインマーケットプレイスは契約を結ぶ相手がプロのトレーダーか個人かを消費者に知らせることを義務付けています。

  2. トレーダーと非トレーダーの定義: 欧州委員会は、トレーダーを「市場における契約に関連して、自身の取引、ビジネス、工芸、または職業に関連する目的で行動する自然人または法人」と定義しています。一方、非トレーダーは「市場における契約に関連して、自身の取引、ビジネス、工芸、または職業の範囲外の目的で行動する自然人または法人」と定義しています。開発者は、自身のトレーダー/非トレーダーのステータスを正確に自己申告する責任があります。非トレーダーの場合、消費者には消費者保護法に由来する消費者の権利が適用されないことが通知されます。

  3. トレーダー情報の収集と検証: 2024年2月17日より、欧州連合はオンラインマーケットプレイスに対し、プラットフォームで活動するトレーダーの情報を識別し検証することを義務付けました。この変更に伴い、Chromeウェブストアはトレーダーの法的名称、連絡先、およびその他の関連する身分証明書などの情報を収集し維持します。検証済みのトレーダー情報は、Chromeウェブストアのユーザーが利用できます。これにより、消費者や他の企業は、トレーダーとの取引時に情報に基づいた意思決定を行うために必要な情報にアクセスできるようになります。

アイテムを公開する準備

version

https://wxt.dev/guide/essentials/config/manifest.html#version-and-version-name

WXT は package.json に記述してあるものからうまいことマニフェストファイルに記載してくれるようだ

package-lock.json の方で version が更新されていないから npm install したら更新された

git のタグを打つ

version tag を打っておく。

例:

git tag -a v1.0.0 -m "Release version 1.0.0"
git push origin v1.0.0

Zip ファイルを生成する

WXT を使用しているので Zip ファイル生成用のコマンドがある https://wxt.dev/guide/essentials/publishing.html#chrome-web-store

wxt zip

自動化することもできるようだが、初回は手動でやらないといけない

.output/lazycluster-1.0.0-chrome.zip が作成される。これをアップロードすればいいのだろう

GitHub でリリースノートを生成した

gh release create v1.0.0 .output/lazycluster-1.0.0-chrome.zip

審査のため Developer Dashboard から提出する

wxt zip で作成した Zip ファイルをアップロードした。

ストアの掲載情報タブやプライバシータブにて必要な情報を入力した。

Privacy Policy はページを用意する必要があったのでめっちゃ簡単な GitHub Pages を用意した。

https://noriyotcp.github.io/lazycluster/

「アカウント」タブにて

連絡先メールアドレスを入力する必要があった

ここまでやって審査のため送信ができるようになった。

(2025-08-31 追記) 公開されてた

8/17 に申請して 8/19 に公開されてた。全然気づかなかった

lazycluster - Chrome ウェブストア


新しいバージョンを公開する手順

GitHub でバージョンを更新してタグを打つ

package.jsonversion を更新してコミットし、タグを打つ

リリースノートを書く

ストアの掲載情報の変更

説明文の変更やスクリーンショットの追加などは、Developer Dashboard の「ストアの掲載情報」タブから行う。

新しいバージョンのアップロード

  1. wxt zip コマンドを実行して、新しいバージョンの Zip ファイルを生成する。
  2. (手動の場合)Developer Dashboard の「パッケージ」タブに移動し、「新しいバージョンをアップロード」セクションで、生成した Zip ファイルをアップロードする。
  3. (自動の場合)wxt submit command を使用する。https://wxt.dev/guide/essentials/publishing.html#automation

一応タグがなければ以下コマンドで自動的に作ってくれるらしいが、今回は先にタグをプッシュしておいた。

❯ git push origin --tags
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 810 bytes | 810.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
To github.com:noriyotcp/lazycluster.git
* [new tag] v1.1.0 -> v1.1.0

その場合は以下オプションをつけるといいらしい。

Use --notes-from-tag to automatically generate the release notes from the annotated git tag.

成果物はあくまで release のアセットとしてアップロードされるだけ。Chrome Web Store にアップロードするのは別途行う必要がある。

gh release create v1.1.0 .output/lazycluster-1.1.0-chrome.zip --notes-from-tag

--generate-notes をつけるのを忘れてしまった。まあいいか

いや、一緒にはできなさそう

❯ gh release create v1.1.1 .output/lazycluster-1.1.1-chrome.zip --notes-from-tag --generate-notes
using `--notes-from-tag` with `--generate-notes` or `--notes-start-tag` is not supported
My avatar

Thanks for reading my blog post! Feel free to check out my other posts or contact me via the social links in the footer.


More Posts