从零开发Chrome广告拦截插件:开发、打包到发布全攻略

从零开发Chrome广告拦截插件:开发、打包到发布全攻略

想打造一个属于自己的Chrome插件,既能拦截烦人的广告,又能优雅地发布到Chrome Web Store?别担心,这篇教程将带你从零开始,动手开发一个功能强大且美观的广告拦截插件,涵盖编码、打包和上架的全过程。无论你是新手还是老司机,跟着这篇指南,保证你能轻松上手,做出一个让人惊艳的小工具!


1 开发你的广告拦截插件:从创意到代码实现

开发Chrome插件的第一步是明确功能:我们要实现一个可切换开关、支持自定义规则的广告拦截器。让我们一步步把创意变成现实!

1.1 准备开发环境与文件结构

动手前,先把工具和文件准备好,就像搭积木前要整理好零件。

1.1.1 选择IDE
  • 推荐工具:Visual Studio Code(简称VS Code),轻量且支持Chrome调试插件。
  • 为什么选它:内置终端、代码高亮、扩展丰富,简直是开发插件的神器!
1.1.2 创建项目文件夹
  • 目录结构:新建一个名为AdBlocker的文件夹,包含以下文件:
AdBlocker/
├── manifest.json       # 插件的核心配置文件
├── background.js       # 后台脚本,处理拦截逻辑
├── popup.html          # 弹出窗口界面
├── popup.js            # 弹出窗口逻辑
├── options.html        # 设置页面
├── options.js          # 设置页面逻辑
└── images/             # 图标文件夹├── icon16.png      # 16x16像素图标├── icon48.png      # 48x48像素图标└── icon128.png     # 128x128像素图标

1.2 编写核心文件

现在,拿起键盘,开始敲代码吧!

1.2.1 配置manifest.json
  • 作用:这是插件的“身份证”,告诉Chrome你的插件是谁、能干啥。
  • 代码示例
{"manifest_version": 3,"name": "Ad Blocker with Toggle","version": "1.0","description": "A customizable ad blocker","permissions": ["declarativeNetRequest","storage","downloads"],"host_permissions": ["<all_urls>"],"action": {"default_popup": "popup.html","default_icon": {"16": "images/icon16.png","48": "images/icon48.png","128": "images/icon128.png"}},"background": {"service_worker": "background.js"},"options_page": "options.html"
}

亮点:Manifest V3是最新标准,支持Service Worker,权限声明清晰。

1.2.2 实现后台逻辑background.js

功能:拦截广告请求,根据用户设置动态更新规则。
代码示例:

const defaultRules = [{ id: 1, priority: 1, action: { type: "block" }, condition: { urlFilter: "||example-ads.com^", resourceTypes: ["script"] } }
];function updateRules(isEnabled, customAdList = []) {const rules = isEnabled ? [...defaultRules,...customAdList.map((url, index) => ({id: index + 2,priority: url.startsWith("@@") ? 2 : 1,action: { type: url.startsWith("@@") ? "allow" : "block" },condition: { urlFilter: url.startsWith("@@") ? url.slice(2) : url, resourceTypes: ["script", "image"] }}))] : [];chrome.declarativeNetRequest.updateDynamicRules({removeRuleIds: Array.from({ length: defaultRules.length + customAdList.length }, (_, i) => i + 1),addRules: rules});
}chrome.runtime.onInstalled.addListener(() => {chrome.storage.sync.get(["isEnabled", "customAdList"], (data) => {updateRules(data.isEnabled !== false, data.customAdList || []);});
});chrome.runtime.onMessage.addListener((message) => {if (message.action === "updateRules") {chrome.storage.sync.get("customAdList", (data) => {updateRules(message.isEnabled, data.customAdList || []);});}
});
1.2.3 打造炫酷的弹出窗口popup.html

功能:提供开关按钮和跳转设置的入口。
代码示例:

<!DOCTYPE html>
<html>
<head><title>Ad Blocker</title><style>body { width: 250px; padding: 15px; font-family: Arial, sans-serif; background: #f5f5f5; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }h2 { font-size: 20px; color: #333; text-align: center; }#toggleButton { width: 100%; padding: 12px; font-size: 16px; border: none; border-radius: 5px; background: #007bff; color: white; }#toggleButton:hover { background: #0056b3; }a { display: block; text-align: center; color: #007bff; text-decoration: none; }a:hover { color: #0056b3; text-decoration: underline; }</style>
</head>
<body><h2>Ad Blocker</h2><button id="toggleButton">Enable Ad Blocking</button><a href="options.html" target="_blank">Edit Ad List</a><script src="popup.js"></script>
</body>
</html>
菜单效果图如下:

请添加图片描述

1.2.4 添加交互逻辑popup.js
JavaScript (英语)
document.addEventListener("DOMContentLoaded", () => {const toggleButton = document.getElementById("toggleButton");chrome.storage.sync.get("isEnabled", (data) => {toggleButton.textContent = data.isEnabled !== false ? "Disable Ad Blocking" : "Enable Ad Blocking";});toggleButton.addEventListener("click", () => {chrome.storage.sync.get("isEnabled", (data) => {const newState = !data.isEnabled;chrome.storage.sync.set({ isEnabled: newState }, () => {toggleButton.textContent = newState ? "Disable Ad Blocking" : "Enable Ad Blocking";chrome.runtime.sendMessage({ action: "updateRules", isEnabled: newState });});});});
});
1.2.5 美化设置页面options.html与options.js

功能:支持规则编辑、导入导出。
代码示例(精简版):

HTML格式
<!DOCTYPE html>
<html>
<head><title>Ad Blocker Options</title><style>body { width: 700px; padding: 20px; font-family: Arial, sans-serif; background: #f5f5f5; }#adList { width: 100%; height: 400px; border-radius: 5px; }button { padding: 12px 24px; border-radius: 5px; background: #007bff; color: white; }button:hover { background: #0056b3; }</style>
</head>
<body><h1>Edit Ad Block List</h1><textarea id="adList"></textarea><button id="saveButton">Save</button><button id="exportButton">Export</button><button id="importButton">Import</button><input type="file" id="importFile" accept=".txt"><script src="options.js"></script>
</body>
</html>
效果图如下:

请添加图片描述

实现按钮逻辑代码:

document.addEventListener("DOMContentLoaded", () => {const adList = document.getElementById("adList");const saveButton = document.getElementById("saveButton");if (!adList || !saveButton) return;chrome.storage.sync.get("customAdList", (data) => {adList.value = (data.customAdList || []).map(url => url.startsWith("@@||") ? url.replace("@@||", "@@").replace("^", "") : url.replace("||", "").replace("^", "")).join("\n");});saveButton.addEventListener("click", () => {const formattedList = adList.value.split("\n").map(domain => domain.startsWith("@@") ? `@@||${domain.slice(2)}^` : `||${domain}^`);chrome.storage.sync.set({ customAdList: formattedList }, () => {chrome.runtime.sendMessage({ action: "updateRules", isEnabled: true });});});
});

2 测试与打包:让插件准备好“出道”

代码写好后,别急着发布,先测试一下,然后打包成正式文件。

2.1 本地测试

步骤:
打开chrome://extensions/,启用“开发者模式”。
点击“加载已解压的扩展程序”,选择AdBlocker文件夹。
点击图标,测试开关和规则编辑功能。
检查点:控制台无错误,广告被拦截。
测试正常,效果图如下:
请添加图片描述
请添加图片描述

2.2 打包为ZIP文件

方法1:Chrome打包:
在chrome://extensions/点击“打包扩展”。
选择AdBlocker文件夹,生成.crx和.pem文件。
将.crx改名为.zip。
方法2:手动压缩:
用压缩软件将AdBlocker文件夹打包为AdBlocker.zip,确保根目录有manifest.json。

3 发布到Chrome Web Store:让全世界用上你的插件

是时候让你的插件闪亮登场了!

3.1 创建开发者账户

步骤:
访问 Chrome Web Store Developer Dashboard。
用Google账户登录,支付$5注册费。
同意开发者条款。

3.2 上传与发布

详细流程:
点击“添加新项目”,上传AdBlocker.zip。
填写信息:
名称:Ad Blocker with Toggle
名称:带切换的广告拦截器
描述:A customizable ad blocker with toggle and list management.
描述:具有切换和列表管理的可自定义广告拦截器。
图标:上传icon128.png。
截图:准备1280x800的界面截图(弹出窗口和设置页面)。
声明权限理由:Used to block ads and manage user settings.
声明权限理由:用于拦截广告和管理用户设置。
点击“提交审核”,选择“公开”发布。

3.3 等待审核与后续维护

审核时间:1-7天。
更新方法:修改version,重新打包上传。

4 小贴士与注意事项

合规性:避免过度权限,确保描述清晰。
备份:保存.pem私钥和源代码。

完整源码:https://github.com/qyhua0/cp_ad_block_new

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31959.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI智能眼镜主控芯片:技术演进与产业生态的深度解析

一、AI智能眼镜的技术挑战与主控芯片核心诉求 AI智能眼镜作为XR&#xff08;扩展现实&#xff09;技术的代表产品&#xff0c;其核心矛盾在于性能、功耗与体积的三角平衡。主控芯片作为设备的“大脑”&#xff0c;需在有限空间内实现复杂计算、多模态交互与全天候续航&#xf…

elasticsearch 8.17.3部署文档

elasticsearch 8.17.3部署文档 一、架构拓扑 ip主机名角色192.168.241.151slave1master192.168.241.152slave2node1192.168.241.153slave3node2 二、安装包下载——分别下载上传至所有的节点 下载地址https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-…

PySide(PyQT),QGraphicsItem的pos()和scenePos()区别

在QGraphicsItem中&#xff0c;pos()和scenePos()是两个重要的方法&#xff0c;用于描述图形项的位置&#xff0c;但它们的含义和用途有所不同。理解它们的区别对于正确操作和管理QGraphicsItem的位置至关重要。 1. pos()方法 • 定义&#xff1a;pos()返回的是QGraphicsItem在…

Linux 进程控制:创建、终止、等待与程序替换全解析

亲爱的读者朋友们&#x1f603;&#xff0c;此文开启知识盛宴与思想碰撞&#x1f389;。 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 目录 1.进程创建 1-1 fork函数初识​ 1-2 fork函数返回值​ 1-3…

GStreamer —— 2.18、Windows下Qt加载GStreamer库后运行 - “播放教程 6:音频可视化“(附:完整源码)

运行效果 介绍 GStreamer 带有一组将音频转换为视频的元素。他们 可用于科学可视化或为您的音乐增添趣味 player 的本教程展示了&#xff1a; • 如何启用音频可视化 • 如何选择可视化元素 启用音频可视化实际上非常简单。设置相应的标志&#xff0c;当纯音频流为 found&#…

Excel多级联动下拉菜单设置

1.问题描述 现有数据表如下图所示&#xff1a; 该表中包括省、市、县三级目录。 现要将其整理成数据表模板&#xff0c;如下图所示&#xff1a; 要求制作成下拉菜单的形式&#xff0c;且每一级目录的下拉菜单列表要根据上一级目录的内容来确定。 如上图所示&#xff0c;只有…

Web基础:HTML快速入门

HTML基础语法 HTML&#xff08;超文本标记语言&#xff09; 是用于创建网页内容的 标记语言&#xff0c;通过定义页面的 结构和内容 来告诉浏览器如何呈现网页。 超文本&#xff08;Hypertext&#xff09; 是一种通过 链接&#xff08;Hyperlinks&#xff09; 将不同文本、图像…

VSTO(C#)Excel开发2:Excel对象模型和基本操作

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

PostgreSQL学习笔记:PostgreSQL vs MySQL

PostgreSQL 和 MySQL 都是广泛使用的关系型数据库管理系统&#xff0c;它们有以下一些对比&#xff1a; 一、功能特性 1. 数据类型支持 PostgreSQL&#xff1a;支持丰富的数据类型&#xff0c;包括数组、JSON、JSONB、范围类型、几何类型等。对于复杂数据结构的存储和处理非…

Matlab:矩阵运算篇——矩阵

目录 1.定义 实例——创建矩阵 实例——创建复数矩阵 2.矩阵的生成 实例——M文件矩阵 2.利用文本创建 实例——创建生活用品矩阵 3.创建特殊矩阵 实例——生成特殊矩阵 4.矩阵元素的运算 1.矩阵元素的修改 实例——新矩阵的生成 2.矩阵的变维 实例——矩阵维度修…

从0到1入门Docker

一、快速入门 Docker run命令中的常见参数 -d&#xff1a;让容器后台运行--name&#xff1a;给容器命名&#xff08;唯一&#xff09;-e&#xff1a;环境变量-p&#xff1a;宿主机端口映射到容器内端口镜像名称结构&#xff1a;Repository &#xff1a;TAG&#xff08;镜像名&…

Python的浮点数

在 Python 中&#xff0c;有四种内置数值类型&#xff0c;分别是整型整数类型&#xff08;int&#xff09;、布尔类型&#xff08;bool&#xff09;、浮点数类型&#xff08;float&#xff09;和复数类型&#xff08;complex&#xff09;。浮点数默认是双精度类型&#xff0c;占…

从零开始 | C语言基础刷题DAY1

❤个人主页&#xff1a;折枝寄北的博客 DAY1[2025.3.11] 1. 求两个数的较大值2.从键盘输入的两个数的大小关系3.一个整数的奇偶性&#xff0c;请判断4. 考试分数是否通过5.考试成绩是否完美&#xff0c;请判断 1. 求两个数的较大值 题目&#xff1a; 写一个函数求两个整数的较…

[pytest] 配置

这里写目录标题 PytestInitRun3. 根据命令行选项将不同的值传递给测试函数 Report1. 向测试报告标题添加信息2. 分析测试持续时间 pytest --durations33. 增量测试 - 测试步骤--junitxml{report}.xml1. testsuite1.1 在测试套件级别添加属性节点 record_testsuite_property 2. …

物联网商业模式

物联网商业模式是一种战略规划&#xff0c;它融合了物联网技术来创造价值并获取收入。它与传统商业模式的不同之处在于&#xff0c;它利用互联设备来改善运营、提升客户体验以及优化服务项目。在当今由科技驱动的世界中&#xff0c;这种商业模式通过利用实时数据来提供创新服务…

springboot432-基于SpringBoot的酒店管理系统(源码+数据库+纯前后端分离+部署讲解等)

&#x1f495;&#x1f495;作者&#xff1a; 爱笑学姐 &#x1f495;&#x1f495;个人简介&#xff1a;十年Java&#xff0c;Python美女程序员一枚&#xff0c;精通计算机专业前后端各类框架。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xf…

Manus AI:开启Agent元年的ChatGPT时刻(附赠资料)

1. Manus AI&#xff1a;全球首个通用Agent Manus AI 是全球首个通用人工智能代理&#xff0c;连接思想与行动&#xff0c;不仅思考&#xff0c;还能交付成果。Manus 擅长处理工作和生活中的各种任务&#xff0c;帮助用户完成一切。其核心理念是“less structure, more intell…

vscode接入DeepSeek 免费送2000 万 Tokens 解决DeepSeek无法充值问题

1. 在vscode中安装插件 Cline 2.打开硅基流动官网 3. 注册并登陆&#xff0c;邀请码 WpcqcXMs 4.登录后新建秘钥 5. 在vscode中配置cline (1) API Provider 选择 OpenAI Compatible &#xff1b; (2) Base URL设置为 https://api.siliconflow.cn](https://api.siliconfl…

从零使用docker并安装部署mysql8.3.0容器

在开始使用docker到完成mysql的安装部署&#xff0c;中间有很多的坑等着 安装docker并配置 sudo yum install docker-ce 启动docker并设置开机启动项 sudo systemctl start docker sudo systemctl enable docker查看docker是否启动 sudo systemctl status docker 或者直接…

golang 静态库 Undefined symbol: __mingw_vfprintf

正常用golang编译一个静态库给 其他语言 调用&#xff0c;编译时报错 Error: Undefined symbol: __mingw_vfprintf 很是奇怪&#xff0c;之前用用golang写静态库成功过&#xff0c;编译也没问题&#xff0c;结果却是截然不同。 试了很多次&#xff0c;发现唯一的差别就是在 …