コミット
674226c036
|
@ -35,7 +35,6 @@ interface Account extends ComInfo {
|
||||||
left: number;
|
left: number;
|
||||||
useOutTime: number;
|
useOutTime: number;
|
||||||
accessToken: string;
|
accessToken: string;
|
||||||
refreshToken: string;
|
|
||||||
tokenGotTime: number;
|
tokenGotTime: number;
|
||||||
}
|
}
|
||||||
class Child extends ComChild<Account> {
|
class Child extends ComChild<Account> {
|
||||||
|
@ -45,7 +44,7 @@ class Child extends ComChild<Account> {
|
||||||
super(label, info, options);
|
super(label, info, options);
|
||||||
this.client = CreateAxiosProxy(
|
this.client = CreateAxiosProxy(
|
||||||
{
|
{
|
||||||
baseURL: 'https://merlin-uam-yak3s7dv3a-ue.a.run.app',
|
baseURL: 'https://uam.getmerlin.in',
|
||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
);
|
);
|
||||||
|
@ -89,7 +88,15 @@ class Child extends ComChild<Account> {
|
||||||
await page.keyboard.type(password);
|
await page.keyboard.type(password);
|
||||||
this.update({ password });
|
this.update({ password });
|
||||||
|
|
||||||
await page.keyboard.press('Enter');
|
await page.waitForSelector('button[type="submit"]');
|
||||||
|
await page.click('button[type="submit"]');
|
||||||
|
await sleep(10000);
|
||||||
|
|
||||||
|
const resendbutton = "div > main > div > div > div > div > button";
|
||||||
|
await page.waitForSelector(resendbutton);
|
||||||
|
await page.click(resendbutton);
|
||||||
|
await sleep(5000);
|
||||||
|
|
||||||
for (const v of await mailbox.waitMails()) {
|
for (const v of await mailbox.waitMails()) {
|
||||||
let verifyUrl = v.content.match(/href=["'](.*?)["']/i)?.[1] || '';
|
let verifyUrl = v.content.match(/href=["'](.*?)["']/i)?.[1] || '';
|
||||||
if (!verifyUrl) {
|
if (!verifyUrl) {
|
||||||
|
@ -140,17 +147,41 @@ class Child extends ComChild<Account> {
|
||||||
|
|
||||||
async getLoginStatus(page: Page) {
|
async getLoginStatus(page: Page) {
|
||||||
try {
|
try {
|
||||||
page.reload();
|
page.goto("https://www.getmerlin.in/zh-CN/chat");
|
||||||
const req = await page.waitForResponse(
|
const req = await page.waitForResponse(
|
||||||
(req) =>
|
(req) =>
|
||||||
req.url().indexOf('status') > -1 &&
|
req.url().indexOf('getAstroProfiles') > -1 &&
|
||||||
req.request().method().toUpperCase() === 'GET',
|
req.request().method().toUpperCase() === 'GET',
|
||||||
);
|
);
|
||||||
const url = new URLSearchParams(req.url().split('?')[1]);
|
function removeRepeats(num: number): number {
|
||||||
const token = url.get('firebaseToken');
|
const str = num.toString();
|
||||||
const status: { data: { user: { used: number; limit: number } } } =
|
|
||||||
await req.json();
|
if (str.length <= 2) {
|
||||||
return { token, left: status.data.user.limit - status.data.user.used };
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
const repeatPattern = /^(\d+?)\1+$/;
|
||||||
|
const match = str.match(repeatPattern);
|
||||||
|
|
||||||
|
if (match) {
|
||||||
|
return parseInt(match[1], 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
const token = req.url().split('token=')[1].split('&')[0];
|
||||||
|
this.logger.info(`get login status token: ${token}`);
|
||||||
|
const element = await page.$('span.text-cornblue-700');
|
||||||
|
const textContent = await page.evaluate(el => el?.textContent, element);
|
||||||
|
const match = textContent?.match(/(\d+)\s*queries\s*left/);
|
||||||
|
let left = 0;
|
||||||
|
if (match) {
|
||||||
|
left = Number(match[1]);
|
||||||
|
left = removeRepeats(left);
|
||||||
|
}
|
||||||
|
this.logger.info(`get login status left: ${left}`);
|
||||||
|
return { token, left: left };
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this.logger.error('getLoginStatus failed, ', e);
|
this.logger.error('getLoginStatus failed, ', e);
|
||||||
return undefined;
|
return undefined;
|
||||||
|
@ -171,28 +202,13 @@ class Child extends ComChild<Account> {
|
||||||
}
|
}
|
||||||
|
|
||||||
async getSession(token: string) {
|
async getSession(token: string) {
|
||||||
const res = await this.client.post('/session/get', { token });
|
|
||||||
const session: { accessToken: string; refreshToken: string } =
|
|
||||||
res.data.data;
|
|
||||||
if (!session.accessToken || !session.refreshToken) {
|
|
||||||
throw new Error('get session failed');
|
|
||||||
}
|
|
||||||
this.update({
|
this.update({
|
||||||
accessToken: session.accessToken,
|
accessToken: token,
|
||||||
refreshToken: session.refreshToken,
|
|
||||||
});
|
});
|
||||||
|
return token;
|
||||||
}
|
}
|
||||||
|
|
||||||
async refreshToken(refreshToken: string) {
|
|
||||||
const res = await this.client.post(
|
|
||||||
'/session/refresh?&source=USE_SSE_HOOK',
|
|
||||||
{
|
|
||||||
refreshToken,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
const session: { accessToken: string } = res.data;
|
|
||||||
return session.accessToken;
|
|
||||||
}
|
|
||||||
|
|
||||||
use(): void {
|
use(): void {
|
||||||
this.update({
|
this.update({
|
||||||
|
@ -262,20 +278,28 @@ export class Merlin extends Chat {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
if (moment().unix() - child.info.tokenGotTime > 3600) {
|
|
||||||
child.update({
|
|
||||||
accessToken: await child.refreshToken(child.info.refreshToken),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
const res = await child.client.post(
|
const res = await child.client.post(
|
||||||
'/chat/merlin?customJWT=true',
|
'/thread/unified?customJWT=true&version=1.1',
|
||||||
{
|
{
|
||||||
|
action: {
|
||||||
|
message: {
|
||||||
|
attachments: [],
|
||||||
|
content: req.prompt,
|
||||||
|
metadata: {
|
||||||
|
context: ""
|
||||||
|
},
|
||||||
|
parentId: "root",
|
||||||
|
role: "user"
|
||||||
|
},
|
||||||
|
type: "NEW"
|
||||||
|
},
|
||||||
|
activeThreadSnippet: [],
|
||||||
chatId: v4(),
|
chatId: v4(),
|
||||||
context: null,
|
language: "AUTO",
|
||||||
language: 'AUTO',
|
metadata: null,
|
||||||
|
mode: "VANILLA_CHAT",
|
||||||
model: ModelMap[req.model],
|
model: ModelMap[req.model],
|
||||||
query: req.prompt,
|
personaConfig: {}
|
||||||
persona: null,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
headers: {
|
headers: {
|
||||||
|
|
読み込み中…
新しいイシューから参照