fix(export_sns): _load_comments 过滤已撤回的点赞/评论 (#120)

微信对撤回的点赞/评论不硬删, 只在 SnsMessage_tmp3 行上打 del_status 标记. 老 _load_comments 直接 SELECT 不带任何 WHERE, 结果导出的 likes/comments 里混着撤回行 — 等于 "对方撤回的赞还能在本地导出里看到", 违反用户预期.

修复: SQL 加 WHERE COALESCE(del_status, 0) = 0
- COALESCE 兜底: 老 schema NULL 视作 0 (保留)
- WHERE 而非 Python 端过滤: 大 db 少传 row
- 函数签名/返回结构不变
- 缺列时仍走现有 try/except 路径, 返回 {} 不崩

测试: LoadCommentsTests 3 case (撤回过滤 / NULL 保留 / 缺列兜底), 全合成 sqlite 无 PII. baseline 17 → 20 全过.

承接 #119 的 SNS 导出可靠性线: #119 修 "老 XML 让整行帖子丢失", 本 PR 修 "互动里混入已撤回 row".
This commit is contained in:
Belugary
2026-05-25 21:23:07 +08:00
committed by GitHub
parent 7ab90dcd20
commit 5208f6f517
2 changed files with 117 additions and 2 deletions

View File

@@ -601,13 +601,19 @@ def _parse_timeline_xml(content_xml):
def _load_comments(conn):
"""加载 SnsMessage_tmp3 评论/点赞,按 feed_id 分组"""
"""加载 SnsMessage_tmp3 评论/点赞,按 feed_id 分组
`del_status != 0` 表示对方撤回该互动 —— 微信本地不真删,只设删除标记,
不过滤会把已撤回的点赞 / 评论也导出。COALESCE 兜底老 schema 缺列时
`NULL` 视作 0。
"""
comments = {}
try:
rows = conn.execute(
"SELECT feed_id, create_time, type, from_username, from_nickname,"
" to_username, to_nickname, content"
" FROM SnsMessage_tmp3 ORDER BY create_time"
" FROM SnsMessage_tmp3 WHERE COALESCE(del_status, 0) = 0"
" ORDER BY create_time"
).fetchall()
for feed_id, ctime, ctype, from_u, from_n, to_u, to_n, content in rows:
if feed_id not in comments: