diff --git a/dist-release/content/index.js b/dist-release/content/index.js index 6d655e1..b826c8b 100644 --- a/dist-release/content/index.js +++ b/dist-release/content/index.js @@ -396,7 +396,8 @@ return { authors: options.records.map((record) => ({ authorId: record.authorId, - authorName: record.authorName + authorName: record.authorName, + ...record.coreUserId ? { authorUid: record.coreUserId } : {} })), batchName, createdAt: options.createdAt, @@ -442,6 +443,7 @@ return { authorId: readString(readMarketFieldValue(row, attributeDatas, "star_id")) ?? readString(readMarketFieldValue(row, attributeDatas, "id")) ?? "", authorName: readString(readMarketFieldValue(row, attributeDatas, "nickname")) ?? readString(readMarketFieldValue(row, attributeDatas, "nick_name")) ?? "", + coreUserId: readString(readMarketFieldValue(row, attributeDatas, "core_user_id")) ?? void 0, exportFields: buildMarketExportFieldFallbacks(row, attributeDatas), hasDirectRatesSource: true, location: readMarketLocation(row, attributeDatas), @@ -1737,6 +1739,7 @@ return { authorId: readString2(record.authorId) ?? "", authorName: readString2(record.authorName) ?? "", + coreUserId: readString2(record.coreUserId) ?? void 0, exportFields: readSerializedExportFields(record), hasDirectRatesSource: Boolean(singleVideoAfterSearchRate), location: readString2(record.location) ?? void 0, @@ -1959,6 +1962,7 @@ return { authorId: preferredRow.authorId || baseRow.authorId, authorName: preferredRow.authorName || baseRow.authorName, + coreUserId: mergeNonEmptyString(baseRow.coreUserId, preferredRow.coreUserId), exportFields: mergeExportFieldMaps(baseRow.exportFields, preferredRow.exportFields), hasDirectRatesSource: preferredRow.hasDirectRatesSource || baseRow.hasDirectRatesSource, location: mergeNonEmptyString(baseRow.location, preferredRow.location), @@ -2431,6 +2435,7 @@ ...existingRecord, ...incomingRecord, authorName: mergeStringValue(existingRecord.authorName, incomingRecord.authorName) ?? "", + coreUserId: mergeStringValue(existingRecord.coreUserId, incomingRecord.coreUserId), exportFields: mergeFieldMap( existingRecord.exportFields, incomingRecord.exportFields @@ -3218,6 +3223,7 @@ ...existingRecord, ...incomingRecord, authorName: mergeStringValue2(existingRecord.authorName, incomingRecord.authorName) ?? "", + coreUserId: mergeStringValue2(existingRecord.coreUserId, incomingRecord.coreUserId), exportFields: mergeFieldMap2( existingRecord.exportFields, incomingRecord.exportFields @@ -3308,6 +3314,10 @@ const existingRecord = records.get(row.authorId); if (existingRecord) { existingRecord.authorName = mergeStringValue3(existingRecord.authorName, row.authorName) ?? existingRecord.authorName; + existingRecord.coreUserId = mergeStringValue3( + existingRecord.coreUserId, + row.coreUserId + ); existingRecord.location = mergeStringValue3( existingRecord.location, row.location @@ -3925,6 +3935,10 @@ function toMarketRecord(rowSnapshot) { const existingRecord = resultStore.getRecord(rowSnapshot.authorId); const authorName = mergeStringValue4(existingRecord?.authorName, rowSnapshot.authorName) ?? ""; + const coreUserId = mergeStringValue4( + existingRecord?.coreUserId, + rowSnapshot.coreUserId + ); const location2 = mergeStringValue4(existingRecord?.location, rowSnapshot.location); const price21To60s = mergeStringValue4( existingRecord?.price21To60s, @@ -3939,6 +3953,7 @@ rowSnapshot.backendMetrics ), backendMetricsStatus: existingRecord?.backendMetricsStatus ?? "idle", + coreUserId, exportFields: withExportFieldFallbacks( mergeFieldMap4(existingRecord?.exportFields, rowSnapshot.exportFields), { diff --git a/dist-release/content/market-page-bridge.js b/dist-release/content/market-page-bridge.js index f09d29c..f8799fe 100644 --- a/dist-release/content/market-page-bridge.js +++ b/dist-release/content/market-page-bridge.js @@ -58,6 +58,7 @@ return { authorId: readString(readMarketFieldValue(row, attributeDatas, "star_id")) ?? readString(readMarketFieldValue(row, attributeDatas, "id")) ?? "", authorName: readString(readMarketFieldValue(row, attributeDatas, "nickname")) ?? readString(readMarketFieldValue(row, attributeDatas, "nick_name")) ?? "", + coreUserId: readString(readMarketFieldValue(row, attributeDatas, "core_user_id")) ?? void 0, exportFields: buildMarketExportFieldFallbacks(row, attributeDatas), hasDirectRatesSource: true, location: readMarketLocation(row, attributeDatas), @@ -504,6 +505,7 @@ return { authorId: readString2(row.star_id) ?? readString2(attributeDatas.id) ?? "", authorName: readString2(attributeDatas.nickname) ?? readString2(row.nick_name) ?? "", + coreUserId: readString2(attributeDatas.core_user_id) ?? void 0, singleVideoAfterSearchRate }; }).filter((row) => Boolean(row.authorId || row.authorName)); diff --git a/src/content/market/batch-payload.ts b/src/content/market/batch-payload.ts index a6268c6..f184a8b 100644 --- a/src/content/market/batch-payload.ts +++ b/src/content/market/batch-payload.ts @@ -5,6 +5,7 @@ export interface BatchPayload { authors: Array<{ authorId: string; authorName: string; + authorUid?: string; }>; batchName: string; createdAt: string; @@ -37,7 +38,8 @@ export function createBatchPayload(options: { return { authors: options.records.map((record) => ({ authorId: record.authorId, - authorName: record.authorName + authorName: record.authorName, + ...(record.coreUserId ? { authorUid: record.coreUserId } : {}) })), batchName, createdAt: options.createdAt, diff --git a/src/content/market/dom-sync.ts b/src/content/market/dom-sync.ts index cd7c855..6e0f176 100644 --- a/src/content/market/dom-sync.ts +++ b/src/content/market/dom-sync.ts @@ -70,6 +70,7 @@ type RowOrderTarget = { type MarketDataRow = { authorId: string; authorName: string; + coreUserId?: string; exportFields?: Record; hasDirectRatesSource: boolean; location?: string; @@ -1341,6 +1342,7 @@ function readSerializedMarketRows( return { authorId: readString(record.authorId) ?? "", authorName: readString(record.authorName) ?? "", + coreUserId: readString(record.coreUserId) ?? undefined, exportFields: readSerializedExportFields(record), hasDirectRatesSource: Boolean(singleVideoAfterSearchRate), location: readString(record.location) ?? undefined, @@ -1662,6 +1664,7 @@ function mergeMarketDataRows( return { authorId: preferredRow.authorId || baseRow.authorId, authorName: preferredRow.authorName || baseRow.authorName, + coreUserId: mergeNonEmptyString(baseRow.coreUserId, preferredRow.coreUserId), exportFields: mergeExportFieldMaps(baseRow.exportFields, preferredRow.exportFields), hasDirectRatesSource: preferredRow.hasDirectRatesSource || baseRow.hasDirectRatesSource, diff --git a/src/content/market/export-range-controller.ts b/src/content/market/export-range-controller.ts index 9221399..abf0e0b 100644 --- a/src/content/market/export-range-controller.ts +++ b/src/content/market/export-range-controller.ts @@ -222,6 +222,7 @@ function mergeMarketRecord( ...existingRecord, ...incomingRecord, authorName: mergeStringValue(existingRecord.authorName, incomingRecord.authorName) ?? "", + coreUserId: mergeStringValue(existingRecord.coreUserId, incomingRecord.coreUserId), exportFields: mergeFieldMap( existingRecord.exportFields, incomingRecord.exportFields diff --git a/src/content/market/index.ts b/src/content/market/index.ts index cbb0340..9ef4d49 100644 --- a/src/content/market/index.ts +++ b/src/content/market/index.ts @@ -707,6 +707,10 @@ export function createMarketController(options: CreateMarketControllerOptions) { const existingRecord = resultStore.getRecord(rowSnapshot.authorId); const authorName = mergeStringValue(existingRecord?.authorName, rowSnapshot.authorName) ?? ""; + const coreUserId = mergeStringValue( + existingRecord?.coreUserId, + rowSnapshot.coreUserId + ); const location = mergeStringValue(existingRecord?.location, rowSnapshot.location); const price21To60s = mergeStringValue( existingRecord?.price21To60s, @@ -721,6 +725,7 @@ export function createMarketController(options: CreateMarketControllerOptions) { rowSnapshot.backendMetrics ), backendMetricsStatus: existingRecord?.backendMetricsStatus ?? "idle", + coreUserId, exportFields: withExportFieldFallbacks( mergeFieldMap(existingRecord?.exportFields, rowSnapshot.exportFields), { diff --git a/src/content/market/market-list-row.ts b/src/content/market/market-list-row.ts index 6713e73..468ac6f 100644 --- a/src/content/market/market-list-row.ts +++ b/src/content/market/market-list-row.ts @@ -57,6 +57,9 @@ export function mapMarketListRow( readString(readMarketFieldValue(row, attributeDatas, "nickname")) ?? readString(readMarketFieldValue(row, attributeDatas, "nick_name")) ?? "", + coreUserId: + readString(readMarketFieldValue(row, attributeDatas, "core_user_id")) ?? + undefined, exportFields: buildMarketExportFieldFallbacks(row, attributeDatas), hasDirectRatesSource: true, location: readMarketLocation(row, attributeDatas), diff --git a/src/content/market/page-bridge.ts b/src/content/market/page-bridge.ts index b8495ce..bfbd073 100644 --- a/src/content/market/page-bridge.ts +++ b/src/content/market/page-bridge.ts @@ -205,6 +205,7 @@ function readSerializedMarketRows() { readString(row.star_id) ?? readString(attributeDatas.id) ?? "", authorName: readString(attributeDatas.nickname) ?? readString(row.nick_name) ?? "", + coreUserId: readString(attributeDatas.core_user_id) ?? undefined, singleVideoAfterSearchRate }; }) diff --git a/src/content/market/result-store.ts b/src/content/market/result-store.ts index dcb7fc4..de7829f 100644 --- a/src/content/market/result-store.ts +++ b/src/content/market/result-store.ts @@ -61,6 +61,10 @@ export function createMarketResultStore() { existingRecord.authorName = mergeStringValue(existingRecord.authorName, row.authorName) ?? existingRecord.authorName; + existingRecord.coreUserId = mergeStringValue( + existingRecord.coreUserId, + row.coreUserId + ); existingRecord.location = mergeStringValue( existingRecord.location, row.location diff --git a/src/content/market/silent-export-controller.ts b/src/content/market/silent-export-controller.ts index 76480ea..526584e 100644 --- a/src/content/market/silent-export-controller.ts +++ b/src/content/market/silent-export-controller.ts @@ -350,6 +350,7 @@ function mergeMarketRecord( ...existingRecord, ...incomingRecord, authorName: mergeStringValue(existingRecord.authorName, incomingRecord.authorName) ?? "", + coreUserId: mergeStringValue(existingRecord.coreUserId, incomingRecord.coreUserId), exportFields: mergeFieldMap( existingRecord.exportFields, incomingRecord.exportFields diff --git a/src/content/market/types.ts b/src/content/market/types.ts index f496f37..0f20524 100644 --- a/src/content/market/types.ts +++ b/src/content/market/types.ts @@ -22,6 +22,7 @@ export interface MarketRowSnapshot { authorId: string; authorName: string; backendMetrics?: BackendMetrics; + coreUserId?: string; exportFields?: Record; hasDirectRatesSource?: boolean; location?: string; diff --git a/tests/batch-payload.test.ts b/tests/batch-payload.test.ts index 22ab26b..5a652cc 100644 --- a/tests/batch-payload.test.ts +++ b/tests/batch-payload.test.ts @@ -16,14 +16,19 @@ describe("batch-payload", () => { batchName: "618达人筛选第一批", createdAt: "2026-04-22T12:30:00.000Z", records: [ - { authorId: "111", authorName: "达人A", status: "success" }, + { + authorId: "111", + authorName: "达人A", + coreUserId: "core-111", + status: "success" + }, { authorId: "222", authorName: "达人B", status: "success" } ] }); expect(payload).toEqual({ authors: [ - { authorId: "111", authorName: "达人A" }, + { authorId: "111", authorName: "达人A", authorUid: "core-111" }, { authorId: "222", authorName: "达人B" } ], batchName: "618达人筛选第一批", diff --git a/tests/market-page-bridge.test.ts b/tests/market-page-bridge.test.ts index 49d5237..e901e6e 100644 --- a/tests/market-page-bridge.test.ts +++ b/tests/market-page-bridge.test.ts @@ -126,4 +126,42 @@ describe("market-page-bridge", () => { }) ); }); + + test("serializes core user ids from the live market list", async () => { + const marketRoot = document.querySelector(".base-author-list") as HTMLElement & { + __vue__?: { + _setupState?: Record; + }; + }; + marketRoot.__vue__ = { + _setupState: { + marketState: { + marketList: [ + { + attribute_datas: { + avg_search_after_view_rate_30d: "0.1234", + core_user_id: "core-111", + nickname: "搜索达人" + }, + star_id: "search-1" + } + ] + } + } + }; + + await import("../src/content/market/page-bridge"); + + expect( + JSON.parse( + document.documentElement.getAttribute("data-sces-market-rows") ?? "[]" + ) + ).toEqual([ + expect.objectContaining({ + authorId: "search-1", + authorName: "搜索达人", + coreUserId: "core-111" + }) + ]); + }); }); diff --git a/tests/silent-export-controller.test.ts b/tests/silent-export-controller.test.ts index c6e9655..bef6b75 100644 --- a/tests/silent-export-controller.test.ts +++ b/tests/silent-export-controller.test.ts @@ -50,6 +50,7 @@ describe("silent-export-controller", () => { authors: [ { attribute_datas: { + core_user_id: `core-${pageNo}`, nickname: `达人${pageNo}`, price_20_60: pageNo * 1000 }, @@ -93,6 +94,10 @@ describe("silent-export-controller", () => { } ]); expect(records?.map((record) => record.authorId)).toEqual(["2", "3"]); + expect(records?.map((record) => record.coreUserId)).toEqual([ + "core-2", + "core-3" + ]); }); test("replays paged exports when the page number is nested inside the request body", async () => {