From 537208b855436d26e6f9f5e396b05360b57cb0b4 Mon Sep 17 00:00:00 2001 From: geekgeekrun Date: Sun, 12 Jan 2025 21:12:06 +0800 Subject: [PATCH 1/5] =?UTF-8?q?when=20find=20a=20unsuitable=20job,=20choos?= =?UTF-8?q?e=20the=20reason=20as=20`.zp-type-item[title$=3D"=E8=81=8C?= =?UTF-8?q?=E4=BD=8D"]`,=20fallback=20to=20`.zp-type-item[title=3D"?= =?UTF-8?q?=E9=9D=A2=E8=AF=95=E8=BF=87/=E5=85=A5=E8=81=8C=E8=BF=87"]`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/geek-auto-start-chat-with-boss/index.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/geek-auto-start-chat-with-boss/index.mjs b/packages/geek-auto-start-chat-with-boss/index.mjs index 545b3b9..79349c3 100644 --- a/packages/geek-auto-start-chat-with-boss/index.mjs +++ b/packages/geek-auto-start-chat-with-boss/index.mjs @@ -146,7 +146,7 @@ async function markJobAsNotSuitInRecommendPage (reasonCode) { } case MarkAsNotSuitReason.JOB_NOT_SUIT: default: { - const jobNotSuitOptionProxy = await chooseReasonDialogProxy.$(`.zp-type-item[title="面试过/入职过"]`) + const jobNotSuitOptionProxy = (await chooseReasonDialogProxy.$(`.zp-type-item[title$="职位"]`)) ?? (await chooseReasonDialogProxy.$(`.zp-type-item[title="面试过/入职过"]`)) if (jobNotSuitOptionProxy) { await jobNotSuitOptionProxy.click() isOptionChosen = true From 876e82bf6d8bc47b92bf69c01a23100065155394 Mon Sep 17 00:00:00 2001 From: geekgeekrun Date: Sun, 12 Jan 2025 21:21:11 +0800 Subject: [PATCH 2/5] ui-v0.3.1 --- packages/ui/package.json | 2 +- packages/ui/src/common/build-info.json | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/ui/package.json b/packages/ui/package.json index 3b80510..13de3d2 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "geekgeekrun-ui", - "version": "0.3.0", + "version": "0.3.1", "description": "Boss 炸弹 - 自动开聊Boss,助力每位打工人求职!", "main": "./out/main/index.js", "author": "geekgeekrun", diff --git a/packages/ui/src/common/build-info.json b/packages/ui/src/common/build-info.json index 5c92fa7..42a808c 100644 --- a/packages/ui/src/common/build-info.json +++ b/packages/ui/src/common/build-info.json @@ -1,7 +1,7 @@ { - "version": "0.3.0", - "buildVersion": 6, - "buildTime": 1735446486022, - "buildHash": "6f8dab0c0550b594de1d23f92f21a5194b0c8b62", + "version": "0.3.1", + "buildVersion": 7, + "buildTime": 1736688071781, + "buildHash": "537208b855436d26e6f9f5e396b05360b57cb0b4", "name": "geekgeekrun-ui" } \ No newline at end of file From 482ea006be25bc7014793c09cc748fae6606e27e Mon Sep 17 00:00:00 2001 From: geekgeekrun Date: Mon, 31 Mar 2025 23:39:50 +0800 Subject: [PATCH 3/5] fix auto reminder cannot work due to chat ui modified --- .../src/main/flow/LAUNCH_BOSS_SITE/index.ts | 28 +++++++++++---- .../flow/READ_NO_REPLY_AUTO_REMINDER/index.ts | 35 +++++++++++-------- 2 files changed, 42 insertions(+), 21 deletions(-) diff --git a/packages/ui/src/main/flow/LAUNCH_BOSS_SITE/index.ts b/packages/ui/src/main/flow/LAUNCH_BOSS_SITE/index.ts index 4e35ebc..19858ae 100644 --- a/packages/ui/src/main/flow/LAUNCH_BOSS_SITE/index.ts +++ b/packages/ui/src/main/flow/LAUNCH_BOSS_SITE/index.ts @@ -181,9 +181,14 @@ const attachRequestsListener = async (target: Target) => { const url = new URL(request) const encryptBossIdInAddFriendUrl = url.searchParams.get('bossId') - const bossInfo: any = await page.evaluate( - 'document.querySelector(".chat-conversation").__vue__.bossInfo$' - ) + const bossInfo = + (await page.evaluate( + 'document.querySelector(".chat-conversation .chat-record")?.__vue__?.boss' + )) ?? null + if (!bossInfo) { + console.warn('cannot find boss info on page.') + return + } const ds = await dbInitPromise // save boss info const bossInfoRepository = ds.getRepository(BossInfo) @@ -206,15 +211,24 @@ const attachRequestsListener = async (target: Target) => { const rawChatRecordList = ( await page.evaluate( - 'document.querySelector(".message-content .chat-record").__vue__.records$' + 'document.querySelector(".message-content .chat-record").__vue__.list$' ) - )?.filter((msg) => ['received', 'sent'].includes(msg.style)) ?? [] + )?.filter((it) => { + return ( + it.status !== 3 && // filter system notification out + it.templateId === 1 && // filter system notification out + ( + (['text', 'sticker', 'image', 'sound', 'comDesc'].includes(it.messageType) && !it.extend?.greetingQuestionAnswer) // include those message, filter out auto ask + || (it.messageType === 'dialog' && [0, 1, 2, 8, 11, 12, 14, 17, 33].includes(it?.dialog?.type)) // include message like resume, phone, map, etc., filter out auto ask + ) + ) + }) ?? [] const chatRecordList = rawChatRecordList.map(it => { const mappedItem = {} as InstanceType mappedItem.mid = it.mid - mappedItem.encryptFromUserId = it.style === 'sent' ? currentUserInfo.encryptUserId : it.style === 'received' ? bossInfo.encryptBossId : '' - mappedItem.encryptToUserId = it.style === 'sent' ? bossInfo.encryptBossId: it.style === 'received' ? currentUserInfo.encryptUserId : '' + mappedItem.encryptFromUserId = it.isSelf ? currentUserInfo.encryptUserId : bossInfo.encryptBossId + mappedItem.encryptToUserId = it.isSelf ? bossInfo.encryptBossId : currentUserInfo.encryptUserId mappedItem.style = it.style mappedItem.type = it.type mappedItem.time = it.time ? new Date(it.time) : null diff --git a/packages/ui/src/main/flow/READ_NO_REPLY_AUTO_REMINDER/index.ts b/packages/ui/src/main/flow/READ_NO_REPLY_AUTO_REMINDER/index.ts index b4f1824..8f70f77 100644 --- a/packages/ui/src/main/flow/READ_NO_REPLY_AUTO_REMINDER/index.ts +++ b/packages/ui/src/main/flow/READ_NO_REPLY_AUTO_REMINDER/index.ts @@ -31,7 +31,7 @@ async function saveCurrentChatRecord(page) { 'document.querySelector(".main-wrap").__vue__.$store.state.userInfo' ) const bossInfo = await page.evaluate( - 'document.querySelector(".chat-conversation").__vue__.bossInfo$' + 'document.querySelector(".chat-conversation .chat-record")?.__vue__?.boss' ) const ds = await dbInitPromise @@ -252,27 +252,34 @@ const mainLoop = async () => { }) } await sleepWithRandomDelay(1500) - const bossInfo = await pageMapByName.boss?.evaluate(() => { - return document.querySelector('.chat-conversation')?.__vue__['bossInfo$'] - }) + const bossInfo = await pageMapByName.boss?.evaluate( + 'document.querySelector(".chat-conversation .chat-record")?.__vue__?.boss' + ) const historyMessageList = ( await pageMapByName.boss?.evaluate(() => { - return ( - document.querySelector('.main-wrap .chat-conversation .chat-record')?.__vue__ - ?.records$ ?? [] - ) + return document.querySelector('.message-content .chat-record')?.__vue__?.list$ ?? [] }) - )?.filter((msg) => ['received', 'sent'].includes(msg.style)) ?? [] + )?.filter((it) => { + return ( + it.status !== 3 && // filter system notification out + it.templateId === 1 && // filter system notification out + ((['text', 'sticker', 'image', 'sound', 'comDesc'].includes(it.messageType) && + !it.extend?.greetingQuestionAnswer) || // include those message, filter out auto ask + (it.messageType === 'dialog' && + [0, 1, 2, 8, 11, 12, 14, 17, 33].includes(it?.dialog?.type))) // include message like resume, phone, map, etc., filter out auto ask + ) + }) ?? [] - const lastGeekMessageSendTime = - historyMessageList.findLast((it) => it.style === 'sent')?.time ?? 0 + const lastGeekMessageSendTime = historyMessageList.findLast((it) => it.isSelf)?.time ?? 0 if ( - historyMessageList[historyMessageList.length - 1].style === 'sent' && + historyMessageList[historyMessageList.length - 1].isSelf && historyMessageList[historyMessageList.length - 1].status === MsgStatus.HAS_READ && - (!bossInfo.bothTalked || - !historyMessageList.filter((it) => it.style === 'received').length) && + ((bossInfo && !bossInfo.bothTalked) || + !historyMessageList.filter( + (it) => !it.isSelf // not sent by me + ).length) && // don't disturb too much Date.now() - lastGeekMessageSendTime >= (throttleIntervalMinutes + 4 * Math.random()) * 60 * 1000 From acd82277408db17857de36b99f1fdbdd7e90068f Mon Sep 17 00:00:00 2001 From: geekgeekrun Date: Mon, 31 Mar 2025 23:40:47 +0800 Subject: [PATCH 4/5] ui-v0.3.2 --- packages/ui/package.json | 2 +- packages/ui/src/common/build-info.json | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/ui/package.json b/packages/ui/package.json index 13de3d2..ed4cb89 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "geekgeekrun-ui", - "version": "0.3.1", + "version": "0.3.2", "description": "Boss 炸弹 - 自动开聊Boss,助力每位打工人求职!", "main": "./out/main/index.js", "author": "geekgeekrun", diff --git a/packages/ui/src/common/build-info.json b/packages/ui/src/common/build-info.json index 42a808c..30172ad 100644 --- a/packages/ui/src/common/build-info.json +++ b/packages/ui/src/common/build-info.json @@ -1,7 +1,7 @@ { - "version": "0.3.1", - "buildVersion": 7, - "buildTime": 1736688071781, - "buildHash": "537208b855436d26e6f9f5e396b05360b57cb0b4", + "version": "0.3.2", + "buildVersion": 8, + "buildTime": 1743435647129, + "buildHash": "482ea006be25bc7014793c09cc748fae6606e27e", "name": "geekgeekrun-ui" } \ No newline at end of file From 7ee8baa3116b3c9f5f6ae0d4b848be8a9fc03b47 Mon Sep 17 00:00:00 2001 From: geekgeekrun Date: Sat, 5 Apr 2025 03:41:52 +0800 Subject: [PATCH 5/5] extract messageForSaveFilter --- packages/ui/src/common/utils/chat-list.ts | 9 +++++++++ packages/ui/src/main/flow/LAUNCH_BOSS_SITE/index.ts | 12 ++---------- .../main/flow/READ_NO_REPLY_AUTO_REMINDER/index.ts | 12 ++---------- 3 files changed, 13 insertions(+), 20 deletions(-) create mode 100644 packages/ui/src/common/utils/chat-list.ts diff --git a/packages/ui/src/common/utils/chat-list.ts b/packages/ui/src/common/utils/chat-list.ts new file mode 100644 index 0000000..4691af3 --- /dev/null +++ b/packages/ui/src/common/utils/chat-list.ts @@ -0,0 +1,9 @@ +export function messageForSaveFilter(it) { + return ( + it.status !== 3 && // filter system notification out + it.templateId === 1 && // filter system notification out + ((['text', 'sticker', 'image', 'sound', 'comDesc'].includes(it.messageType) && + !it.extend?.greetingQuestionAnswer) || // include those message, filter out auto ask + (it.messageType === 'dialog' && [0, 1, 2, 8, 11, 12, 14, 17, 33].includes(it?.dialog?.type))) // include message like resume, phone, map, etc., filter out auto ask + ) +} diff --git a/packages/ui/src/main/flow/LAUNCH_BOSS_SITE/index.ts b/packages/ui/src/main/flow/LAUNCH_BOSS_SITE/index.ts index 19858ae..ff97e1c 100644 --- a/packages/ui/src/main/flow/LAUNCH_BOSS_SITE/index.ts +++ b/packages/ui/src/main/flow/LAUNCH_BOSS_SITE/index.ts @@ -29,6 +29,7 @@ import gtag from '../../utils/gtag' import attachListenerForKillSelfOnParentExited from '../../utils/attachListenerForKillSelfOnParentExited' import { type ChatMessageRecord } from '@geekgeekrun/sqlite-plugin/src/entity/ChatMessageRecord' import { BossInfo } from '@geekgeekrun/sqlite-plugin/dist/entity/BossInfo' +import { messageForSaveFilter } from '../../../common/utils/chat-list' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) const isRunFromUi = Boolean(process.env.MAIN_BOSSGEEKGO_UI_RUN_MODE) @@ -213,16 +214,7 @@ const attachRequestsListener = async (target: Target) => { await page.evaluate( 'document.querySelector(".message-content .chat-record").__vue__.list$' ) - )?.filter((it) => { - return ( - it.status !== 3 && // filter system notification out - it.templateId === 1 && // filter system notification out - ( - (['text', 'sticker', 'image', 'sound', 'comDesc'].includes(it.messageType) && !it.extend?.greetingQuestionAnswer) // include those message, filter out auto ask - || (it.messageType === 'dialog' && [0, 1, 2, 8, 11, 12, 14, 17, 33].includes(it?.dialog?.type)) // include message like resume, phone, map, etc., filter out auto ask - ) - ) - }) ?? [] + )?.filter(messageForSaveFilter) ?? [] const chatRecordList = rawChatRecordList.map(it => { const mappedItem = {} as InstanceType diff --git a/packages/ui/src/main/flow/READ_NO_REPLY_AUTO_REMINDER/index.ts b/packages/ui/src/main/flow/READ_NO_REPLY_AUTO_REMINDER/index.ts index 8f70f77..063c76a 100644 --- a/packages/ui/src/main/flow/READ_NO_REPLY_AUTO_REMINDER/index.ts +++ b/packages/ui/src/main/flow/READ_NO_REPLY_AUTO_REMINDER/index.ts @@ -16,6 +16,7 @@ import { writeStorageFile } from '@geekgeekrun/geek-auto-start-chat-with-boss/ru import * as fs from 'fs' import { pipeWriteRegardlessError } from '../utils/pipe' import { BossInfo } from '@geekgeekrun/sqlite-plugin/dist/entity/BossInfo' +import { messageForSaveFilter } from '../../../common/utils/chat-list' const throttleIntervalMinutes = readConfigFile('boss.json').autoReminder?.throttleIntervalMinutes ?? 10 @@ -261,16 +262,7 @@ const mainLoop = async () => { await pageMapByName.boss?.evaluate(() => { return document.querySelector('.message-content .chat-record')?.__vue__?.list$ ?? [] }) - )?.filter((it) => { - return ( - it.status !== 3 && // filter system notification out - it.templateId === 1 && // filter system notification out - ((['text', 'sticker', 'image', 'sound', 'comDesc'].includes(it.messageType) && - !it.extend?.greetingQuestionAnswer) || // include those message, filter out auto ask - (it.messageType === 'dialog' && - [0, 1, 2, 8, 11, 12, 14, 17, 33].includes(it?.dialog?.type))) // include message like resume, phone, map, etc., filter out auto ask - ) - }) ?? [] + )?.filter(messageForSaveFilter) ?? [] const lastGeekMessageSendTime = historyMessageList.findLast((it) => it.isSelf)?.time ?? 0 if (