feat(monitor): 组头上加一个跳到博主主页的按钮
Deploy VitePress site to Pages / build (push) Canceled after 0s
Deploy VitePress site to Pages / Deploy (push) Canceled after 0s

`creator_hash` 是单向的,拼不出主页地址 —— 所以这个 id 必须在采集时单独存下来。
抖音的资料接口本来就返回 sec_uid,只是之前没落库。

* `monitor_creator_stat` 加 `creator_id` 列(老数据默认空,下一次采集补上);
* 链接在 `adapters.creator_url()` 里拼,**空串是有意义的返回值**:平台不认识、
  或者没拿到 id,就返回空,界面据此不画按钮 —— 画一个点开 404 的按钮比不画糟;
* 没有作品的博主照样有链接:他恰恰是你想点进去看的那个人。

已知缺口:小红书那条路(爬虫子进程)根本不落创作者资料,所以那边没有链接。
This commit is contained in:
2026-10-11 08:52:51 +08:00
parent 65fc16ddc9
commit 44277600e4
10 changed files with 172 additions and 0 deletions
+25
View File
@@ -107,6 +107,17 @@ class PlatformAdapter:
人能直接点开看的那一个。"""
return f"{self.web_base}{self.note_path}/{note_id}"
def creator_url(self, creator_id: str) -> str:
"""博主主页的可点击链接。
``creator_id`` 是**平台上的那个主页 id**(抖音是 sec_uid),不是 ``creator_hash``
—— 哈希是单向的,拼不出地址来。拿不到 id 的地方(小红书那条路根本不落创作者
资料)就返回空串,界面上不画按钮,而不是给一个点开 404 的链接。
"""
if not creator_id:
return ""
return f"{self.web_base}{self.creator_path}/{creator_id}"
def note_field(self, record: Dict[str, Any], name: str) -> Any:
"""按规范名读作品记录里的原始值(没有就是 None)。"""
return record.get(self.note_fields.get(name, name))
@@ -240,6 +251,20 @@ def has_adapter(platform: str) -> bool:
return platform in ADAPTERS
def creator_url(platform: str, creator_id: str) -> str:
"""博主主页链接,**空串是有意义的返回值**。
平台不认识、或者没拿到主页 id,就返回空串 —— 界面据此不画那个按钮。给一个点开
404 的链接,比不画按钮糟得多。
单独开这个模块级函数(而不是让调用方自己 ``adapter(...)`` 包一层 try),是为了让
「哪些情况该空着」只有一处判断。
"""
if not creator_id or not has_adapter(platform):
return ""
return adapter(platform).creator_url(creator_id)
def artifact_dir(platform: str) -> str:
"""该平台的爬虫会把 jsonl 落在哪个子目录下。