使用 Tampermonkey 捕获 ChatGPT 发送前的内容

2023-09-02 18:58:27 +08:00
 FaiChou

网页端 ChatGPT 在发送消息时候,回车或者点击发送按钮后,对话框会被清空发送,如果遇到网络状况不佳,消息发送失败,则这条编辑的消息也消失了。

所以想使用 Tampermonkey 来捕获这个发送行为:

// ==UserScript==
// @name         ChatGPT 回车捕获
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://chat.openai.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=openai.com
// @run-at       document-idle
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    function run() {
        const inputElement = document.querySelector('#prompt-textarea');
        if (inputElement) {
            console.log("[ChatGPT 回车捕获]: Hacked!");
            inputElement.addEventListener('keydown', function(event) {
                if (event.keyCode === 13) {
                    console.log("[ChatGPT 回车捕获]: 即将发送的内容=> ", inputElement.value);
                }
            });
        } else {
            console.log("[ChatGPT 回车捕获]: No inputElement found!")
        }
    }
    setTimeout(() => {
        run();
    }, 3000);
    let oldPushState = history.pushState;
    history.pushState = function pushState() {
        let ret = oldPushState.apply(this, arguments);
        window.dispatchEvent(new Event('pushstate'));
        window.dispatchEvent(new Event('locationchange'));
        return ret;
    };
    let oldReplaceState = history.replaceState;
    history.replaceState = function replaceState() {
        let ret = oldReplaceState.apply(this, arguments);
        window.dispatchEvent(new Event('replacestate'));
        window.dispatchEvent(new Event('locationchange'));
        return ret;
    };
    window.addEventListener('popstate', () => {
        window.dispatchEvent(new Event('locationchange'));
    });
    window.addEventListener('locationchange', function () {
        setTimeout(() => {
            run();
        }, 3000);
    });
})();

上面代码虽然能完成这项工作:

但这样的实现也有一些其他问题,比如页面在第 3 秒后才完全加载出来。并且只是监听了回车按键,发送按钮也是一样的逻辑(重复代码,没有写)。

所以这样做有点丑,大佬们有什么其他方法来优化一下?

比如 hack 一些内部方法:

let msg = null;
const OldTextDecoder = TextDecoder;
TextDecoder = class {
    constructor() {
        this.old = new OldTextDecoder(...arguments);
    }
    decode() {
        const res = this.old.decode(...arguments);
        try {
            msg = JSON.parse(res).message.content.parts[0];
        } catch (e) {
        }
        if (msg != null && res == "[DONE]") {
            if (window.ongpt) {
                window.ongpt(msg);
            }
            msg = null;
        }
        return res;
    }
};

但这只是 hack 了 TextDecoder ,输入框发送前的消息应该如何 hack ?

ps. 仅探讨技术实现,不用推荐潘多拉等第三方工具。

1424 次点击
所在节点    程序员
6 条回复
codehz
2023-09-02 19:07:08 +08:00
我建议用第三方前端解决这个问题
BeautifulSoap
2023-09-02 19:18:29 +08:00
多年来已经养成了在按下发信息/发帖/回帖按钮之前,先全选、剪切、粘贴一遍的肌肉记忆了
Byzliu
2023-09-02 19:25:47 +08:00
@BeautifulSoap 我也是,尤其是字多的时候😂
nuanshen
2023-09-02 19:40:12 +08:00
@Byzliu 我甚至会先在备忘录里编辑好
Liftman
2023-09-03 00:16:46 +08:00
再做一个 claude 的吧。如果 gpt 卡回复,我遇到的情况基本上其实还在提问记录里。但是 claude 因为免费,他卡消失的几率很大。
BaseException
2023-09-03 07:58:41 +08:00
一直在用 chatgpt next web 没有这个烦恼

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/970390

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX