
多开一个标签页,访问一个需要过验证但又不会有交互请求的链接,例如:
装个自动刷新的插件,我用的是 GitHub 随便找的:
https://github.com/Claxtastic/just-refresh ( jquery.min.js 已经和官网的对比过是一致的)
我设置的间隔是 3 秒,对我来说很管用,希望能帮到你们。
原理很简单,用别的更优雅的方式自然也可以实现。
油猴版本,不想装油猴就直接在对话页面的 DevTools - Console 里执行。
优雅一点,不需要多开个标签页了。
应该没人太在意 DevTools - Network 里有很多 404 请求吧?
// ==UserScript== // @name ChatGPT heartbeat // @namespace http://tampermonkey.net/ // @version 0.1 // @description try to take over the world! // @author https://v2ex.com/t/926890 // @match https://chat.openai.com/* // @icon https://chat.openai.com/favicon.ico // @grant none // ==/UserScript== (function() { 'use strict'; setInterval(function(){ fetch('https://chat.openai.com/404'); }, 3000); })(); 上面这个油猴脚本仅仅 fetch 404 似乎没有自动刷新那么有效,我实测还是要刷新了,干脆用 iframe 了,写法可能不好,欢迎指点:
// ==UserScript== // @name ChatGPT heartbeat // @namespace http://tampermonkey.net/ // @version 0.1 // @description try to take over the world! // @author https://v2ex.com/t/926890 // @match https://chat.openai.com/* // @icon https://chat.openai.com/favicon.ico // @grant none // ==/UserScript== (function () { var iframe = document.createElement("iframe"); iframe.id = "heartbeat"; iframe.style = "display:none"; iframe.name = "heartbeat"; iframe.src = "https://chat.openai.com/404/"; var fn = function () { setTimeout(function(){ iframe.src = "https://chat.openai.com/404/" + Math.random(); }, 3000); }; if (iframe.attachEvent) { iframe.attachEvent("onload", fn); } else { iframe.Onload= fn; } document.body.insertBefore(iframe, document.body.firstChild); })(); //
//
//
//
上面的油猴脚本占用太高了,风扇呼呼的。
实测 robots.txt 也有效(fetch 可能失效大概是 Cloudflare 对 Headers 的检测?)。
下面是 ChatGPT heartbeat 再也不改版,未来如果 robots.txt 无效了可以自己修改链接为 404,如果觉得每5秒请求一次太频繁了可以自己调大时间间隔。
// ==UserScript== // @name ChatGPT heartbeat // @namespace http://tampermonkey.net/ // @version 0.1 // @description try to take over the world! // @author https://v2ex.com/t/926890 // @match https://chat.openai.com/chat/* // @icon https://chat.openai.com/favicon.ico // @grant none // ==/UserScript== (function () { var iframe = document.createElement("iframe"); iframe.id = "heartbeat"; iframe.style = "display:none"; iframe.name = "heartbeat"; iframe.src = "https://chat.openai.com/robots.txt"; var fn = function () { setTimeout(function(){ document.getElementById('heartbeat').contentWindow.location.reload(true); }, 5000); }; if (iframe.attachEvent) { iframe.attachEvent("onload", fn); } else { iframe.Onload= fn; } document.body.insertBefore(iframe, document.body.firstChild); })(); 绝对不会再改版
// ==UserScript== // @name ChatGPT heartbeat // @namespace http://tampermonkey.net/ // @version 0.2 // @description try to take over the world! // @author https://v2ex.com/t/926890 // @match https://chat.openai.com/chat* // @icon https://chat.openai.com/favicon.ico // @grant none // ==/UserScript== /* 需要保持非常久的,可以额外尝试在 chrome://discards 里禁用 `Auto Discardable`, 或者用 https://github.com/WorldLanguages/DoNotDiscard 否则就算保持了 Cookies 有效,Chrome 也有可能自动休眠标签页。 */ (function () { var count = 0; var iframe = document.createElement("iframe"); iframe.id = "heartbeat"; iframe.style = "display:none"; iframe.name = "heartbeat"; iframe.src = "https://chat.openai.com/robots.txt"; var fn = function () { setTimeout(function () { if (count++ % 60 === 59) { iframe.src = "https://chat.openai.com/404"; } else if (iframe.src === "https://chat.openai.com/robots.txt") { iframe.contentWindow.location.reload(true); } else { iframe.src = "https://chat.openai.com/robots.txt"; } }, Math.floor(Math.random() * 5) * 1000 + 5000); }; if (iframe.attachEvent) { iframe.attachEvent("onload", fn); } else { iframe.Onload= fn; } document.head.insertBefore(iframe, document.head.firstChild); })(); 绝对绝对不会再改版
// ==UserScript== // @name ChatGPT heartbeat // @namespace http://tampermonkey.net/ // @version 0.2.1 // @description try to take over the world! // @author https://v2ex.com/t/926890 // @match https://chat.openai.com/chat* // @icon https://chat.openai.com/favicon.ico // @grant GM_setValue // @grant GM_getValue // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // ==/UserScript== /* 需要保持非常久的,可以额外尝试在 chrome://discards 里禁用 `Auto Discardable`, 或者用 https://github.com/WorldLanguages/DoNotDiscard 否则就算保持了 Cookies 有效,Chrome 也有可能自动休眠标签页。 */ (function () { var refreshURL = 'https://chat.openai.com/_next/static/k9OKjvwgjWES7JT3k-6g9/_ssgManifest.js'; var refreshInterval = 30 * 1000; var iframe = document.createElement('iframe'); iframe.id = 'heartbeat'; iframe.style = 'display:none'; iframe.name = 'heartbeat'; iframe.src = refreshURL; document.head.insertBefore(iframe, document.head.firstChild); setInterval(function () { if (iframe.contentWindow.location.href === refreshURL) { iframe.contentWindow.location.reload(true); } }, refreshInterval) })(); 1 yiios 2023-03-24 16:56:20 +08:00 好思路 |
2 0x535 2023-03-24 17:12:55 +08:00 问了 ChatGPT ,它说不想装插件,用油猴脚本也可以。试了一下,确实可以,目前情绪稳定 不知道后面会不会出问题 ```js (function() { 'use strict'; setInterval(function(){ location.reload(); }, 3000); })(); ``` |
3 bigtear 2023-03-24 17:18:11 +08:00 尝试一下 |
4 arzyu 2023-03-24 17:26:15 +08:00 这个方法不错! |
5 autoxbc 2023-03-24 17:53:34 +08:00 @0x535 #2 这个 ChatGPT 代码能力不行,reload() 执行后上下文都会销毁,回调不会执行第二次,此处用 setInterval 是思路不清 |
6 X-Force 2023-03-24 17:55:01 +08:00 我让 ChatGPT 帮忙写了一个油猴脚本,每隔 2 分钟发送一句“ping”,Ai 会回答 pong 。然后,就没有然后了,就这样。 |
7 X-Force 2023-03-24 17:56:44 +08:00 不必多开,不必刷新。只是有污染聊天记录,虽然没有根治验证的问题,但基本上算是解决烦人的问题 |
8 0o0O0o0O0o OP @autoxbc #5 他说的是油猴,所以还是可以的吧 |
10 0o0O0o0O0o OP @X-Force 那我建议你用油猴请求不存在的页面,而不是对话,毕竟 openai 资源紧张,被找理由 ban 了就不好了。其实就是带上 cookie 让 cloudflare 知道你请求了就行。 |
12 Vitta 2023-03-24 18:02:45 +08:00 你把 userAgent 改成 safari 的 试试。我改了之后不管他好久还能继续用 |
13 autoxbc 2023-03-24 18:12:30 +08:00 @0o0O0o0O0o #8 @0x535 #9 @Lentin #11 看来我没说清楚,我知道这是油猴,知道这不是控制台的注入。我的意思是,这里只用 setTimeout 就足够了,页面重载会重新注入这段代码,不需要 setInterval 来维持调度。反过来说,他试图用 setInterval 来维持调度说明对浏览器,对油猴理解不够 |
14 0o0O0o0O0o OP @autoxbc #13 哈哈,要是对它的期望是“能跑就行”那倒不错 |
15 GG668v26Fd55CP5W 2023-03-24 18:28:04 +08:00 简单粗暴,但真的有用,帮上大忙了! |
16 unifier 2023-03-24 18:33:18 +08:00 简单粗暴但有效,就喜欢这种方法 |
17 yinyu 2023-03-24 18:53:21 +08:00 我想说,每三秒自动刷新,是不是每三秒他需要回你一次,爽了自己苦了别人啊 (啥脚本啊,我马上去下载,我有油猴。狗头.ipg ) |
18 0o0O0o0O0o OP @yinyu #17 不需要的,考虑到这一点了,所以请求的是不存在的页面,对 OpenAI 服务器造成的负担会很小 |
19 unifier 2023-03-24 19:01:49 +08:00 |
20 yinyu 2023-03-24 19:02:55 +08:00 原来是请求一个不会交互的页面,妙啊,但是感觉官网有时候也抽风,可能是我机场的问题,有时候也是吐字很慢。不如白嫖的 API |
21 nijux 2023-03-24 19:32:58 +08:00 可以让 ChatGPT 改成随机 3~15 秒访问一次 |
22 0o0O0o0O0o OP @nijux #21 嗯,要是访问 404 页面没有效果我应该就会加上随机了,仅仅访问 404 页面感觉不太容易被风控关照到 |
23 XnEnokq9vkvVq4 2023-03-24 21:04:51 +08:00 妙啊,有效降低 plus 套餐的吸引力( |
24 Lentin 2023-03-24 21:32:03 +08:00 |
25 0o0O0o0O0o OP @Lentin #24 嗯,有两种进入对话的方式 - 访问 https://chat.openai.com/chat 或者 https://chat.openai.com/chat/ 然后跳转到 https://chat.openai.com/chat - 访问某个确定的对话,也就是 https://chat.openai.com/chat/<uuid> 所以可能还是 // @match https://chat.openai.com/chat* 更好些? |
26 zkncu9zjczw 2023-03-25 03:51:37 +08:00 请问这是什么原理 感觉很强 |
27 autoxbc 2023-03-25 04:20:30 +08:00 iframe 的思路很好,我个人的技巧是把 iframe 插入 head ,这样不需要指定 style 就会自动隐藏 |
28 0o0O0o0O0o OP @zkncu9zjczw #26 Cloudflare 的策略问题吧,大概是保持交互 Cloudflare 就认为你活跃?没具体分析过,大概原理没错。 |
29 ysq 2023-03-25 11:45:36 +08:00 s 升了 plus 就不用每次刷新了 |
30 X-Force 2023-03-25 19:04:48 +08:00 if (count++ % 60 === 59) { iframe.src = "https://chat.openai.com/404"; .... 这句的目的是什么?只访问 robot.txt 不行?一定还要偶尔访问下 404 页面吗? |
31 0o0O0o0O0o OP @X-Force #30 我没去求证,凭感觉写的,因为如果要验证效果有点耗时间。。。robots.txt 仅仅是带着 Cookie 请求一下,但在需要刷新甚至需要重新验证时它是不跳转的,404 在需要刷新的时候则会跳转 |
32 0o0O0o0O0o OP @X-Force #30 所以干脆隔一段时间就加载一下 404 |
33 arzyu 2023-03-25 20:23:31 +08:00 我设置 2 分钟一刷完全没问题。 |
34 cs3230524 2023-03-26 12:13:43 +08:00 付费吧,就稳定了。 |
35 cs3230524 2023-03-26 12:14:50 +08:00 大伙都是程序员行业了,这 100 多的投资很值啊。把精力放在搞钱上吧。。。 |
36 yinyu 2023-03-27 10:31:45 +08:00 为啥我运行了最后一版的油猴,长期不刷新还是会报错。是因为我梯子太辣鸡了吗? |
37 Lentin 2023-03-27 11:41:09 +08:00 |
38 0o0O0o0O0o OP @yinyu #36 你试试用 #37 的替换 404 |
39 brainor 2023-03-27 15:38:34 +08:00 greasy fork 里看到一个[这个]( https://greasyfork.org/en/scripts/462422-chatgpt-auto-refresh ) 作者貌似还弄了好几个[script]( https://github.com/adamlui/userscripts/tree/master/chatgpt ) ~ |
40 0o0O0o0O0o OP @brainor 这个牛,油猴原来还可以有菜单的 |
41 brainor 2023-03-27 16:57:18 +08:00 @0o0O0o0O0o 但是我发现这个脚本貌似没有用 hh |
42 EeveeRibbon 2023-03-28 14:11:01 +08:00 有一个小问题,就是每一次发起请求,油猴的图标右下角,显示当前启用脚本数量的那个红色数字就加一,静置一会那个数字都跑到好几百了,不知道这个在哪里设置 |
43 hun2008hun 2023-03-28 14:52:15 +08:00 @qiaofanxing 我也发现了,不知道怎么搞 |
44 0o0O0o0O0o OP |
45 160 2023-03-28 18:03:24 +08:00 @qiaofanxing 打开 Tampermonkey 的设置,配置模式设置为“高级”,然后找到“操作菜单”,找到“标记点信息”,选择”已禁用“或者”运行的脚本数量“,最后保存就不会一直增加了。 |
46 Losir 2023-03-30 14:27:57 +08:00 用了 0.2.1 版,被 ban 了一小时,发消息都是回复“Too many requests in 1 hour. Try again later.”,是不是这个方法不行了? |
47 0o0O0o0O0o OP @autoxbc 这个页面监听了事件,有事件就会在本地检测 session 是否超时( 348e4 ),就会强制刷新。对于这种情况一般怎么用油猴修改呢? hook addEventListener 效果很差,js 文件也不好拦截修改 |
48 0o0O0o0O0o OP @Losir #46 我倒是没遇到过这个报错,搜了下也不算 ban ,就是一小时内对话太多?这个脚本是避免增加和 OpenAI 的交互的,所以大概不是它引起的 |
49 autoxbc 2023-03-30 21:26:01 +08:00 @0o0O0o0O0o #47 这个应该是官方的自动刷新机制,我觉得应该够用,然后就把油猴实现停掉了 如果对官方这个效果不满意想自己实现,可以拦截 addEventListener ,当 type 参数为 focus 和 focusin 时,把监听请求丢弃掉 有一点要注意,拦截 addEventListener 不应该这样写 globalThis.addEventListener = function(){} 因为油猴的沙盒机制要求对顶级对象的写操作要显式使用 unsafeWindow ;同时也不能这样写 unsafeWindow.addEventListener = function(){} 因为 addEventListener 有多个入口,比如 document.addEventListener ;正确的做法是 EventTarget.prototype.addEventListener = function(){} EventTarget 是可监听对象的统一抽象原型 |
50 0o0O0o0O0o OP @autoxbc #49 谢谢,很有帮助!发布到 greasyfork 了,https://greasyfork.org/scripts/462967 |
51 vxzhong 2023-03-31 15:29:42 +08:00 有用,感谢。 |
52 Lentin 2023-04-03 13:05:07 +08:00 我也搞了一版,自动寻找页面上的 js 链接,顺便让 gpt 优化了下代码 (function() { const manifestScript = document.querySelector('script[src*="_ssgManifest.js"]'); if (!manifestScript) return; const heartbeat = Object.assign(document.createElement('iframe'), { style: 'display:none' }); document.head.prepend(heartbeat); setInterval(() => heartbeat.src = `${manifestScript.src}?${Date.now()}`, 30000); })(); |
53 tlerbao 2023-04-11 08:48:50 +08:00 @0o0O0o0O0o 我这边点安装脚本后 一闪什么也没有,脚本主页安装按钮变成了重新安装,但是油猴按钮显示没有在运行的脚本是怎么回事? |
54 0o0O0o0O0o OP @tlerbao #53 1. 重启浏览器 2. 确认油猴是 Enabled 状态 3. 进油猴的 Dashboard 看看是不是正常安装了 4. 匹配的 URL 是 `https://chat.openai.com/chat*` 要是还不行我也不了解了 |
55 tlerbao 2023-04-11 11:33:49 +08:00 @0o0O0o0O0o 我群友说他亲测,买了一台国外服务器,然后直接远程到服务器上面开浏览器用,不用刷新。。。。他说是独占 IP 的就不会频繁刷新 |
56 0o0O0o0O0o OP @tlerbao #55 我是用的便宜 VPS+ warp ,成本比较低 |
57 haibbo 2023-04-11 17:37:40 +08:00 @0o0O0o0O0o 我这边测试 _ssgManifest.s 超时后, 它就不会再次重试了 https://user-images.githubusercontent.com/1295315/231119886-9ae259e9-9e93-42ab-b5e5-228604c70b57.png |
58 0o0O0o0O0o OP @haibbo #57 试试最新版 0.2.4 |
59 tlerbao 2023-04-11 22:44:38 +08:00 @0o0O0o0O0o 刚测了一下,没有用,还是需要刷新 |
60 Biluesgakki 2023-04-12 14:37:52 +08:00 和我想到一块了哈哈 刚写了个脚本 60 秒刷新以下页面 |
61 yazoox 2023-04-13 09:56:15 +08:00 @0o0O0o0O0o OP 你这个脚本到底 是 30 秒还是 2 分钟刷新一下? |
62 0o0O0o0O0o OP @yazoox #61 30 秒,代码里的 2 分钟是应对一些特殊情况,比如 iframe 中的请求触发了 cloudflare challenge ,但 2 分钟还没跳转完就让 iframe 重新加载 |
63 jiang24gdufs 2023-04-13 11:43:51 +08:00 @0o0O0o0O0o 我是把这段 js 脚本放在控制台运行,但是现在已经不好用了, 执行两轮就报 403 了 |
64 0o0O0o0O0o OP @jiang24gdufs #63 我在用 0.2.4 ,chrome://discard 禁用了 Auto Discardable ,放置一个小时之后还是能直接对话。 发布在 greasyfork 上的引入了 MonkeyConfig ,控制台直接运行是不行的 |
65 jiang24gdufs 2023-04-13 14:03:31 +08:00 @0o0O0o0O0o 用 greasyfork 体验果然好多了, 不过想问问, 配置的 url 是固定的吗, 有没有必要参考#52 做成自动获取? |
66 0o0O0o0O0o OP |
67 NouveauNom 2023-04-13 17:51:58 +08:00 @0o0O0o0O0o 请问 edge 没有 edge://discard 是吗 |
68 NouveauNom 2023-04-13 17:55:16 +08:00 @0o0O0o0O0o 找到了,是 edge://discards/ |
69 vxzhong 2023-04-14 10:01:52 +08:00 |
70 0o0O0o0O0o OP @vxzhong #69 谢谢,已更新 |