您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
自动在网页上与chat gpt对话
当前为
- // ==UserScript==
- // @namespace https://greasyfork.org/zh-CN/users/1106595-ikkem-lin
- // @name GPT Auto task
- // @author Mark
- // @description 自动在网页上与chat gpt对话
- // @homepageURL https://github.com/IKKEM-Lin/gpt-auto-task
- // @version 0.0.2
- // @match *chat.openai.com/*
- // @run-at document-idle
- // ==/UserScript==
- (function () {
- "use strict";
- class GPT_ASK_LOOP {
- queue = [];
- responds = [];
- checkInterval = 10000;
- account = "";
- constructor(account) {
- this.responds = JSON.parse(
- localStorage.getItem("reaction_responds") || "[]"
- );
- const queueCache = JSON.parse(localStorage.getItem("task_queue") || "[]");
- const resSnippetIds = this.responds.map((respond) => respond.snippetId);
- this.queue = queueCache.filter(
- (item) => !resSnippetIds.includes(item.id)
- );
- this.account = account || Math.ceil(Math.random() * 1e10).toString(32);
- this.main();
- }
- async report() {
- await fetch("https://gpt-hit.deno.dev/api/update", {
- method: "POST",
- body: JSON.stringify({
- account: this.account,
- reaction_count: this.responds.length,
- queue_count: this.queue.length,
- }),
- }).catch(err => {
- console.error({err})
- });
- }
- genPrompt(content) {
- return `${localStorage.getItem("mock_prompt")}
- ''' ${content} ''' `;
- }
- getTask() {
- this.report();
- const task = this.queue[0];
- if (!task) {
- console.log("任务队列为空");
- return;
- }
- return async () => {
- const { article_id, id, content } = task;
- console.log(
- `开始触发 ${article_id}-${id}, ${new Date().toTimeString()}`
- );
- const prompt = this.genPrompt(content);
- const result = await this.trigger(prompt);
- return { articleId: article_id, snippetId: id, reaction: result };
- // console.log("result:", result);
- };
- }
- saveRespond(respond) {
- const { snippetId } = respond;
- this.responds.push(respond);
- this.queue = this.queue.filter((item) => item.id !== snippetId);
- localStorage.setItem("task_queue", JSON.stringify(this.queue));
- localStorage.setItem("reaction_responds", JSON.stringify(this.responds));
- }
- sleep(duration) {
- return new Promise((resolve, reject) => {
- setTimeout(() => {
- resolve(true);
- }, duration);
- });
- }
- trigger(prompt, checkInterval = this.checkInterval) {
- return new Promise((resolve, reject) => {
- const textEl = document.querySelector("#prompt-textarea");
- const submitEl = document.querySelector("#prompt-textarea + button");
- textEl.value = prompt; //`你好, 帮我算下${Math.floor(Math.random() * 10000)}开平方的结果`;
- textEl.dispatchEvent(new Event("input", { bubbles: true }));
- setTimeout(() => {
- submitEl.click();
- let resCache = null;
- (async () => {
- while (true) {
- await this.sleep(checkInterval);
- const result = Array.from(
- document.querySelectorAll("main .group")
- );
- const temp = result[result.length - 1];
- if (!temp) {
- continue;
- }
- if (resCache === temp.innerHTML) {
- // console.log("匹配,resCache:", resCache);
- resolve(resCache);
- break;
- }
- resCache = temp.innerHTML;
- console.log(`${checkInterval / 1000}s后再次检查结果`);
- }
- })();
- }, 4000);
- });
- }
- async main(sleepTime = 5000) {
- while (true) {
- const task = this.getTask();
- if (!task) {
- await this.sleep(5 * 60 * 1000);
- continue;
- }
- const result = await task();
- this.saveRespond(result);
- console.log(`${sleepTime / 1000}s后将再次触发`);
- const newChatBtn = document.querySelector("nav>div.mb-1>a:first-child");
- newChatBtn.click();
- await this.sleep(sleepTime);
- }
- }
- }
- function start() {
- const name = document.querySelector('nav > div:last-child > div:last-child').innerText;
- if (name) {
- new GPT_ASK_LOOP(name);
- } else {
- setTimeout(() => {
- start()
- }, 5000);
- }
- }
- start()
- })();