diff --git a/packages/sqlite-plugin/src/entity/ChatMessageRecord.ts b/packages/sqlite-plugin/src/entity/ChatMessageRecord.ts new file mode 100644 index 0000000..3f883bf --- /dev/null +++ b/packages/sqlite-plugin/src/entity/ChatMessageRecord.ts @@ -0,0 +1,49 @@ +import { requireTypeorm } from "../utils/module-loader"; +const { Entity, Column, PrimaryGeneratedColumn } = requireTypeorm() + +@Entity() +export class ChatMessageRecord { + @PrimaryGeneratedColumn() + mid: number; + + @Column() + encryptFromUserId: string; + + @Column() + encryptToUserId: string; + + @Column({ + nullable: true + }) + time: Date | null; + + @Column({ + nullable: true + }) + type?: 'text' | 'image' | 'resume'; + + @Column({ + nullable: true + }) + style?: 'sent' | 'receive'; + + @Column({ + nullable: true + }) + text: string; + + @Column({ + nullable: true + }) + imageUrl?: string; + + @Column({ + nullable: true + }) + imageWidth?: number; + + @Column({ + nullable: true + }) + imageHeight?: number; +} diff --git a/packages/sqlite-plugin/src/handlers.ts b/packages/sqlite-plugin/src/handlers.ts index d256ad6..ec000c3 100644 --- a/packages/sqlite-plugin/src/handlers.ts +++ b/packages/sqlite-plugin/src/handlers.ts @@ -9,6 +9,7 @@ import { BossInfoChangeLog } from "./entity/BossInfoChangeLog"; import { CompanyInfoChangeLog } from "./entity/CompanyInfoChangeLog"; import { JobInfoChangeLog } from "./entity/JobInfoChangeLog"; import { MarkAsNotSuitLog } from "./entity/MarkAsNotSuitLog"; +import { ChatMessageRecord } from "./entity/ChatMessageRecord"; function getBossInfoIfIsEqual (savedOne, currentOne) { if (savedOne === currentOne) { @@ -290,3 +291,19 @@ export async function saveMarkAsNotSuitRecord( //#endregion return } + +export async function saveChatMessageRecord( + ds: DataSource, + records: ChatMessageRecord[] +) { + //#region mark-as-not-suit-log + const chatMessageRecordList = records.map(it => { + const o = new ChatMessageRecord() + Object.assign(o, it) + return o + }) + const chatMessageRecordRepository = ds.getRepository(ChatMessageRecord); + await chatMessageRecordRepository.save(chatMessageRecordList); + //#endregion + return +} diff --git a/packages/sqlite-plugin/src/index.ts b/packages/sqlite-plugin/src/index.ts index a58e4c1..1a554e0 100644 --- a/packages/sqlite-plugin/src/index.ts +++ b/packages/sqlite-plugin/src/index.ts @@ -18,6 +18,7 @@ import { VBossLibrary } from "./entity/VBossLibrary"; import { VJobLibrary } from "./entity/VJobLibrary"; import { VCompanyLibrary } from "./entity/VCompanyLibrary" import { VMarkAsNotSuitLog } from "./entity/VMarkAsNotSuitLog" +import { ChatMessageRecord } from './entity/ChatMessageRecord' import sqlite3 from 'sqlite3'; import * as cliHighlight from 'cli-highlight'; @@ -53,6 +54,7 @@ export function initDb(dbFilePath) { VCompanyLibrary, MarkAsNotSuitLog, VMarkAsNotSuitLog, + ChatMessageRecord, ], migrations: [ UpdateChatStartupLogTable1729182577167 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 479748a..301e07c 100644 --- a/packages/ui/src/main/flow/LAUNCH_BOSS_SITE/index.ts +++ b/packages/ui/src/main/flow/LAUNCH_BOSS_SITE/index.ts @@ -9,7 +9,8 @@ import { setDomainLocalStorage } from '@geekgeekrun/utils/puppeteer/local-storag import { saveJobInfoFromRecommendPage, saveChatStartupRecord, - saveMarkAsNotSuitRecord + saveMarkAsNotSuitRecord, + saveChatMessageRecord } from '@geekgeekrun/sqlite-plugin/dist/handlers' import { initDb } from '@geekgeekrun/sqlite-plugin' import { getPublicDbFilePath } from '@geekgeekrun/geek-auto-start-chat-with-boss/runtime-file-utils.mjs' @@ -26,6 +27,7 @@ import * as JSONStream from 'JSONStream' import { ChatStartupFrom } from '@geekgeekrun/sqlite-plugin/dist/entity/ChatStartupLog' import gtag from '../../utils/gtag' import attachListenerForKillSelfOnParentExited from '../../utils/attachListenerForKillSelfOnParentExited' +import { type ChatMessageRecord } from '@geekgeekrun/sqlite-plugin/src/entity/ChatMessageRecord' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) const isRunFromUi = Boolean(process.env.MAIN_BOSSGEEKGO_UI_RUN_MODE) @@ -166,6 +168,49 @@ const attachRequestsListener = async (target: Target) => { chatStartupFrom: ChatStartupFrom.ManuallyFromRecommendList } ) + } else if ( + page.url().startsWith('https://www.zhipin.com/web/geek/chat') && + response.url().startsWith('https://www.zhipin.com/wapi/zpchat/geek/historyMsg') + ) { + const currentUserInfo = await page.evaluate( + 'document.querySelector(".main-wrap").__vue__.$store.state.userInfo' + ) + const request = response.request().url() + + const url = new URL(request) + const encryptBossIdInAddFriendUrl = url.searchParams.get('bossId') + + const bossInfo = await page.evaluate( + 'document.querySelector(".chat-conversation").__vue__.bossInfo$' + ) + if (encryptBossIdInAddFriendUrl !== bossInfo.encryptBossId) { + return + } + const rawChatRecordList = + ( + await page.evaluate( + 'document.querySelector(".message-content .chat-record").__vue__.records$' + ) + )?.filter((msg) => ['received', 'sent'].includes(msg.style)) ?? [] + + 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.style = it.style + mappedItem.type = it.type + mappedItem.time = it.time ? new Date(it.time) : null + mappedItem.text = it.text + if (it.type === 'image') { + mappedItem.imageUrl = it.image?.originImage?.url + mappedItem.imageHeight = it.image?.originImage?.url?.height + mappedItem.imageWidth = it.image?.originImage?.url?.width + } + + return mappedItem + }) + await saveChatMessageRecord(await dbInitPromise, chatRecordList) } })