还在苦恼如何开发一个Chrome插件吗?十分钟带你实现一个实用小插件

news2025/2/1 0:57:06

你是否曾考虑过创建自己的 Chrome 插件,但又挠头毫无思路?那么在接下来的几分钟里,我不仅会介绍 Chrome
浏览器扩展的基本知识,还会指导你通过五个简单的步骤来制作自己的扩展。

知道怎么做吗?让我们一探究竟!

文章目录

    • 要做一个什么插件
    • 什么是谷歌浏览器扩展?
    • 第 1 步:创建扩展文件
    • 第 2 步:创建任务文件
    • 第 3 步:创建内容脚本
    • 步骤 4:添加一些样式
    • 步骤 5:测试扩展
    • 更进一步
    • 结论

要做一个什么插件

今年我们见证了人工智能能力的爆炸式增长。虽然chatgpt能提供前所未有的帮助,但它们也提醒我们:不要与它分享敏感信息。
我不知道你怎么想,但很多时候,我的手指比我的大脑还快。因此,为了防止可能出现的失误,要为 ChatGPT 建立一个 “molly-guard”。
如果你正在挠头想知道什么是 “molly-guard”,它最初指的是放在按钮或开关上的防护罩,以防止意外启动。在我们的语境中,它是确保我们不会泄密的数字守护者。
用户可以指定他们认为敏感的单词或短语列表。如果我们试图向 ChatGPT 提交包含这些字词的信息,扩展程序就会立即行动,禁用提交按钮,使我们免于潜在的疏忽。
要学习本教程,你需要一个 ChatGPT 账户。
本教程的代码可在 GitHub 上获取

什么是谷歌浏览器扩展?

在开始之前,让我们先弄清楚什么是 Chrome 浏览器扩展。Chrome 浏览器扩展是一个小软件,旨在增强或修改 Chrome 浏览器的浏览体验。扩展使用标准的网络技术(HTML、JavaScript 和 CSS)开发,既有简单的工具(如颜色选择器),也有复杂的工具(如密码管理器)。许多扩展都可以在 Chrome 网上商店下载。

注:对于希望深入了解 Chrome 浏览器扩展的用户,谷歌的官方文档是非常宝贵的资源。

值得注意的是,谷歌 Chrome 浏览器扩展程序可以根据其预期功能采取不同的形式。有些具有浏览器操作功能,在地址栏旁边有一个图标,可以快速访问其功能。其他扩展则可能在后台悄无声息地运行,跨越所有网页或仅在特定网页上运行,这取决于它们的设计。

在本教程中,我们将重点介绍使用内容脚本的扩展类型。该脚本允许我们与特定页面的 DOM 进行交互和操作,在我们的例子中就是 ChatGPT 界面。

第 1 步:创建扩展文件

首先,我们需要为 Chrome 浏览器扩展设置基本结构。我们的扩展名为 chatgpt-mollyguard,将放在一个专用文件夹中。该扩展目录将包含所有必要文件,使我们的 molly-guard 顺利运行。

下面是详细说明:

  • 文件夹:chatgpt-molly-guard。这是我们扩展的根目录。我们的所有文件都将放在这个文件夹中。
  • 文件:manifest.json。这是我们扩展的核心和灵魂。该文件包含扩展的元数据,如名称、版本和所需权限。最重要的是,它指定了在哪些网站上运行哪些脚本。
  • 文件:contentScript.js。顾名思义,这个 JavaScript
    文件包含内容脚本。该脚本可直接访问网页内容,允许我们扫描敏感词并根据需要修改页面。
  • 文件:wordsList.js。这是一个 JavaScript
    文件,专门用于包含用户指定的敏感词或短语列表。我们将其分开,方便用户自定义列表,而无需深入研究 contentScript.js
    中的核心功能。
  • 文件:styles.css。为我们的扩展添加一些特色的样式表。虽然我们的主要目标是功能性,但让警告或提示看起来更美观!

1.在电脑上新建一个文件夹,命名为 chatgpt-molly-guard。
2.在这个文件夹中,创建上面列出的四个文件。
3.文件准备好后,我们就可以开始填写细节了。
在这里插入图片描述

在接下来的章节中,我们将深入研究每个文件,并概述其在扩展中的具体作用。

第 2 步:创建任务文件

manifest.json是一个 JSON 文件,用于向浏览器提供有关扩展的基本详细信息。该文件必须位于扩展的根目录中。

下面是我们的清单结构。将此代码复制到 manifest.json:

{
  "manifest_version": 3,
  "name": "ChatGPT Molly-guard",
  "version": "1.0",
  "description": "Prevents submission if specific words are typed into chat window",
  "content_scripts": [
    {
      "matches": ["https://chat.openai.com/*"],
      "css": ["styles.css"],
      "js": ["wordsList.js", "contentScript.js"]
    }
  ]
}

manifest.json有三个必填字段,即:manifest_version、name 和 version。其他都是可选项。
关键要素
关键清单元素

  • manifest_version:一个整数,指定清单文件格式的版本。我们使用的是最新版本的 Manifest V3。请注意,谷歌将在
    2023 年逐步淘汰 Manifest V2 扩展。
  • name:一个简短的纯文本字符串(最多 45 个字符),用于标识扩展。
  • version:一至四个以点分隔的整数,用于标识扩展的版本。 description:描述扩展的纯文本字符串(无 HTML,最多 132
    个字符)。
  • content_scripts:此关键字用于指定静态加载的 JavaScript 或 CSS 文件,在每次打开与 URL 模式(由
    matches 关键字指定)匹配的页面时使用。在此,我们表示脚本应在以 chat.openai.com/ 开头的任何 URL 上运行。
  • 在上述字段中,Google 会在 Chrome 浏览器的扩展管理页面()和 Chrome 网上商城显示扩展时使用名称、版本和描述。

虽然我们的manifest_version已根据需要进行了精简,但许多其他字段可以为扩展增加深度和功能。诸如 action、default_locale、icon 等字段可提供自定义选项、用户界面控制和国际化支持。
如需全面了解 manifest.json 文件中的可用内容,请查阅 Google 官方文档。

第 3 步:创建内容脚本

Chrome 浏览器扩展中的内容脚本是在网页上下文中运行的 JavaScript 文件。它们可以查看和操作所运行页面的 DOM,从而修改网页的内容和行为。

这就是我们的内容脚本。将以下代码复制到 contentScript.js 文件中:

const debounce = (callback, wait) => {
  let timeoutId = null;
  return (...args) => {
    window.clearTimeout(timeoutId);
    timeoutId = window.setTimeout(() => {
      callback.apply(null, args);
    }, wait);
  };
};

function containsForbiddenWords(value) {
  return forbiddenWords.some(word => value.toLowerCase().includes(word.toLowerCase()));
}

function updateUI(target) {
  const containsForbiddenWord = containsForbiddenWords(target.value);
  const sendButton = target.nextElementSibling;
  const parentDiv = target.parentElement;

  if (containsForbiddenWord) {
    sendButton.disabled = true;
    parentDiv.classList.add('forbidden-div');
  } else {
    sendButton.disabled = false;
    parentDiv.classList.remove('forbidden-div');
  }
}

document.body.addEventListener('keyup', debounce((event) => {
  if (event.target.id === 'prompt-textarea') updateUI(event.target);
}, 300));

document.addEventListener('keydown', (e) => {
  if (e.target.id === 'prompt-textarea' && e.key === 'Enter') {
    if (containsForbiddenWords(e.target.value)) {
      e.stopPropagation();
      e.preventDefault();
    }
  }
}, true);

在文件顶部,我们声明了一个防抖函数。用它来确保不会在用户每次按键时都检查是否有禁用词。那样会有很多检查!相反,我们会等到用户停止键入后再做任何事情。
接下来是 containsForbiddenWords 函数。顾名思义,如果传入的文本中包含任何禁用词语,该函数将返回 true。我们对两个值都使用了小写,以确保比较不区分大小写。
updateUI 函数将确定聊天框中是否存在任何禁用词语。如果有,它会禁用发送按钮,并在聊天框的父 div 中添加 CSS 类 (forbidden-div)。在下一步中利用它为用户提供视觉警告提示。
最后,脚本注册了两个事件监听器:
第一个被设置为在按键事件中触发。它会检查修改后的元素是否是目标(聊天窗口),然后调用 updateUI 函数。由于使用了防抖功能,该函数不会持续运行,只会在输入过程短暂停顿后运行。
第二个事件监听器正在监听目标上的按键事件。具体来说,它正在监听 Enter 键的按下,如果在文本区域出现禁用单词时按下 Enter 键,就会阻止浏览器的默认操作(在本例中是表单提交)。
通过禁用发送按钮和拦截并阻止回车键的按下,这样就能有效阻止含有禁用词的邮件发送。
我们使用了事件委托,因为 ChatGPT 界面是一个 SPA。在 SPA 中,用户界面的片段会根据用户交互动态替换,这可能会无意中分离绑定到这些元素的任何事件侦听器。通过将事件侦听器锚定到更广泛的 DOM 并有选择性地针对特定元素,我们可以规避这个问题。

步骤 4:添加一些样式

虽然我们扩展的核心功能是阻止某些提交,但重要的是让用户能够立即识别他们的操作被阻止的原因。让我们添加一些样式来提供视觉提示,增强用户体验。

下面是我们使用的规则。将其添加到 styles.css 文件中:

.forbidden-div {
  border: 2px solid red !important;
  background-color: #ffe6e6 !important;
}

只要检测到禁用词,就会在输入区域添加醒目的红色边框和细微的红色背景。这将立即引起注意,并表明情况不对。通过切换父 div 上的类,我们可以轻松地打开或关闭该功能。
重要标记也值得注意。在处理不属于自己的网页时,比如本例中的 ChatGPT,现有的样式可能非常特殊。为了确保我们的样式优先并被正确应用,!!important 标记会覆盖由于现有样式的特殊性而导致的任何潜在冲突。

步骤 5:测试扩展

有最后一步:填充我们的扩展应该监控的禁用词列表。我们可以在 forbiddenWords.js 中添加这些内容:

const forbiddenWords = [
  "政治",
  "股票",
  "Jim",
];

现在,我们的自定义 Google Chrome 浏览器扩展已全部设置完毕,是时候测试其功能并确保一切正常。

打开 Chrome 浏览器,在地址栏中导航到。
打开右上角的 "开发者模式 "切换开关。
单击 "加载解压缩 "按钮,现在该按钮将可见。
导航并选择扩展的目录(本例中为 chatgpt-molly-guard),然后单击 “选择”。现在我们的扩展应该会出现在已安装的扩展列表中。

在这里插入图片描述
在这里插入图片描述
现在,要测试功能,请导航到 ChatGPT,刷新页面并尝试输入限制词语,看看扩展是否按预期运行。

如果一切按计划进行,你应该会看到下图所示的内容。
在这里插入图片描述
如果您对扩展代码进行了任何更改,例如更新了单词列表,请务必点击扩展页面上扩展卡右下角的圆形箭头。这将重新加载扩展。然后,你需要重新加载扩展所针对的页面。

在这里插入图片描述

更进一步

我们目前的 Chrome 浏览器基本扩展功能已达到预期目的,但仍有改进的余地。如果你渴望进一步完善扩展功能并扩展其功能,下面有一些建议。

  1. 编辑单词列表的用户界面
    目前,我们的扩展依赖于预定义的限制词语列表。实施一个用户友好型界面可以让用户随时动态添加、删除或修改单词。这可以通过点击扩展图标时弹出的用户界面(浏览器操作)来实现,用户可以在该界面上管理自己的列表。您还需要将单词持久保存到存储器中。
  2. 处理鼠标粘贴事件
    虽然我们的扩展会检测按键,但用户可以通过使用鼠标右键菜单粘贴敏感信息来绕过这一点。为了堵住这个漏洞,我们可以为粘贴事件添加一个事件监听器(或者将两者合并为输入监听器)。这将确保无论是输入还是粘贴信息,过滤器都能保持稳健。
  3. 上下文覆盖 阻止某些术语可能有点过于笼统。例如,我可能想阻止提及 “Jim”,但提及 "Jim Carey
    "却没有问题。要解决这个问题,可以考虑引入一项功能,在下一次提交事件发生之前禁用 “molly-guard”。

结论

正如我们所发现的,创建自己的 Google Chrome 浏览器扩展并不是一件让你挠头很难的事情。我们一开始就有一个明确的目标:为 ChatGPT 创建一个保护层,确保敏感信息的机密性。在本教程中,我们看到了如何通过少量文件和代码来创建一个功能实用的浏览器扩展。
对于那些渴望深入学习的人来说,谷歌的 Chrome 浏览器扩展官方文档是一个很好的起点。此外,Chrome 浏览器扩展迁移指南还提供了关于向 Manifest V3 过渡的见解,鉴于 Manifest V2 即将于 2023 年淘汰,这一点至关重要。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索在云原生环境中构建的大数据驱动的智能应用程序的成功案例,并分析它们的关键要素。

文章目录 1. Netflix - 个性化推荐引擎2. Uber - 实时数据分析和决策支持3. Airbnb - 价格预测和优化5. Google - 自然语言处理和搜索优化 🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专…

EG1164大功率同步整流升压模块开源,最高效率97%

EG1164大功率同步整流Boost升压电源模块,最高效率97%,输入电压8~50V,输出电压8~60V可调,最大功率300瓦以上,开关频率219kHz。 白嫖了张嘉立创的彩色丝印券就随便画了个板试试,第一次打彩色丝印。 因为我测…

word导出为HTML格式教程,同时也导出图片

在写文档教程时,有时需要借鉴人家的专业文档内容,一般都是word格式文档。word直接复制里面的内容,帐帖到网站编辑器会有很多问题,需要二次清楚下格式才行,而且图片是没办法直接复制到编辑器内的。所以最方便的办法是将…

ARM编程模型-指令流水线

流水线技术通过多个功能部件并行工作来缩短程序执行时间,提高处理器核的效率和吞吐率,从而成为微处理器设计中最为重要的技术之一。 1. 3级流水线 到ARM7为止的ARM处理器使用简单的3级流水线,它包括下列流水线级。 (1&#xff0…

如何中mac上安装多版本python并配置PATH

摘要 mac 默认安装的python是 python3,但是如果我们需要其他python版本时,该怎么办呢? 例如:需要python2 版本,如果使用homebrew安装会提示没有python2。同时使用python --version 会发现commond not found。 所以本…

linux安装minio以及springboot整合使用

文章目录 1.linux安装minio2.springboot整合minio使用 1.linux安装minio 1.新建文件夹 mkdir /home/minio # 数据文件夹 mkdir /home/minio/data # 创建日志文件夹 mkdir /home/minio/log2.进入文件夹 cd /home/minio3.下载minio,链接可从官网获取 wget https://…

有c语言的基础学习python【python基础详解】

文章将从C语言出发,深入介绍python的基础知识,也包括很多python的新增知识点详解。 目录 1.python的输入输出,重新认识 hello world 1.1 输出函数print的规则 1.2 输入函数input的规则 1.3 用print将数据写入文件 2.数据类型、基本操作…

SPSS统计作图教程:百分条图堆积条图

1、问题与数据 某研究者想看不同年龄分组人群(Age_cat)中不同程度的维生素D缺乏(VD)的百分构成比,部分数据如图1。研究者想以条图形式来展现,该如何操作呢? 图1 部分数据 2. 具体操作&#xf…

不用加减乘除做加法

不用加减乘除做加法 一、描述二、方法 一、描述 写一个函数,求两个整数之和,要求在函数体内不得使用、-、*、/四则运算符号,本题OJ链接 数据范围:两个数都满足 −10≤n≤1000 进阶:空间复杂度 O(1),时间复…

构造函数和析构函数(个人学习笔记黑马学习)

构造函数:主要作用在于创建对象时为对象的成员属性赋值&#xff0c;构造函数由编译器自动调用&#xff0c;无须手动调用。析构函数:主要作用在于对象销毁前系统自动调用&#xff0c;执行一些清理工作。 #include <iostream> using namespace std;//对象初始化和清理class…

MVC,MVP,MVVM的理解和区别

MVC MVC &#xff0c;早期的开发架构&#xff0c;在安卓里&#xff0c;用res代表V&#xff0c;activity代表Controller层&#xff0c;Model层完成数据请求&#xff0c;更新操作&#xff0c;activity完成view的绑定&#xff0c;以及业务逻辑的编写&#xff0c;更新view&#xf…

2359. 找到离给定两个节点最近的节点;1781. 所有子字符串美丽值之和;2406. 将区间分为最少组数

2359. 找到离给定两个节点最近的节点 核心思想:统计node1和node2分别到每个点的距离&#xff0c;然后在枚举每个点统计结果。关键在于如何统计node到每个点的距离&#xff0c;首先是初始化为inf很重要&#xff0c;因为在枚举的时候&#xff0c;因为是inf代表了这个节点无法到达…

MVC模式分层练习

新建库 新建表 插入点数据 先不用MVC模式写功能,来看下缺点是什么 新建一个空项目 选项项目使用的JDK 自己的IDEA总是要重启下 新建模块 因maven还没教 添加框架支持 添加后项目多了这些 添加些必要依赖 这里注意下,如果导入jar包不对可以重新导入下或者是jar包本身出了问…

设计模式-2--工厂模式(Factory Pattern)

一、 什么是工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的接口&#xff0c;但是将对象的实例化过程推迟到子类中。工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象&#xff0c;而无需暴露对…

yolov5 应用整理

yolov5 应用整理 适用于0基础人员与有一定yolov5了解的人员食用. 关于yolov5参考: yolov5 github源码链接 目前参与过yolov5的应用: 平台库x86/arm cpuncnnx86libtorch/pytorchBM1684算能标准库(需要进行模型转换)昇腾cann(ascend api) https://gitee.com/Tencent/ncnn ht…

在windows下安装配置skywalking

1.下载地址 Downloads | Apache SkyWalkinghttp://skywalking.apache.org/downloads/ 2.文件目录说明 将文件解压后&#xff0c;可看到agent和bin目录&#xff1a; Agent&#xff1a;作为探针&#xff0c;安装在服务器端&#xff0c;进行数据采集和上报。 Config&#xff1a…

车联网仿真工具Veins安装指南(基于官方文档)

Veins安装指南 官方文档&#xff1a; tutorial 直接选择最easy的way&#xff1a; 下载一个虚拟机&#xff1a;VMware Workstation Player 下载即可。这个普通版是免费的&#xff0c;pro版正版是要收费的&#xff0c;可以找一些其他的方法下载pro版本&#xff0c;可以同时开…

windows11 利用vmware17 安装rocky9操作系统

下载相关软件和镜像 vmware17 下载 下载页面 Download VMware Workstation Pro ​ rocky8镜像下载 官网链接&#xff1a;Rocky Linux 下载页面 Download Rocky | Rocky Linux 点击Minimal下载 安装rocky9 选择镜像文件&#xff0c;点击下一步 点击下一步 启动虚拟机 选…

锂电池充电电路方案

锂电池充电电路一 原理图如下 都是比较小的&#xff0c;SOT-23-6 封装 此方案的优势是器件可以扩容&#xff0c;也就是可以替换成容量更大的mos管。 锂电池充电电路二 锂电池充电电路三 注意线的粗细。 引脚说明 锂电池电量检测电路 键盘上的电量检测电路原理图 电量检…

3D视觉测量:形位公差 平面度测量(附源码)

文章目录 0. 测试效果1. 基本内容2. 实现方法3. 代码实现4. 参考文章目录:3D视觉测量目录微信:dhlddxB站: Non-Stop_0. 测试效果 1. 基本内容 平面度是一个表达平面平整程度的度量指标,它描述了一个表面与一个理想平面之间的偏差程度。在工程和制造领域,平面度是一个重要的…