USE AT YOUR OWN RISK!
当前为
// ==UserScript==
// @name ChatGPT HeartBeat
// @namespace http://tampermonkey.net/
// @version 0.2.5
// @license GPLv3
// @description USE AT YOUR OWN RISK!
// @author https://v2ex.com/t/926890
// @homepage https://v2ex.com/t/926890
// @homepageURL https://v2ex.com/t/926890
// @match https://chat.openai.com
// @match https://chat.openai.com/
// @match https://chat.openai.com/c/*
// @match https://chat.openai.com/chat
// @match https://chat.openai.com/chat/*
// @icon https://chat.openai.com/favicon.ico
// @require https://greatest.deepsurf.us/scripts/395037-monkeyconfig-modern/code/MonkeyConfig%20Modern.js?version=764968
// @run-at document-start
// @noframes
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_registerMenuCommand
// @grant GM_unregisterMenuCommand
// @grant GM_addStyle
// ==/UserScript==
/*
需要保持非常久的,可以额外尝试在 chrome://discards 里禁用 `Auto Discardable`,
或者用 https://github.com/WorldLanguages/DoNotDiscard
否则就算保持了 Cookies 有效,Chrome 也有可能自动休眠标签页。
*/
(function () {
function isWindow(obj) {
return obj instanceof Window;
}
// 防止页面通过监听事件强制刷新
// https://gist.github.com/fuzmish/bd444b1aadc2d22aada7c9b1a6de56ba
const rawAddEventListener = EventTarget.prototype.addEventListener;
EventTarget.prototype.addEventListener = function (...args) {
const [eventName] = args;
if (
isWindow(this) &&
["focus", "focusin", "visibilitychange"].includes(eventName)
) {
return;
}
return rawAddEventListener.apply(this, args);
};
const cfg = new MonkeyConfig({
title: "Configuration",
menuCommand: true,
params: {
refreshInterval: {
type: "number",
default: 30,
},
refreshURL: {
type: "text",
default:
"https://chat.openai.com/_next/static/k9OKjvwgjWES7JT3k-6g9/_ssgManifest.js",
},
},
});
function getRefreshURL () {
var refreshURL = cfg.get("refreshURL");
// 如果手动配置了 _ssgManifest.js 以外的 URL,就不尝试获取最新的
if (!refreshURL.endsWith("_ssgManifest.js")) {
return refreshURL;
}
// 获取最新的 _ssgManifest.js 链接
// https://v2ex.com/t/926890#r_12897849
const manifestScript = document.querySelector(
'script[src*="_ssgManifest.js"]'
);
if (manifestScript) {
cfg.set("refreshURL", manifestScript.src);
return manifestScript.src;
}
return refreshURL;
};
const heartbeat = document.createElement("iframe");
heartbeat.style.display = "none";
document.head.prepend(heartbeat);
let count = 0;
function refresh() {
count = 0;
heartbeat.src = `${getRefreshURL()}?${Date.now()}`;
}
setInterval(function () {
try {
let current = new URL(heartbeat.contentWindow.location.href);
let expect = new URL(getRefreshURL());
if ( heartbeat.contentWindow.location.href === '' ||
heartbeat.contentWindow.location.href === 'about:blank' ||
current.pathname === expect.pathname ||
count++ * cfg.get("refreshInterval") >= 2 * 60) {
refresh();
}
} catch (error) {
// https://v2ex.com/t/926890#r_12935587
console.error(error);
refresh();
}
}, cfg.get("refreshInterval") * 1000);
})();