import { test } from 'node:test'; import assert from 'node:assert/strict'; import { htmlToText, parseKanxueHomeList, parseForumList, parseThread, parseWechat, BASE, } from '../bin/wxsource.mjs'; // 以下片段取自 2026-08 实抓的 bbs.kanxue.com 页面(仅保留关键结构) test('htmlToText 转换段落/代码/图片/实体', () => { const html = '

第一段 vmwrite(x) 结束

int x = 1;

a&b <c>  

'; const t = htmlToText(html); assert.match(t, /第一段 `vmwrite\(x\)` 结束/); assert.match(t, /\[图片\]/); assert.match(t, /int x = 1;/); assert.match(t, /a&b /); }); test('parseKanxueHomeList 首页聚合列表', () => { const html = ` [原创] 我把散装逆向经验压成了一套 Agent 作战系统:r0crawl_skills 全面介绍 [原创]代码虚拟化面对AI时代的冲击即将彻底被击溃`; const items = parseKanxueHomeList(html); assert.equal(items.length, 2); assert.equal(items[0].url, `${BASE}/thread-292402.htm`); assert.match(items[0].title, /r0crawl_skills/); }); test('parseForumList 分类页 xiuno 列表', () => { const html = `
`; const items = parseForumList(html); assert.equal(items.length, 2); assert.equal(items[0].title, '[公告] 2026 KCTF 攻击方规则发布'); assert.equal(items[0].author, '@ninebell'); assert.equal(items[0].url, `${BASE}/thread-292346.htm`); assert.equal(items[1].author, '只会逆一点点'); }); test('parseThread 帖子页标题/作者/正文', () => { const html = ` [原创] 实战帖子标题-软件逆向-看雪安全社区|专业技术交流与安全研究论坛 头像

正文第一段 mov eax, 0xCC

二楼回帖,不应被提取

`; const t = parseThread(html); assert.equal(t.title, '[原创] 实战帖子标题'); assert.equal(t.author, '只会逆一点点'); assert.match(t.body, /正文第一段 `mov eax, 0xCC`/); assert.match(t.body, /\[图片\]/); assert.doesNotMatch(t.body, /二楼回帖/); }); test('parseThread 富文本类型正文(message_rich_type)', () => { const html = ` [原创] TikTok X-Dynosaur 恐龙算法-逆向工程-看雪安全社区

富文本正文 加粗 内容

X-Dynosaur 算法分析

`; const t = parseThread(html); assert.equal(t.title, '[原创] TikTok X-Dynosaur 恐龙算法'); assert.match(t.body, /富文本正文 加粗 内容/); assert.match(t.body, /`X-Dynosaur` 算法分析/); }); test('parseWechat 微信文章 og meta + js_content', () => { const html = `

正文第一句

vmexit 触发

`; const a = parseWechat(html); assert.equal(a.title, '基于VT EPT的无痕断点无痕hook原理及其应用'); assert.equal(a.author, '只会逆一点点'); assert.match(a.body, /正文第一句/); assert.match(a.body, /`vmexit` 触发/); });