diff --git a/model/merlin/index.ts b/model/merlin/index.ts index 2034e2a..2c65747 100644 --- a/model/merlin/index.ts +++ b/model/merlin/index.ts @@ -35,7 +35,6 @@ interface Account extends ComInfo { left: number; useOutTime: number; accessToken: string; - refreshToken: string; tokenGotTime: number; } class Child extends ComChild { @@ -45,7 +44,7 @@ class Child extends ComChild { super(label, info, options); this.client = CreateAxiosProxy( { - baseURL: 'https://merlin-uam-yak3s7dv3a-ue.a.run.app', + baseURL: 'https://uam.getmerlin.in', }, false, ); @@ -89,7 +88,15 @@ class Child extends ComChild { await page.keyboard.type(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()) { let verifyUrl = v.content.match(/href=["'](.*?)["']/i)?.[1] || ''; if (!verifyUrl) { @@ -140,17 +147,41 @@ class Child extends ComChild { async getLoginStatus(page: Page) { try { - page.reload(); + page.goto("https://www.getmerlin.in/zh-CN/chat"); const req = await page.waitForResponse( (req) => - req.url().indexOf('status') > -1 && + req.url().indexOf('getAstroProfiles') > -1 && req.request().method().toUpperCase() === 'GET', ); - const url = new URLSearchParams(req.url().split('?')[1]); - const token = url.get('firebaseToken'); - const status: { data: { user: { used: number; limit: number } } } = - await req.json(); - return { token, left: status.data.user.limit - status.data.user.used }; + function removeRepeats(num: number): number { + const str = num.toString(); + + if (str.length <= 2) { + 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) { this.logger.error('getLoginStatus failed, ', e); return undefined; @@ -171,28 +202,13 @@ class Child extends ComChild { } 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({ - accessToken: session.accessToken, - refreshToken: session.refreshToken, + accessToken: token, + }); + 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 { this.update({ @@ -262,20 +278,28 @@ export class Merlin extends Chat { return; } try { - if (moment().unix() - child.info.tokenGotTime > 3600) { - child.update({ - accessToken: await child.refreshToken(child.info.refreshToken), - }); - } 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(), - context: null, - language: 'AUTO', + language: "AUTO", + metadata: null, + mode: "VANILLA_CHAT", model: ModelMap[req.model], - query: req.prompt, - persona: null, + personaConfig: {} }, { headers: {