记录一次配置过程
给 WXT 开发的 Chrome 插件配置自动发布
Chrome Web Store · Service Account · 一次配置

把插件发布交给 API
EDITOR'S NOTE
WHY AUTOMATE插件每次更新都要重新打包,再打开开发者后台选择 ZIP、上传、提交审核?这些步骤可以交给 Chrome Web Store API。
不需要先弄懂 API,也不用再注册一个真人邮箱。先配置一次,之后每次发布只需要执行一条命令。
发布为什么会变成最麻烦的一步
插件功能写完后,发布反而成了最麻烦的环节:
改完代码,要手动打包; 打开 Chrome Web Store Developer Dashboard; 找到对应插件; 上传 ZIP; 再点击提交审核; 换一台电脑,还要重新配置一遍。
传统的 OAuth 配置还要保存 refresh_token。它一旦过期、被撤销,或者授权账号换了,发布流程就可能失效。
这次我用 Google Cloud 的 Service Account 配合 Chrome Web Store API。配置完成后,发布只剩下一条命令。
01
PART
为什么用 Google Cloud Service Account
IDENTITY · 身份
这里会用到两个账号:个人 Google 账号和 Service Account。它们负责的事情不同,先分清这一点,后面的配置就不会串。
你的个人 Google 账号
它负责登录 Chrome Web Store Developer Dashboard,管理插件所在的 Publisher,再把发布权限授权给程序账号。
Service Account
它是 Google Cloud 生成的程序账号,格式和 Gmail 邮箱一样,但不是第二个 Gmail:
没有收件箱; 不需要再注册一个真人账号; 不能代替你登录普通网页; 脚本通过 JSON key 调用 API。
个人账号负责授权,Service Account 负责调用 API。
02
PART
我为什么选 Service Account
CHOICE · 取舍
不依赖个人 refresh token
传统 OAuth 方案要保存 client_id、client_secret 和 refresh_token。其中任何一项失效,自动发布就可能中断。
Service Account 每次用 JSON key 生成短期 access token,不需要手动维护 refresh token。
更适合多个插件
如果多个插件属于同一个 Chrome Web Store Publisher,可以共用:
同一个 Service Account; 同一个 JSON key 文件; 同一个 Publisher ID。
每个插件只需要使用自己的 Extension ID,不用为每个插件重新创建账号。
少做几步手工操作
配置好以后,日常只需要改版本号,再执行项目里的 release 命令。打包、上传和提交审核由脚本完成。
私钥可以只放在本机
这次做的是本地发布,所以把 JSON 私钥放在项目目录之外就够了,不需要先搭建 CI。以后如果要接 GitHub Actions,再把私钥放进 GitHub Secrets,发布逻辑不用改。
03
PART
准备工作
CHECKLIST · 准备
先准备四样东西:
01 Google 账号
一个完成 Chrome Web Store Developer 注册的 Google 账号,注册金额是一次性 5 美元;
02 Google Cloud Project
一个 Google Cloud Project;
03 Service Account
一个 Service Account 和它的 JSON key;
04 Chrome Web Store 插件条目
一个已经在 Chrome Web Store 建好的插件条目。
注意
如果插件还没有商店条目,API 只能更新已有条目。第一次上架和填写商店资料,还是要在后台手动完成。
04
PART
在 Google Cloud 创建 Service Account
SETUP · GOOGLE CLOUD
第一步:创建或选择 Project
打开 Google Cloud Console,先在顶部选择一个已有项目。

如果还没有项目,点击右上角的创建按钮。


Project 名称可以填:
Browser Extension Publishing
这个 Project 只是 Google Cloud 里的容器,用来启用 API 和存放 Service Account。后面配置 CHROME_PUBLISHER_ID 时,不填它。
第二步:启用 Chrome Web Store API
在 Google Cloud Console 顶部搜索 Chrome Web Store API。

打开搜索结果,点击 Enable。

第三步:创建 Service Account
左侧菜单依次打开 IAM & Admin → Service Accounts → Create service account。



名称可以填:
extension-publisher


创建过程中如果要求分配 Project Role,可以先跳过。Chrome Web Store 的插件权限不在这里授予,下一步还要到 Developer Dashboard 配置。记住这个 Service Account 的邮箱,后面会用到。
第四步:创建 JSON key
进入刚创建的 Service Account:
点击 Keys; 点击 Add key; 点击 Create new key;


选择 JSON,再点击 Create。

浏览器会下载一个 JSON 文件。里面通常有:
client_email:Service Account 的邮箱地址; private_key:用于签名的私钥。
这个文件只会下载一次,是脚本访问 API 的凭证。不要把它上传到 Git,也不要发到聊天窗口或截图分享。
05
PART
把 Service Account 授权给 Chrome Web Store
AUTH · 授权
打开 Chrome Web Store Developer Dashboard,登录管理这个插件的个人 Google 账号。
按下面的路径操作:
左侧点击 Account; 找到 Service accounts; 添加第四步 JSON 文件里的 client_email; 点击保存。

Google Cloud 只负责创建 Service Account,Chrome Web Store 的插件权限要在这里授予。把账号添加到 Service accounts 后,脚本才可以访问插件。
如果后台已经绑定了另一个 Service Account,不要直接删除。一个 Publisher 通常只绑定一个 Service Account,这时应使用已绑定账号对应的 JSON key。
06
PART
最终配置
CONFIG · 配置
完成前面的步骤后,在每个 WXT 插件项目的根目录创建 .env.submit 文件,最终配置如下:
CHROME_EXTENSION_ID=你的插件ID
CHROME_PUBLISHER_ID=你的Publisher ID
CHROME_SERVICE_ACCOUNT_KEY_FILE=~/.config/chrome-web-store/service-account.json
CHROME_SKIP_SUBMIT_REVIEW=true
下面逐行解释这些值从哪里来,以及它们分别控制什么。
CHROME_EXTENSION_ID
这是某一个插件自己的唯一 ID。打开插件的 Chrome Web Store 页面,复制 URL 中 /detail/ 后面的那段字符串:
https://chromewebstore.google.com/detail/插件名称/这里就是Extension-ID
注意
每个插件的 ID 都不同,不能把 A 插件的 ID 填到 B 插件里。除了 URL,也可以在插件详情页顶部找到它。

CHROME_PUBLISHER_ID
这是发布者账号的 ID,同一个 Publisher 下的多个插件共用一个值。
获取路径:
Chrome Web Store Developer Dashboard
→ Publisher
→ Settings
→ Publisher ID
记住区别
Publisher ID 代表“谁在发布”,不是 Gmail 地址、Google Cloud Project ID,也不是插件自己的 Extension ID。在上面的 Settings 页面就能找到它。

CHROME_SERVICE_ACCOUNT_KEY_FILE
这是第四步下载的 JSON key 文件在本机的存放路径。这里填的是文件路径,不是 Service Account 邮箱。建议把 JSON key 放在项目目录之外,并使用一个与具体插件无关的公共路径,这样同一个 Publisher 下的多个 WXT 插件可以复用。
CHROME_SKIP_SUBMIT_REVIEW
这个值控制上传后是否提交审核:
true:只上传,不提交审核,适合第一次测试; false:上传后自动提交审核。
建议首次配置时使用 true,确认配置无误后再改成 false。这个值是发布策略,不是从 Google Cloud 或 Chrome Web Store 后台获取的。
SECURITY NOTE
同一个 Publisher 下的多个 WXT 插件,通常只需要更换 CHROME_EXTENSION_ID。CHROME_PUBLISHER_ID 和 CHROME_SERVICE_ACCOUNT_KEY_FILE 可以复用。JSON key 和 .env.submit 都不要提交到 Git,尤其要保护 private_key。
///
END
顺便介绍一下 EnglishCC
A SMALL PLUG-IN · 推荐
最后推荐一下我自己开发的 EnglishCC。它是一个 Chrome 浏览器插件,主要用于通过 YouTube 视频学英语。
它会把视频字幕重新整理得更适合阅读。遇到不认识的单词,可以直接点击查询,也可以把想记的词保存下来,之后继续在字幕和复习中使用。
目前我主要把 YouTube 的体验做好了,Bilibili 还在继续适配,支持还不完整。如果你平时用 YouTube 学英语,可以试试 EnglishCC。
EnglishCC.com
我是烂人文,分享一些好玩的。
如果你觉得今天这篇有收获,欢迎点赞、在看、转发三连,我们下篇见。
THANKS FOR READING
夜雨聆风