您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
以html文件的形式保存当前页面下ChatGPT的对话记录:Save the chat record of ChatGPT on the current page in the form of html file
// ==UserScript== // @name Download ChatGPT record // @namespace http://tampermonkey.net/ // @version 0.5.3 // @description 以html文件的形式保存当前页面下ChatGPT的对话记录:Save the chat record of ChatGPT on the current page in the form of html file // @author YYForReal // @match https://chat.openai.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=openai.com // @grant none // @license MIT // ==/UserScript== (function() { 'use strict'; (function(){ // 原本官网的域名,用于连接资源 // const ResourceDomain = "https://chat.openai.com/" // 使用Gitee仓库内托管的资源 const ResourceDomain = "https://gitee.com/friendArt/download-ChatGPT-record/raw/master/resource/" function downloadInit(){ // DOM 深拷贝,防止影响页面 const head = document.head.cloneNode(true) const body = document.body.cloneNode(true) // 替换所有的href链接 let links = head.querySelectorAll("link"); for (let link of links) { if (link.getAttribute("href").indexOf("http") !== 0) { link.setAttribute("href", ResourceDomain + link.getAttribute("href")); } } // 移除head内部的script代码 let scripts = head.querySelectorAll("script"); for (let scriptDom of scripts) { scriptDom.parentElement.removeChild(scriptDom); // 如果需要继续使用的话可以拼接保留 // if (link.getAttribute("href").indexOf("http") !== 0) { // link.setAttribute("href", ResourceDomain + link.getAttribute("href")); // } } // 单独移除最新的CSS样式 links = head.querySelectorAll('link[rel="stylesheet"]'); for (var i = 0; i < links.length; i++) { var link = links[i]; link.parentNode.removeChild(link); } // 单独引入CSS样式 var link = document.createElement('link'); link.rel = 'stylesheet'; link.type = 'text/css'; link.href = 'https://gitee.com/friendArt/download-ChatGPT-record/raw/master/resource/_next/static/css/c770e01054031fe0.css'; head.appendChild(link); // 移除body底部栏 let bottom = body.querySelector('.absolute.bottom-0') bottom.parentNode.removeChild(bottom) // 修改样式,使之可以滚动 let overflowDoms = body.querySelectorAll('.overflow-hidden') for (let dom of overflowDoms){ dom.classList.remove("overflow-hidden") } // 拿到修改之后的字符串文本 let mainStr = body.getElementsByTagName('main')[0].cloneNode(true).outerHTML; let headStr = head.outerHTML; // 去除所有的<script> // 获取script标签内的内容 let reg = /<script[^>]*>([^<]|<(?!\/script))*<\/script>/gmi let res = mainStr.match(reg) // 如果具有script标签 if (res != null) { res.forEach((ele) => { mainStr = mainStr.replace(ele,'') }) } res = headStr.match(reg) if (res != null) { res.forEach((ele) => { headStr = headStr.replace(ele,'') }) } // 去除头部的跨域标签 headStr = headStr.replace(/crossorigin/igm,"") // 获取风格模式(light mode / dark mode) let htmlDom = document.querySelector('html') let mode = htmlDom.getAttribute('style') let htmlClass = htmlDom.className; // 增加copy code功能 let copyCodeScript = `<script> let buttons = document.querySelectorAll('button.flex.ml-auto.gap-2') let timer = null; buttons.forEach(button => { button.addEventListener('click',(e)=>{ // 不使用event对象找DOM会出现闭包、e.target是事件源、currentTarget是监听的对象 let button = e.currentTarget let codeBlock = button.parentNode.nextSibling.children[0]; const textArea = document.createElement("textarea"); textArea.value = codeBlock.textContent; document.body.appendChild(textArea); textArea.select(); document.execCommand("copy"); textArea.remove(); button.innerHTML = button.innerHTML.replace(/Copy code/igm,'Copied!'); if(timer == null){ timer = setTimeout(()=>{ button.innerHTML = button.innerHTML.replace(/Copied!/igm,'Copy code'); clearTimeout(timer); timer = null },1000) } }) }); </script>` return `<html class="${htmlClass}" style="${mode}" >${headStr} <body> ${mainStr} ${copyCodeScript}</body> </html>` } // 定义按钮 var downloadButton = document.createElement("button"); downloadButton.className = "download-button" downloadButton.innerHTML = "Download Record"; // 设置按钮元素的样式 downloadButton.style.position = "fixed"; downloadButton.style.padding = "5px"; downloadButton.style.bottom = "100px"; downloadButton.style.right = "20px"; downloadButton.style.backgroundColor = "skyblue" downloadButton.style.border = "1px solid black"; downloadButton.style.borderRadius = "10px"; downloadButton.style.zIndex = 99; // 为按钮添加点击事件 downloadButton.addEventListener("click", function () { // 定义html代码字符串 // var htmlCode = "<html><body><h1>Example HTML code</h1></body></html>"; var htmlCode = downloadInit(); // 创建Blob对象 var blob = new Blob([htmlCode], { type: "text/html" }); // 获取时间,用于文件命名 var today = new Date(); var month = (today.getMonth() + 1).toString().padStart(2, '0'); var day = today.getDate().toString().padStart(2, '0'); // 创建下载链接 var downloadLink = document.createElement("a"); downloadLink.download = `Chat-${document.title}(${month}${day}).html` downloadLink.href = URL.createObjectURL(blob); // 点击链接,实现下载 downloadLink.click(); // 由于修改了DOM,所以需要重新刷新页面 // window.location.reload(); }); // 将按钮添加到页面中 document.body.appendChild(downloadButton); })() })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址