From b9c4976291f20530113eda5526b94d18a5de62d2 Mon Sep 17 00:00:00 2001 From: geekgeekrun Date: Sun, 17 Aug 2025 00:00:34 +0800 Subject: [PATCH 1/7] fix: cannot run due to `QueryFailedError: SQLITE_ERROR: near ")": syntax error` - when one of `jobNotMatchStrategy`/`jobNotActiveStrategy`/`expectCityNotMatchStrategy` set to `MarkAsNotSuitOp.MARK_AS_NOT_SUIT_ON_LOCAL` and `chattedJobIds.length === 0`, application will crash --- packages/sqlite-plugin/src/index.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/sqlite-plugin/src/index.ts b/packages/sqlite-plugin/src/index.ts index e4f6959..a3a5e73 100644 --- a/packages/sqlite-plugin/src/index.ts +++ b/packages/sqlite-plugin/src/index.ts @@ -175,6 +175,9 @@ export default class SqlitePlugin { } const last30DayChatStartupRecords = (await getChatStartupRecordsInLastSomeDays(ds, 30)) ?? []; const chattedJobIds = last30DayChatStartupRecords.map(it => it.encryptJobId) + if (chattedJobIds.length === 0) { + return + } const chattedBossIds = ((await getBossIdsByJobIds(ds, chattedJobIds)) ?? []).map(it => it.encryptBossId) for (const id of chattedBossIds) { blockBossNotNewChat.add(id) From 0032a356e590e0eb375f687d4babc8186a3df086 Mon Sep 17 00:00:00 2001 From: geekgeekrun Date: Sun, 17 Aug 2025 00:04:05 +0800 Subject: [PATCH 2/7] =?UTF-8?q?fix:=20reduce=20argument=20getBossIdsByJobI?= =?UTF-8?q?ds=20count=20to=20fix=20`error:=C2=A0Error:=C2=A0SQLITE=5FERROR?= =?UTF-8?q?:=C2=A0Expression=C2=A0tree=C2=A0is=C2=A0too=C2=A0large=C2=A0(m?= =?UTF-8?q?aximum=C2=A0depth=C2=A01000)`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/sqlite-plugin/src/index.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/sqlite-plugin/src/index.ts b/packages/sqlite-plugin/src/index.ts index a3a5e73..b3cf741 100644 --- a/packages/sqlite-plugin/src/index.ts +++ b/packages/sqlite-plugin/src/index.ts @@ -38,6 +38,7 @@ import { MarkAsNotSuitOp, MarkAsNotSuitReason } from "./enums"; import { AddColumnForMarkAsNotSuitLog1746092370665 } from "./migrations/1746092370665-AddColumnForMarkAsNotSuitLog"; import { Init1000000000000 } from "./migrations/1000000000000-Init"; import { AddJobSourceColumnForChatStartupLogAndMarkAsNotSuitLog1752380078526 } from "./migrations/1752380078526-AddJobSourceColumnForChatStartupLogAndMarkAsNotSuitLog"; +const lodashImportPromise = import('lodash-es') export function initDb(dbFilePath) { const { DataSource } = requireTypeorm() @@ -178,7 +179,13 @@ export default class SqlitePlugin { if (chattedJobIds.length === 0) { return } - const chattedBossIds = ((await getBossIdsByJobIds(ds, chattedJobIds)) ?? []).map(it => it.encryptBossId) + const { chunk } = await lodashImportPromise + const chattedJobIdChunks = chunk(chattedJobIds, 200) + const chattedBossIds = []; + for (const chattedJobIdChunk of chattedJobIdChunks) { + const chattedBossIdChunk = ((await getBossIdsByJobIds(ds, chattedJobIdChunk)) ?? []).map(it => it.encryptBossId) + chattedBossIds.push(...chattedBossIdChunk) + } for (const id of chattedBossIds) { blockBossNotNewChat.add(id) } From b821bc500c9e64646e6a0687a0f1fb0d70da5842 Mon Sep 17 00:00:00 2001 From: geekgeekrun Date: Sun, 17 Aug 2025 01:50:51 +0800 Subject: [PATCH 3/7] fix error for cannot find chooseReasonDialogProxy --- .../geek-auto-start-chat-with-boss/index.mjs | 40 ++++++++++++------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/packages/geek-auto-start-chat-with-boss/index.mjs b/packages/geek-auto-start-chat-with-boss/index.mjs index 4324203..cc83382 100644 --- a/packages/geek-auto-start-chat-with-boss/index.mjs +++ b/packages/geek-auto-start-chat-with-boss/index.mjs @@ -251,33 +251,43 @@ async function markJobAsNotSuitInRecommendPage (reasonCode) { await writeStorageFile('job-not-suit-reason-code-to-text-cache.json', reasonCodeToTextMap) await sleepWithRandomDelay(2000) const chooseReasonDialogProxy = await(async() => { - const alls = await page.$$('.zp-dialog-wrap.zp-feedback-dialog.v-transfer-dom') + const alls = await page.$$('.zp-dialog-wrap.zp-feedback-dialog') return alls?.[alls.length - 1] })() let isOptionChosen = false if (chooseReasonDialogProxy) { switch (reasonCode) { case MarkAsNotSuitReason.BOSS_INACTIVE: { - const bossNotActiveOptionProxy = await chooseReasonDialogProxy.$(`.zp-type-item[title="BOSS活跃度低"]`) - if (bossNotActiveOptionProxy) { - await bossNotActiveOptionProxy.click() + const opProxy = (await chooseReasonDialogProxy.$(`.zp-type-item[title="BOSS活跃度低"]`)) + ?? (await chooseReasonDialogProxy.$(`.zp-type-item[title="职位停招/招满"]`)) + ?? (await chooseReasonDialogProxy.$(`.zp-type-item[title="面试过/入职过"]`)) + ?? (await chooseReasonDialogProxy.$(`.zp-type-item[title="重复推荐"]`)) + if (opProxy) { + await opProxy.click() isOptionChosen = true - } else { - const recruitStoppedOptionProxy = await chooseReasonDialogProxy.$(`.zp-type-item[title="职位停招/招满"]`) - if (recruitStoppedOptionProxy) { - await recruitStoppedOptionProxy.click() - isOptionChosen = true - } } break } case MarkAsNotSuitReason.JOB_WORK_EXP_NOT_SUIT: - case MarkAsNotSuitReason.JOB_CITY_NOT_SUIT: - case MarkAsNotSuitReason.JOB_SALARY_NOT_SUIT: { + case MarkAsNotSuitReason.JOB_CITY_NOT_SUIT: { const opProxy = (await chooseReasonDialogProxy.$(`.zp-type-item[title$="城市"]`)) - ?? (await chooseReasonDialogProxy.$(`.zp-type-item[title="同城距离远"]`)) + ?? (await chooseReasonDialogProxy.$(`.zp-type-item[title$="距离远"]`)) ?? (await chooseReasonDialogProxy.$(`.zp-type-item[title="公司不感兴趣"]`)) ?? (await chooseReasonDialogProxy.$(`.zp-type-item[title="面试过/入职过"]`)) + ?? (await chooseReasonDialogProxy.$(`.zp-type-item[title="重复推荐"]`)) + if (opProxy) { + await opProxy.click() + isOptionChosen = true + } + break + } + case MarkAsNotSuitReason.JOB_SALARY_NOT_SUIT: { + const opProxy = (await chooseReasonDialogProxy.$(`xpath///*[contains(@class,'zp-type-item')][contains(@title, "薪资")]`)) + ?? (await chooseReasonDialogProxy.$(`.zp-type-item[title$="城市"]`)) + ?? (await chooseReasonDialogProxy.$(`.zp-type-item[title$="距离远"]`)) + ?? (await chooseReasonDialogProxy.$(`.zp-type-item[title="公司不感兴趣"]`)) + ?? (await chooseReasonDialogProxy.$(`.zp-type-item[title="面试过/入职过"]`)) + ?? (await chooseReasonDialogProxy.$(`.zp-type-item[title="重复推荐"]`)) if (opProxy) { await opProxy.click() isOptionChosen = true @@ -286,7 +296,9 @@ async function markJobAsNotSuitInRecommendPage (reasonCode) { } case MarkAsNotSuitReason.JOB_NOT_SUIT: default: { - const jobNotSuitOptionProxy = (await chooseReasonDialogProxy.$(`.zp-type-item[title$="职位"]`)) ?? (await chooseReasonDialogProxy.$(`.zp-type-item[title="面试过/入职过"]`)) + const jobNotSuitOptionProxy = (await chooseReasonDialogProxy.$(`.zp-type-item[title$="职位"]`)) + ?? (await chooseReasonDialogProxy.$(`.zp-type-item[title="面试过/入职过"]`)) + ?? (await chooseReasonDialogProxy.$(`.zp-type-item[title="重复推荐"]`)) if (jobNotSuitOptionProxy) { await jobNotSuitOptionProxy.click() isOptionChosen = true From 203fbba9a0428ee93984096fb3cbec5c9bbd600e Mon Sep 17 00:00:00 2001 From: geekgeekrun Date: Sun, 17 Aug 2025 01:53:49 +0800 Subject: [PATCH 4/7] ui-v0.9.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 a02b9a0..4b7a5b5 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "geekgeekrun-ui", - "version": "0.9.0", + "version": "0.9.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 e580ffb..fc849c5 100644 --- a/packages/ui/src/common/build-info.json +++ b/packages/ui/src/common/build-info.json @@ -1,7 +1,7 @@ { - "version": "0.9.0", - "buildVersion": 16, - "buildTime": 1752412320912, - "buildHash": "d3e086f32184dd2a36819c0f9697228fa1316ada", + "version": "0.9.1", + "buildVersion": 17, + "buildTime": 1755366828508, + "buildHash": "b821bc500c9e64646e6a0687a0f1fb0d70da5842", "name": "geekgeekrun-ui" } \ No newline at end of file From 42fc66a0f44cc53653b99fa6603ea214df78bd9f Mon Sep 17 00:00:00 2001 From: geekgeekrun Date: Sun, 17 Aug 2025 11:11:15 +0800 Subject: [PATCH 5/7] fix cannot run due to lodash-es is not bundled; fix logic about `set security question tip modal` --- .../geek-auto-start-chat-with-boss/index.mjs | 39 ++++++++++++------- packages/sqlite-plugin/src/index.ts | 1 - packages/ui/package.json | 4 +- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/packages/geek-auto-start-chat-with-boss/index.mjs b/packages/geek-auto-start-chat-with-boss/index.mjs index cc83382..73cc923 100644 --- a/packages/geek-auto-start-chat-with-boss/index.mjs +++ b/packages/geek-auto-start-chat-with-boss/index.mjs @@ -523,6 +523,11 @@ async function toRecommendPage (hooks) { ) { throw new Error("ACCESS_IS_DENIED") } + + await page.waitForFunction(({ recommendJobPageUrl }) => { + return location.href.startsWith(recommendJobPageUrl) && document.readyState === 'complete' + }, undefined, { recommendJobPageUrl }) + hooks.pageLoaded?.call() let userInfoResponse = await userInfoPromise @@ -537,20 +542,6 @@ async function toRecommendPage (hooks) { await storeStorage(page).catch(() => void 0) } - // check set security question tip modal - let setSecurityQuestionTipModelProxy = await page.$('.dialog-wrap.dialog-account-safe') - if ( - setSecurityQuestionTipModelProxy - ) { - await sleep(1000) - setSecurityQuestionTipModelProxy = await page.$('.dialog-wrap.dialog-account-safe') - const closeButtonProxy = await setSecurityQuestionTipModelProxy?.$('.close') - - if (setSecurityQuestionTipModelProxy && closeButtonProxy) { - await closeButtonProxy.click() - } - } - const computedSourceList = [] for (const source of normalizedJobSource) { switch (source.type) { @@ -640,6 +631,26 @@ async function toRecommendPage (hooks) { let currentSourceIndex = 0 afterPageLoad: while (true) { + // check set security question tip modal + let setSecurityQuestionTipModelProxy + try { + setSecurityQuestionTipModelProxy = await page.waitForSelector('.dialog-wrap.dialog-account-safe', { timeout: 3 * 1000 }) + } + catch(err) { + console.log(`cannot find set security question tip modal, just continue`) + } + if ( + setSecurityQuestionTipModelProxy + ) { + await sleep(1000) + setSecurityQuestionTipModelProxy = await page.$('.dialog-wrap.dialog-account-safe') + const closeButtonProxy = await setSecurityQuestionTipModelProxy?.$('.close') + + if (setSecurityQuestionTipModelProxy && closeButtonProxy) { + await closeButtonProxy.click() + } + } + let expectJobList iterateFilterCondition: for ( const filterCondition of combineFiltersWithConstraintsGenerator( diff --git a/packages/sqlite-plugin/src/index.ts b/packages/sqlite-plugin/src/index.ts index b3cf741..3722f87 100644 --- a/packages/sqlite-plugin/src/index.ts +++ b/packages/sqlite-plugin/src/index.ts @@ -1,7 +1,6 @@ import "reflect-metadata"; import { type DataSource } from "typeorm"; import { requireTypeorm } from "./utils/module-loader"; -import fs from 'node:fs' import { BossInfo } from "./entity/BossInfo"; import { BossInfoChangeLog } from "./entity/BossInfoChangeLog"; diff --git a/packages/ui/package.json b/packages/ui/package.json index 4b7a5b5..29b6044 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -38,6 +38,7 @@ "JSONStream": "^1.3.5", "diff": "^7.0.0", "electron-updater": "^6.1.7", + "lodash-es": "^4.17.21", "minimist": "^1.2.8", "mitt": "^3.0.1", "node-machine-id": "^1.1.12", @@ -72,7 +73,6 @@ "eslint-plugin-vue": "^9.20.1", "find-chrome-bin": "^2.0.1", "js-yaml": "^4.1.0", - "lodash-es": "^4.17.21", "normalize.css": "^8.0.1", "prettier": "^3.2.4", "sass": "^1.70.0", @@ -88,4 +88,4 @@ "vue-router": "^4.2.5", "vue-tsc": "^1.8.27" } -} \ No newline at end of file +} From a25b047f99f7b1ac0c8ee55f1e121991e1dd6402 Mon Sep 17 00:00:00 2001 From: geekgeekrun Date: Sun, 17 Aug 2025 11:16:14 +0800 Subject: [PATCH 6/7] =?UTF-8?q?fix=20ci=20error=20`=E2=80=89ERR=5FPNPM=5FO?= =?UTF-8?q?UTDATED=5FLOCKFILE=E2=80=89=20Cannot=20install=20with=20"frozen?= =?UTF-8?q?-lockfile"=20because=20pnpm-lock.yaml=20is=20not=20up=20to=20da?= =?UTF-8?q?te=20with=20packages/ui/package.json`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pnpm-lock.yaml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 26ae2a5..86f5fa2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -129,6 +129,9 @@ importers: electron-updater: specifier: ^6.1.7 version: 6.1.7 + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 minimist: specifier: ^1.2.8 version: 1.2.8 @@ -226,9 +229,6 @@ importers: js-yaml: specifier: ^4.1.0 version: 4.1.0 - lodash-es: - specifier: ^4.17.21 - version: 4.17.21 normalize.css: specifier: ^8.0.1 version: 8.0.1 @@ -4570,7 +4570,6 @@ packages: /lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - dev: true /lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21): resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} From ac19ae3832251b9ae3e00a167eb5e31d804ac677 Mon Sep 17 00:00:00 2001 From: geekgeekrun Date: Sun, 17 Aug 2025 11:16:42 +0800 Subject: [PATCH 7/7] ui-v0.9.2 --- packages/ui/package.json | 4 ++-- packages/ui/src/common/build-info.json | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/ui/package.json b/packages/ui/package.json index 29b6044..0f71b88 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "geekgeekrun-ui", - "version": "0.9.1", + "version": "0.9.2", "description": "Boss 炸弹 - 自动开聊Boss,助力每位打工人求职!", "main": "./out/main/index.js", "author": "geekgeekrun", @@ -88,4 +88,4 @@ "vue-router": "^4.2.5", "vue-tsc": "^1.8.27" } -} +} \ No newline at end of file diff --git a/packages/ui/src/common/build-info.json b/packages/ui/src/common/build-info.json index fc849c5..0a39c6a 100644 --- a/packages/ui/src/common/build-info.json +++ b/packages/ui/src/common/build-info.json @@ -1,7 +1,7 @@ { - "version": "0.9.1", - "buildVersion": 17, - "buildTime": 1755366828508, - "buildHash": "b821bc500c9e64646e6a0687a0f1fb0d70da5842", + "version": "0.9.2", + "buildVersion": 18, + "buildTime": 1755400602067, + "buildHash": "a25b047f99f7b1ac0c8ee55f1e121991e1dd6402", "name": "geekgeekrun-ui" } \ No newline at end of file