From 286b73a28730a344af4bcc6d2e0dc84f7615955e Mon Sep 17 00:00:00 2001 From: wxs Date: Tue, 3 Mar 2026 16:11:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Instagram=20=E7=83=AD=E7=82=B9=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E4=BD=8E=E4=BA=92=E5=8A=A8=E5=86=85=E5=AE=B9=E5=B9=B6?= =?UTF-8?q?=E6=8C=89=E7=82=B9=E8=B5=9E=E6=95=B0=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 适配器过滤 like_count < 100 的低质量内容,按点赞数降序排列 - 后端 dev/start 脚本添加 --env-file=.env 自动加载环境变量 Co-Authored-By: Claude Opus 4.6 --- packages/backend/package.json | 4 ++-- .../src/lib/adapters/instagram.test.ts | 22 ++++++++++++++++++- .../backend/src/lib/adapters/instagram.ts | 6 +++-- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/packages/backend/package.json b/packages/backend/package.json index 042ca4f..675e864 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -4,8 +4,8 @@ "private": true, "type": "module", "scripts": { - "dev": "tsx watch src/index.ts", - "start": "tsx src/index.ts", + "dev": "tsx watch --env-file=.env src/index.ts", + "start": "tsx --env-file=.env src/index.ts", "test": "vitest run", "test:watch": "vitest", "test:coverage": "vitest run --coverage" diff --git a/packages/backend/src/lib/adapters/instagram.test.ts b/packages/backend/src/lib/adapters/instagram.test.ts index 6ca47c1..26a503c 100644 --- a/packages/backend/src/lib/adapters/instagram.test.ts +++ b/packages/backend/src/lib/adapters/instagram.test.ts @@ -58,7 +58,7 @@ describe("InstagramAdapter", () => { code: "SEC001", caption: "Section post", user: { username: "user1" }, - like_count: 1000, + like_count: 5000, }, ], }, @@ -87,6 +87,7 @@ describe("InstagramAdapter", () => { code: "cap-obj", caption: { text: "Caption from object" }, user: { username: "test" }, + like_count: 500, }, ], }); @@ -102,6 +103,7 @@ describe("InstagramAdapter", () => { code: "cap-str", caption: "String caption", user: { username: "test" }, + like_count: 500, }, ], }); @@ -117,6 +119,7 @@ describe("InstagramAdapter", () => { code: "cap-null", caption: null, user: { username: "test" }, + like_count: 500, }, ], }); @@ -132,6 +135,7 @@ describe("InstagramAdapter", () => { code: "thumb-test", thumbnail_url: "https://ig.com/thumb.jpg", user: { username: "test" }, + like_count: 500, }, ], }); @@ -139,6 +143,22 @@ describe("InstagramAdapter", () => { const items = await adapter.fetchTrending(20); expect(items[0].cover_url).toBe("https://ig.com/thumb.jpg"); }); + + it("filters out low-engagement items and sorts by likes", async () => { + mockFetch.mockResolvedValueOnce({ + items: [ + { code: "low", caption: "Low", user: { username: "a" }, like_count: 5 }, + { code: "high", caption: "High", user: { username: "b" }, like_count: 10000 }, + { code: "mid", caption: "Mid", user: { username: "c" }, like_count: 500 }, + { code: "none", caption: "None", user: { username: "d" } }, + ], + }); + + const items = await adapter.fetchTrending(20); + expect(items).toHaveLength(2); + expect(items[0].id).toBe("high"); + expect(items[1].id).toBe("mid"); + }); }); describe("fetchDetail", () => { diff --git a/packages/backend/src/lib/adapters/instagram.ts b/packages/backend/src/lib/adapters/instagram.ts index 7d18675..1ddfac9 100644 --- a/packages/backend/src/lib/adapters/instagram.ts +++ b/packages/backend/src/lib/adapters/instagram.ts @@ -34,10 +34,12 @@ export class InstagramAdapter implements PlatformAdapter { } return items - .slice(0, count) .map((item: unknown, index: number) => this.mapToContentItem(item as Record, index) - ); + ) + .filter((item) => item.like_count != null && item.like_count >= 100) + .sort((a, b) => (b.like_count ?? 0) - (a.like_count ?? 0)) + .slice(0, count); } async fetchDetail(id: string): Promise {