如何一步一步构建网站ChatGPT插件

news2025/4/12 12:25:45

在本文中,我们将一步一步地探索并构建一个名为"AI Prompt Testing"的项目。该项目是一个网站插件,旨在帮助网站生成一个ChatGPT提示测试题,以巩固当前网页的内容。

1、抽象提取

这个网站ChatGPT插件大概的效果,类比的实现有哪些? addtoany, google analytics

addtoany的配置是这样子

<div class="a2a_kit a2a_kit_size_32 a2a_floating_style a2a_vertical_style" style="left:0px; top:150px;">
    <a class="a2a_button_facebook"></a>
    <a class="a2a_button_twitter"></a>
    <a class="a2a_button_pinterest"></a>
    <a class="a2a_dd" href="<https://www.addtoany.com/share>"></a>
</div>

<script async src="https://static.addtoany.com/menu/page.js"></script>

google analytics 的配置是这样子

<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXX"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-XXXXX');
</script>

都记下来,以被我们后续插件配置参考

2、技术实现思考

既然是网站chatgpt 插件,那么为何不让chatgpt 帮我写一下代码呢?

思考prompt

用一个js脚本,动态嵌入到网站上,脚本内容是,动态在网页右下侧生成一个类似分享按钮的按钮,按钮的功能如下:
1、假如用户点击按钮,按钮则生成一个一段文本,“基于链接{url},生成一份测试题,选择题4题,问答题3题,判断题3题,并在问题之后附上答案”,这里的{url} 是当前网页地址。
2、按钮展示是一个chatgpt svg 图标,图标大小为32*32,,图标内部字体内容为“生成测试题”
3、用户点击按钮后,请把内容复制到剪贴板,并提示用户“内容已复制请前往chatgpt网站”
4、提示内容添加动画淡入显示,用户点击提示内容后自动淡出并移除

然后chatgpt一顿输出

// 创建一个div元素来包含按钮和提示内容
var container = document.createElement("div");
container.style.cssText = "position:fixed;right:20px;bottom:20px;z-index:9999;";

// 创建按钮元素
var button = document.createElement("button");
button.style.cssText = "background:none;border:none;cursor:pointer;";
var icon = document.createElementNS("http://www.w3.org/2000/svg", "svg");
icon.setAttribute("xmlns", "http://www.w3.org/2000/svg");
icon.setAttribute("width", "32");
icon.setAttribute("height", "32");
icon.setAttribute("viewBox", "0 0 24 24");
icon.setAttribute("fill", "none");
icon.setAttribute("stroke", "currentColor");
icon.setAttribute("stroke-width", "2");
icon.setAttribute("stroke-linecap", "round");
icon.setAttribute("stroke-linejoin", "round");
var path = document.createElementNS("http://www.w3.org/2000/svg", "path");
path.setAttribute(
  "d",
  "M6 9l6 6 6-6"
);
icon.appendChild(path);
var text = document.createElement("span");
text.style.cssText = "font-size:10px; display:block;";
text.innerHTML = "生成测试题";
button.appendChild(icon);
button.appendChild(text);

// 创建提示内容元素
var tooltip = document.createElement("div");
tooltip.style.cssText = "position:absolute;bottom:40px;left:50%;transform:translateX(-50%);background:#333;color:#fff;padding:5px 10px;border-radius:5px;opacity:0;transition:opacity 0.5s;";
tooltip.innerHTML = "内容已复制,请前往ChatGPT网站";

// 将按钮和提示内容添加到容器元素中
container.appendChild(button);
container.appendChild(tooltip);
document.body.appendChild(container);

// 为按钮添加点击事件
button.addEventListener("click", function () {
  // 生成测试题文本
  var url = window.location.href;
  var text =
    "基于链接" +
    url +
    ",生成一份测试题,选择题4题,问答题3题,判断题3题,并在问题之后附上答案";

  // 复制文本到剪贴板
  var tempInput = document.createElement("input");
  tempInput.setAttribute("value", text);
  document.body.appendChild(tempInput);
  tempInput.select();
  document.execCommand("copy");
  document.body.removeChild(tempInput);

  // 显示提示内容,并在淡入后淡出并删除元素
  tooltip.style.opacity = "1";
  setTimeout(function () {
    tooltip.style.opacity = "0";
    setTimeout(function () {
      container.removeChild(tooltip);
    }, 500);
  }, 3000);
});

贴入控制台看一下

生成后,点击按钮效果,基本满足了 

 

经过1、2步的梳理,我们基本实现所有用户侧的代码和思路。

3、接下来我们开始正式写代码

3.1 创建项目,初始化

npm create vite@latest

我们可以选择vue 的模版初始化,思考了一下好像挺简单,用原生js也可以。删掉vue 插件。由于我们需要构建成第三方网站直接引用的代码库,所以要配置一下build 选项。

我们的prompt里面需要用到svg图标,所以把vite-svg-loader 插件也引入。

vite.config.js

import { defineConfig } from 'vite'
import svgLoader from 'vite-svg-loader'
import banner from 'vite-plugin-banner'
import pkg from './package.json'
import path from 'path'

// <https://vitejs.dev/config/>
export default defineConfig({
  plugins: [
    banner({
      outDir: './lib',
      content: `/**\n * name: ${pkg.name}\n * version: v${pkg.version}\n * description: ${pkg.description}\n * author: ${pkg.author}\n * homepage: ${pkg.homepage}\n */`
    }), svgLoader()
  ],
  build: {
    outDir: "./lib",
    lib: {
      entry: path.resolve(__dirname, 'src/index.js'),
      name: 'chatgpt',
      fileName: (format) => `chatgpt.${format}.js`
    }
  }
})

项目搭建完成,npm run dev 开始一步一步调优chatgpt生成的代码

3.2 如何实现配置类似于 google analytics 的配置?

<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-XXXXX');
</script>

首先我们要序列化一下配置选项,生成key value 对象,然后直接读取key的值就好了

// if fromOrgin
if (window.atob && window.atob(opt.config) !== location.origin) {
   return;
}

我们加上一行调试一下配置看一下代码还能不能运行

于是我们照猫画虎就可以得到大概引入配置代码

index.html

<script type="module" src="/src/index.js"></script>
<script>
  window._chatData = window._chatData || [];
  function chatag() { _chatData.push(arguments); }
  chatag('js', new Date());
  chatag('config', 'aHR0cDovL2xvY2FsaG9zdDo1MTcz');
</script>

'aHR0cDovL2xvY2FsaG9zdDo1MTcz' 就是当前本地调试的域名 'http://localhost:5173'

atob('aHR0cDovL2xvY2FsaG9zdDo1MTcz')

考虑到网站插件可能是多国用户的需求,引入多国语言,把原来写死的txt 抽离一下,基本完成

4、代码到了发布阶段

4.1 我们引入release-it package

"release-it": {
    "hooks": {
      "after:bump": "npm run build"
    }
  },

发布生命周期 after:bump 需要构建一下再发布, 具体参考GitHub - release-it/release-it: 🚀 Automate versioning and package publishing

4.2 优化readme 让用户更加好理解

### Add chatbtn code manually

Below is the chatbtn code for this account. Please copy and paste this code into the code of every page on your site, immediately after the <head> or <body> element. Only one chatbtn tag can be added per page.

```js

<script async src="<https://unpkg.com/ai-prompt-testing/lib/chatgpt.umd.js?id=aHR0cHM6Ly9kb2NzLnczY3ViLmNvbQ==>"></script>
<script>
  window._chatData = window._chatData || [];
  function chatag(){_chatData.push(arguments);}
  chatag('js', new Date());
  chatag('config', 'aHR0cHM6Ly9kb2NzLnczY3ViLmNvbQ==');
</script>


or

```
<script>
var tracker_id = 'aHR0cHM6Ly9kb2NzLnczY3ViLmNvbQ=='
function chatag(){_chatData.push(arguments);}
var url = "<https://unpkg.com/ai-prompt-testing/lib/chatgpt.umd.js?id=>" + tracker_id;
(function() {
  var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
  ga.src = url;
  var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
window._chatData = window._chatData || [];
chatag('js', new Date());
chatag('config', tracker_id);
</script>
```

### Chatag config

-   chatag('config', 'aHR0cHM6Ly9kb2NzLnczY3ViLmNvbQ==');

'aHR0cHM6Ly9kb2NzLnczY3ViLmNvbQ==' equal to btoa(location.origin)

### Lastest library

https://unpkg.com/ai-prompt-testing

## Demo

https://docs.w3cub.com/rust/std/index

因为我们要发布到npm 所以直接用unpkg cdn

unpkg is a fast, global content delivery network for everything on npm.

最后附上项目链接:GitHub - icai/ai-prompt-testing: ai prompt for website testing


最近熬夜给大家准备了一份非常全的ChatGPT 高效指令汇总大全【完整版】,需要的可以私信免费领取!

 

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

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

相关文章

股票量价关系基础知识7----图解各阶段量价关系:价涨量缩

图解各阶段量价关系&#xff1a;价涨量缩 价涨量缩是指股价上涨&#xff0c;成交量却萎缩的一种价量背离走势。它通常反映上涨力道不足&#xff0c;预示股价可能反转向下。 一、上涨初期的价涨量缩 &#xff08;一&#xff09;形态分析 股价经过一轮下跌后止跌回升&#xff0c…

Redis中的缓存穿透、雪崩、击穿

概述&#xff1a; 缓存穿透&#xff1a;大量请求根本不存在的key&#xff0c; 应用服务器压力变大缓存雪崩&#xff1a;redis中大量key集体过期&#xff0c;数据库压力变大&#xff0c;服务器崩溃缓存击穿&#xff1a;redis中一个热点key过期&#xff08;大量用户访问该热点ke…

【Linux】驱动学习,先啃框架

目录 前言&#xff1a; 一、驱动设计 &#xff08;1&#xff09;面向对象&#xff1a; &#xff08;2&#xff09;分层&#xff1a; &#xff08;3&#xff09;分离&#xff1a; 二、驱动框架 &#xff08;1&#xff09;传统框架 &#xff08;2&#xff09;总线设备驱…

四.从零开始JVM实战高手-JVM监控及线上问题定位

前言 Java程序员面试JVM几乎比问&#xff0c;对于JVM监控&#xff0c;线上OOM&#xff0c;CPU负载100%等问题也是经常被问到&#xff0c;尽管在企业中不一定轮得到我们去处理线上问题&#xff0c;但是不管是为了面试还是为了应对开发那么对于JVM线上问题处理都是必须要去了解的…

二、软件工程——Modeling

1.Undestanding Requirements System Engineering&#xff08;系统工程&#xff09; &#xff01;&#xff01;&#xff01;Requirements Engieering(需求建模&#xff09; 1.Inception&#xff08;开始&#xff09;&#xff1a;&#xff08;确认利益相关者&#xff09; 2.…

164道网络安全工程师面试题(附答案)

为了更好地帮助大家高薪就业&#xff0c;今天就给大家分享两份网络安全工程师面试题&#xff0c;一共有164道面试真题&#xff0c;希望它们能够帮助大家在面试中&#xff0c;少走一些弯路、更快拿到offer&#xff01; 93道网络安全面试题 1、什么是SQL注入攻击 2、什么是XSS…

Linux中的特殊进程:idle进程(0号进程)、init进程(1号进程,被systemd 取代 )、kthreadd进程(2号进程)

文章目录 1. Linux中的三个特殊进程&#xff1a;2. idle进程、init进程、kthreadd进程的创建3 kthreadd进程3.1 kthreadd进程的启动3.2 kthreadd进程创建子进程3.3 kthreadd的工作流程总结 4. init进程4.1 init进程的启动 4. 总结参考 1. Linux中的三个特殊进程&#xff1a; i…

【作者踩坑总结0错版】vscode配置codeql-MacBook(M1/M2芯片-arm)

文章目录 前言一、codeql是什么二、安装必备工具2.1、安装codeql-cli2.2、安装codeql仓库2.3、桌面新建文件夹2.4、安装vscode 三、配置codeql环境变量四、vscode配置codeql插件4.1、下载测试靶场4.2、生成数据库文件&#xff08;最难最多bug&#xff09;4.3、vscode配置ql数据…

[入门必看]数据结构5.3:二叉树的遍历和线索二叉树

[入门必看]数据结构5.3&#xff1a;二叉树的遍历和线索二叉树 第五章 树与二叉树5.3 二叉树的遍历和线索二叉树知识总览5.3.1_1 二叉树的先中后序遍历5.3.1_2 二叉树的层次遍历5.3.1_3 由遍历序列构造二叉树5.3.2_1 线索二叉树的概念5.3.2_2 二叉树的线索化5.3.2_3 在线索二叉树…

服务(第十九篇)mysql的备份和恢复

备份的类型&#xff1a; ①物理备份&#xff1a;备份数据库的物理文件&#xff0c;数据文件和日志文件&#xff1b; 冷备份&#xff1a;关闭数据库进行的&#xff1b; 热备份&#xff1a;数据库处于运行中状态&#xff0c;依赖于日志文件&#xff1b; 温备份&#xff1a;数…

Cisco NX-OS Software Release 10.3(3)F - 网络操作系统软件

Cisco NX-OS Software Release 10.3(3)F - 网络操作系统软件 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-nx-os-10/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Cisco NX-OS Cisco NX-OS 操作系统助力网络紧…

Golang中map基础

目录 map类型 声明和初始化 元素操作 大小和容量 并发问题 实现原理 注意 map类型 Go语言中的map类型是一种key-value&#xff08;键值对&#xff09;结构&#xff0c;用于存储一组无序的数据&#xff0c;其中键是唯一的&#xff0c;值可以相同或者不同。在Go语言的程序…

button 设置外观

导入图片 设置拉伸 设置按钮的FlatStyle属性为Flat 设置透明背景

先到先得先学,2023最新国内大厂最新Java面试八股文总结

“铜三铁四”接近尾声&#xff0c;身边被迫“毕业”或者主动在这个时间点跳槽的大佬基本该找到工作的都找到工作了&#xff0c;找不到的也大多数都已经躺平了&#xff08;手动狗头&#xff09;&#xff0c;只剩一群“45度人”&#xff08;卷不动&#xff0c;躺不平的人&#xf…

用于跨中心多边形分割的任务相关特征补充

文章目录 Task-Relevant Feature Replenishment for Cross-Centre Polyp Segmentation摘要本文方法Domain-Invariant Feature Decomposition (DIFD)Task-Relevant Feature ReplenishmentPolyp-Aware Adversarial Learning (PAAL)总损失函数 结果 Task-Relevant Feature Repleni…

AI翻译工具分享

LanguageX简介 冠军翻译引擎交互式翻译,为专业译者而生的新一代译者工具 自2017年神经网络机器翻译流行以来,“机器翻译替代人工翻译”的观点屡见不鲜。作为一个技术和语言背景结合的团队,LanguageX认为语言服务是高度复杂、需要创意的智力活动,并肩负着人类沟通的重要使命。La…

机器学习之k-means聚类二、啤酒聚类实现

文章目录 一、环境开发说明二、基于前篇理论实现1. 数据说明2. 具体实现流程a. 对数据进行标准化处理b. 使用手肘法进行K值得选择c. 算法实现&#xff0c;d.将聚类结果进行可视化e. 计算轮廓系数f. 轮廓系数可视化 三、 文中的完整代码四、不调包实现五、参考文献 一、环境开发…

MySQL-图形化界面工具 (下

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️树高千尺&#xff0c;落叶归根人生不易&…

ip route 和 route 命令

ip route 属于 iproute2 工具包&#xff1b;route 属于 net-tools 工具包&#xff1b;目前 ip route 使用较为广泛&#xff1b; 两个工具包的介绍请见 “iproute2 和 net-tools 介绍” 文章。 ip route命令介绍 ip route命令用于管理静态路由表。 linux 系统中&#xff0c;可…

【GigaGAN论文精读】Scaling up GANs for Text-to-Image Synthesis

【GigaGAN论文精读】Scaling up GANs for Text-to-Image Synthesis 0、前言Abstract1. Introduction&#xff08;图放在文末&#xff09;2. Related Works2.1Text-to-image synthesis.2.2GAN-based image synthesis.2.3Super-resolution for large-scale text-to-image models.…