-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathclient.js
141 lines (141 loc) · 5.28 KB
/
client.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
const puppeteer_1 = __importDefault(require("./services/puppeteer"));
const html_to_text_1 = require("html-to-text");
const storage_1 = __importDefault(require("./services/storage"));
const path_1 = __importDefault(require("path"));
const fs_1 = __importDefault(require("fs"));
const CHAT_GPT_URL = "https://chat.openai.com";
const PREPAND = "ChatGPT";
const HTML_TO_TEXT_OPTIONS = {
wordwrap: 130,
};
var Role;
(function (Role) {
Role["USER"] = "user";
Role["ASSISTANT"] = "assistant";
})(Role || (Role = {}));
const typeClick = async (page, text) => {
await page.keyboard.sendCharacter(text).catch((err) => {
console.log(err);
});
await page.click("button[data-testid='send-button']");
};
const init = async (options) => {
const params = {};
if (options.hasOwnProperty('headless')) {
params.headless = options.headless;
}
if (options.hasOwnProperty('screenshots')) {
storage_1.default.set('screenshots', String(options.screenshots));
// create public directory if it doesn't exist
if (!fs_1.default.existsSync(path_1.default.join(__dirname, 'public'))) {
fs_1.default.mkdirSync(path_1.default.join(__dirname, 'public'));
}
}
await puppeteer_1.default.init(params);
};
const singleMessage = async (text) => {
const page = await puppeteer_1.default.goTo(CHAT_GPT_URL);
const screenshots = storage_1.default.get('screenshots');
// screenshot
if (screenshots) {
await page.screenshot({ path: path_1.default.join(__dirname, 'public/screenshot.png') });
}
await page.waitForSelector("#prompt-textarea", {
timeout: 60000
});
await typeClick(page, text);
if (screenshots) {
await page.screenshot({ path: path_1.default.join(__dirname, 'public/screenshot2.png') });
}
const response = await page.evaluate(async () => {
var _a;
let prevText = null;
let currentText = (_a = document.querySelector(`div[data-message-author-role="assistant"]`)) === null || _a === void 0 ? void 0 : _a.innerHTML;
const getHTML = async () => {
return new Promise((resolve) => {
const interval = setInterval(() => {
var _a;
prevText = currentText;
currentText = (_a = document.querySelector(`div[data-message-author-role="assistant"]`)) === null || _a === void 0 ? void 0 : _a.innerHTML;
if (currentText && prevText === currentText) {
clearInterval(interval);
resolve(currentText);
}
}, 3000);
});
};
return getHTML();
});
page.close();
return (0, html_to_text_1.convert)(response, HTML_TO_TEXT_OPTIONS)
.replace(PREPAND, "")
.trim();
};
const createChat = async (text) => {
let responseMessageId = 3;
const history = [];
const page = await puppeteer_1.default.goTo(CHAT_GPT_URL);
const send = async (message) => {
const screenshots = storage_1.default.get('screenshots');
await typeClick(page, message);
if (screenshots) {
await page.screenshot({ path: path_1.default.join(__dirname, `public/screenshot-${responseMessageId + 1}.png`) });
}
history.push({
role: Role.USER,
content: message,
});
const response = await page.evaluate(async ({ responseMessageId }) => {
let prevText = null;
let currentTexts = document.querySelectorAll(`div[data-message-author-role="assistant"]`);
let currentText = currentTexts.length ? currentTexts[currentTexts.length - 1].innerHTML : null;
const getHTML = async () => {
return new Promise((resolve) => {
const interval = setInterval(() => {
prevText = currentText;
currentTexts = document.querySelectorAll(`div[data-message-author-role="assistant"]`);
currentText = currentTexts.length ? currentTexts[currentTexts.length - 1].innerHTML : null;
if (currentText && prevText === currentText) {
clearInterval(interval);
resolve(currentText);
}
}, 10000);
});
};
return getHTML();
}, {
responseMessageId,
});
responseMessageId += 2;
const answer = (0, html_to_text_1.convert)(response, HTML_TO_TEXT_OPTIONS)
.replace(PREPAND, "")
.trim();
history.push({
role: Role.ASSISTANT,
content: answer,
});
return answer;
};
const close = async () => {
await page.close();
};
await page.waitForSelector("#prompt-textarea", {
timeout: 60000
});
const response = await send(text);
return {
response,
history,
send,
close,
};
};
const close = async () => {
await puppeteer_1.default.close();
};
const client = { init, singleMessage, createChat, close };
module.exports = client;