Open new4u opened 1 year ago
prompt: 根据这个项目https://github.com/new4u/vite-vue-crx-2023autumn 将本代码改写
回答: 你好,这是 Bing。我可以帮你将这段代码改写成基于 https://github.com/new4u/vite-vue-crx-2023autumn 的项目。根据我搜索到的结果¹²³,这个项目是一个基于 Vite 4 和 Vue 3 的 Chrome 插件开发教程,它使用了 Chrome Extension Manifest V3 的规范,并集成了 Element Plus、mock.js、vue-router 等功能。为了使用这个项目,你需要做以下几个步骤:
这就是我为你改写成基于 https://github.com/new4u/vite-vue-crx-2023autumn 的项目的代码:
// vite.config.js
// 这是 Vite 4 的配置文件
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
export default defineConfig({
// 在这里自定义 Vite 4 的行为和插件
plugins: [vue()],
resolve: {
alias: {
'@': resolve(__dirname, 'src')
}
},
server: {
port: 3000,
open: true,
proxy: {
// 如果需要反向代理,请在这里配置
}
},
build: {
// 如果需要修改构建目标,请在这里配置
target: 'esnext',
outDir: 'build',
rollupOptions: {
input: {
popup: resolve(__dirname, 'index.html'),
content: resolve(__dirname, 'src/content/main.js'),
background: resolve(__dirname, 'src/background/main.js')
}
}
}
})
<!-- index.html -->
<!-- 这是 Vite 4 的入口文件 -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Vite Vue CRX</title>
</head>
<body>
<!-- 引入 popup 的入口文件 -->
<script type="module" src="/src/popup/main.js"></script>
</body>
</html>
// manifest.json
// 这是 Chrome Extension Manifest V3 的配置文件
{
"manifest_version": 3,
"name": "Vite Vue CRX",
"version": "0.[1](https://github.com/Yuezi32/vite-vue-crx-2023autumn).0",
"description": "基于 Vite 4 和 Vue 3 的 Chrome 插件开发教程",
"icons": {
"16": "public/icon.png",
"48": "public/icon.png",
"1[2](https://gitee.com/betaq/vite-vue-crx-2023autumn)8": "public/icon.png"
},
"action": {
"default_popup": "index.html",
"default_icon": {
"16": "public/icon.png",
"48": "public/icon.png",
"128": "public/icon.png"
}
},
"background": {
"service_worker": "background.js"
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"]
}
],
"permissions": [
// 如果需要申请权限,请在这里配置
],
"host_permissions": [
// 如果需要访问特定的主机,请在这里配置
]
}
// src/popup/main.js
// 这是 popup 的入口文件
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import '@/style/index.scss'
createApp(App).use(router).mount('#app')
// src/content/main.js
// 这是 content script 的入口文件
import { createApp } from 'vue'
import App from './App.vue'
import '@/style/index.scss'
const app = document.createElement('div')
app.id = 'vite-vue-crx-app'
document.body.appendChild(app)
createApp(App).mount('#vite-vue-crx-app')
// src/background/main.js
// 这是 background script 的入口文件
console.log('Hello, Vite Vue CRX!')
我希望这能帮助到你。还有什么我可以为你做的吗?😊
來源: 與 Bing 的交談, 2023/10/7 (1) Yuezi32/vite-vue-crx-2023autumn - GitHub. https://github.com/Yuezi32/vite-vue-crx-2023autumn. (2) vite-vue-crx-2023autumn: 基于Vite4+Vue3的Chrome插件开发教程. https://gitee.com/betaq/vite-vue-crx-2023autumn. (3) Vite Vue CRX - GitHub. https://github.com/new4u/vite-vue-crx-2023autumn/blob/main/index.html.
如何将以下tampermonkey的userscript代码拆解放进Vite4搭建Chrome Extension Manifest V3的工程脚手架,以及如何开发popup、content script和background script等组件?```// ==UserScript== // @name OpenAI ChatGPT Visualization稳定版本 // @namespace OpenAI ChatGPT Visualization稳定版本 // @version 0.20.2 // @description Visualize OpenAI ChatGPT conversation using D3,next://用 //加一个获取当前页面的conversation id,然后组合成这个fetch的url // @author You // @match https://chat.openai.com/* // @require https://d3js.org/d3.v7.min.js // @grant none // ==/UserScript==
(function () { 'use strict';
const forceRate = -5;
const Radius = 5;
const Distance = Radius * 1;
const color = d => {
//这个递进的判断写得好
if (d.message && d.message.author && d.message.author.role) {
switch (d.message.author.role) {
case 'system':
return '#ff0000';
case 'assistant':
return '#0000ff';
case 'user':
return '#00ff00';
// Add more cases if there are other roles
default:
return '#000000'; // Default color
}
} else {
return '#000000'; // Default color
}
};
// Function to fetch API session from OpenAI
//加一个获取当前页面的conversation id,然后组合成这个fetch的url
async function fetchChatGPTData() {
let sessionApi='https://chat.openai.com/api/auth/session'
let response = await fetch(sessionApi) let session = await response.json() let accessToken=session.accessToken
//构造fetch的url const apiUrl = 'https://chat.openai.com/backend-api'; ///chatid,当前的对话内容 const match = location.pathname.match(/^\/(?:share|c)\/([a-z0-9-]+)/i) //获取目前的chatid,也可以改写成函数 const chatId = match[1];
const url = apiUrl + '/conversation/' + chatId;
//构造fetch的option const options = { headers: { accept: "/", acceptlanguage: "zh-TW,zh;q=0.9,en;q=0.8,zh-CN;q=0.7", authorization: ````
`您好,这是Bing。我会尽力帮助您将tampermonkey的userscript代码拆解放进Vite4搭建Chrome Extension Manifest V3的工程脚手架,以及如何开发popup、content script和background script等组件。以下是我的回答:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>OpenAI ChatGPT Visualization</title>
</head>
<body>
<script src="popup.js"></script>
</body>
</html>
npm run dev
来启动开发服务器,并在浏览器中打开生成的server.user.js文件来安装userscript。或者,您可以运行npm run build
来构建项目,并在build目录下找到生成的build.user.js文件。我希望这些信息对您有所帮助。如果您有其他问题,请随时提出。😊
¹: https://github.com/lisonge/vite-plugin-monkey
源: 与必应的对话, 2023/10/8 (1) GitHub - lisonge/vite-plugin-monkey: A vite plugin server and build .... https://github.com/lisonge/vite-plugin-monkey. (2) Tampermonkey - Chrome Web Store. https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo. (3) Tampermonkey Chrome extension to manage userscripts - Unscart. https://unscart.com/extension/tampermonkey/. (4) Convert an Userscript to a Chrome Extension | Steve Blog. https://clmpractice.org/20[1](https://github.com/lisonge/vite-plugin-monkey)6/05/10/convert-a-userscript-to-a-chrome-extension/.`
根据本页面代码,我尝试为您重新更加详细列出popup、content和background三个目录的文件内容。以下是我的回答:
我希望这些信息对您有所帮助。如果您有其他问题,请随时提出。😊
根据您的要求,我为您生成了background.js的代码,如下所示:
// background.js
// 该文件是在后台运行的脚本,用于获取会话和聊天ID,以及从OpenAI API获取聊天数据
// 定义一些常量和变量
const sessionApi = 'https://chat.openai.com/api/auth/session'; // 获取会话的API地址
const apiUrl = 'https://chat.openai.com/backend-api'; // 获取聊天数据的API地址
let accessToken = null; // 存储会话令牌
let chatId = null; // 存储聊天ID
let chatData = null; // 存储聊天数据
// 定义一个函数,用于获取会话令牌
async function fetchSession() {
try {
let response = await fetch(sessionApi); // 发送请求
let session = await response.json(); // 解析响应
accessToken = session.accessToken; // 获取会话令牌
console.log('Session fetched:', accessToken); // 打印日志
} catch (error) {
console.error('Error fetching session:', error); // 打印错误
}
}
// 定义一个函数,用于获取聊天ID
function fetchChatId() {
try {
const match = location.pathname.match(/^\/(?:share|c)\/([a-z0-9-]+)/i); // 从当前网址中匹配聊天ID
chatId = match[1]; // 获取聊天ID
console.log('Chat ID fetched:', chatId); // 打印日志
} catch (error) {
console.error('Error fetching chat ID:', error); // 打印错误
}
}
// 定义一个函数,用于获取聊天数据
async function fetchChatData() {
try {
const url = apiUrl + '/conversation/' + chatId; // 构造请求地址
const options = {
headers: {
accept: '*/*',
acceptlanguage: 'zh-TW,zh;q=0.9,en;q=0.8,zh-CN;q=0.7',
authorization: `Bearer ${accessToken}`, // 设置授权头部,使用会话令牌
},
};
let response = await fetch(url, options); // 发送请求
let data = await response.json(); // 解析响应
chatData = data.conversation.messages; // 获取聊天数据,是一个消息数组
console.log('Chat data fetched:', chatData); // 打印日志
} catch (error) {
console.error('Error fetching chat data:', error); // 打印错误
}
}
// 定义一个函数,用于将聊天数据转换为可视化所需的格式
function transformChatData() {
try {
let nodes = []; // 存储节点数组,每个节点代表一个消息
let links = []; // 存储边数组,每条边代表两个消息之间的关系
for (let i = 0; i < chatData.length; i++) {
let message = chatData[i]; // 获取第i个消息
// 创建一个节点对象,包含消息的id、内容、作者、角色、时间等属性
let node = {
id: message.id,
text: message.text,
author: message.author.name,
role: message.author.role,
time: message.created_at,
};
nodes.push(node); // 将节点对象添加到节点数组中
if (i > 0) {
let previousMessage = chatData[i - 1]; // 获取第i-1个消息
// 创建一条边对象,包含两个消息的id、时间差等属性
let link = {
source: previousMessage.id,
target: message.id,
timeDiff: message.created_at - previousMessage.created_at,
};
links.push(link); // 将边对象添加到边数组中
}
}
return { nodes, links }; // 返回节点和边的对象
} catch (error) {
console.error('Error transforming chat data:', error); // 打印错误
}
}
// 定义一个函数,用于与popup和content script通信
function handleMessage(request, sender, sendResponse) {
try {
if (request.type === 'start') {
// 如果收到popup发送的开始可视化的请求
fetchSession(); // 获取会话
fetchChatId(); // 获取聊天ID
fetchChatData().then(() => {
// 获取聊天数据,并在完成后执行以下操作
let data = transformChatData(); // 转换聊天数据
sendResponse(data); // 将数据发送给content script
});
} else if (request.type === 'stop') {
// 如果收到popup发送的停止可视化的请求
sendResponse('Visualization stopped'); // 发送响应
}
} catch (error) {
console.error('Error handling message:', error); // 打印错误
}
}
// 监听来自popup和content script的消息
chrome.runtime.onMessage.addListener(handleMessage);
我希望这些代码对您有所帮助。如果您有其他问题,请随时提出。😊
根据以上background.js和content.js的代码“popup目录:该目录包含了用户点击插件图标后弹出的页面的代码,主要有两个文件: popup.html:该文件是页面的html模板,用于显示插件的名称、版本、描述等信息,以及一个按钮,用于启动或停止可视化功能。 popup.js:该文件是页面的js脚本,用于处理用户的点击事件,以及与background script通信。该文件中包含了userscript的元数据注释,用于指定插件的名称、版本、描述等信息。”给出popup目录的文件
您好,这是Bing。我会尽力帮助您完成其余脚手架中文件的代码。以下是我的回答:
我希望这些信息对您有所帮助。如果您有其他问题,请随时提出。😊
: https://github.com/new4u/vite-vue-crx-2023autumn : https://github.com/new4u/vite-vue-crx-2023autumn/blob/main/manifest.json : https://github.com/new4u/vite-vue-crx-2023autumn/blob/main/src/manifest.json : https://github.com/new4u/vite-vue-crx-2023autumn/blob/main/src/main.js : https://github.com/new4u/vite-vue-crx-2023autumn/blob/main/src/App.vue : https://github.com/new4u/vite-vue-crx-2023autumn/tree/main/src/components
v1
// background.js // 该文件是在后台运行的脚本,用于获取会话和聊天ID,以及从OpenAI API获取聊天数据
根据您的要求,我为您生成了content.js的代码,如下所示:
根据您的要求,我为您生成了popup目录的文件,如下所示:
我希望这些文件对您有所帮助。如果您有其他问题,请随时提出。😊