fix(monitor): 抖音的时间戳是秒、小红书是毫秒,不换算会把 2026 年显示成 1970 年
Deploy VitePress site to Pages / build (push) Canceled after 0s
Deploy VitePress site to Pages / Deploy (push) Canceled after 0s

上一个提交把作品发布日期透到界面之后,抖音那一行显示成 1970-01-22。查原始产物:

  小红书 time        = 1790923011000  → 毫秒 → 2026-10-02   ✓
  抖音   create_time = 1790574515     → 秒   → 2026-09-28   ✗(被当毫秒 → 1970-01-22)

抖音给的是**秒**。而且这条路径不只影响新增的发布日期 —— **评论的 create_time 走的是
同一条路**,所以抖音评论的时间一直是错的,只是之前界面上没显示出来,没人发现。

时间单位的换算正是 adapters 该管的事,所以加在那边:

* `PlatformAdapter.time_scale`(小红书 1、抖音 1000)+ `to_ms()`,解析不出来返回 None
  而不是伪造 0。
* ingest 用它换算作品的 published_at 和评论的 create_time。落库统一毫秒,展示层不必
  关心来源。
* 已入库的数据要能自愈:published_at 和评论 create_time 原先都是**只写一次**的,换算
  改对了老数据也修不回来。现在它们会在重采时跟着刷新(昵称早就是这么做的)。

测试 +1:抖音记录落库后 published_at 是 1790574515 * 1000,且年份是 2026 不是 1970。
dy 的 fixture 也改成用真实的秒值(原来写的是毫秒形态,所以测不出这个 bug)。

注意:库里那条抖音记录**仍带着错的值**,要等抖音下一次成功采集才会被修回来 —— 而它
现在正被平台风控挡着(account blocked),见下一条说明。
This commit is contained in:
2026-10-10 16:08:42 +08:00
parent 3486c7f524
commit 1118d466be
3 changed files with 51 additions and 5 deletions
+22 -2
View File
@@ -24,6 +24,7 @@ posted/seen comment split, idempotency, and the silent-cookie-failure signal.
"""
import json
from datetime import date
from pathlib import Path
from typing import Any, Dict, List, Optional
@@ -188,7 +189,9 @@ def _dy_note(aweme_id: str, liked: Any = "10", **extra) -> Dict[str, Any]:
"aweme_type": "0",
"title": f"title-{aweme_id}",
"desc": f"title-{aweme_id}",
"create_time": 1700000000000,
# 抖音给的是**秒**(实测 1790574515 = 2026-09-28),小红书给毫秒。落库统一
# 换算成毫秒,这个 fixture 必须照真实形态写,否则测不出单位问题。
"create_time": 1790574515,
"creator_hash": "hash",
"nickname": "u***r",
"liked_count": liked,
@@ -611,9 +614,26 @@ class TestDouyinIngest:
assert note.note_url == f"https://www.douyin.com/video/{aweme_id}"
assert note.cover == "https://img/cover.jpg"
assert note.source_kind == "0"
assert note.published_at == 1700000000000
# 秒 → 毫秒,换算过才对。
assert note.published_at == 1790574515 * 1000
assert result.notes_fetched == 1
@pytest.mark.asyncio
async def test_timestamps_are_normalised_to_milliseconds(self, db, tmp_path):
"""抖音的时间戳是**秒**,小红书是毫秒 —— 差 1000 倍,必须换算。
不换算的话,2026 年的作品会显示成 1970 年。这是实测踩到的:抖音作品的
「发布日期」列显示成 1970-01-22(1790574515 被当成毫秒就是 21 天后)。
"""
aweme_id = "7525082444551310602"
await self._ingest(db, tmp_path, [_dy_note(aweme_id)])
note = await db.scalar(select(MonitorNote))
assert note.published_at == 1790574515 * 1000
# 落库的是毫秒,展示层才不用关心来源;乘完应该在 2026 年,不是 1970。
assert date.fromtimestamp(note.published_at / 1000).year == 2026
@pytest.mark.asyncio
async def test_the_artifact_directory_is_not_the_platform_id(self, db, tmp_path):
"""目录名与平台 id 不一致,是这套适配里最反直觉的一条。