自动在网页上与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()
})();