import sys import unittest from pathlib import Path ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(ROOT / "src")) from wechat_decrypt_tool.chat_helpers import _parse_app_message class TestParseAppMessage(unittest.TestCase): def test_mini_program_type_33_parses_as_link(self): # 小程序分享是 appmsg type=33/36。部分 payload 会在 内嵌一个 0, # 并且出现在外层 33 之前,因此解析必须避免被嵌套 误导。 raw_text = ( "" "锦城苑房源详情分享给你,点击查看哦~" "" "" "0" "" "" "" "33" "" "https://example.com/thumb.jpg" "" "" ) parsed = _parse_app_message(raw_text) self.assertEqual(parsed.get("renderType"), "link") self.assertEqual(parsed.get("linkType"), "mini_program") self.assertEqual(parsed.get("title"), "锦城苑房源详情分享给你,点击查看哦~") self.assertEqual(parsed.get("from"), "成都购房通") self.assertEqual(parsed.get("fromUsername"), "gh_xxx@app") self.assertEqual(parsed.get("thumbUrl"), "https://example.com/thumb.jpg") def test_quote_type_57_nested_refermsg_uses_inner_title(self): raw_text = ( '' '一松一紧57' '00' '' '0' '' '' '571173057991425172913' '44372432598@chatroom44372432598@chatroom' '' '那里紧?哪里张?' '5700' '' '0' '' ']]>' '' ) parsed = _parse_app_message(raw_text) self.assertEqual(parsed.get("renderType"), "quote") self.assertEqual(parsed.get("content"), "一松一紧") self.assertEqual(parsed.get("quoteType"), "57") self.assertEqual(parsed.get("quoteContent"), "那里紧?哪里张?") def test_quote_type_57_plain_text_refermsg_keeps_text(self): raw_text = ( '' '回复57' '57' '' ) parsed = _parse_app_message(raw_text) self.assertEqual(parsed.get("renderType"), "quote") self.assertEqual(parsed.get("quoteContent"), "普通文本引用") def test_quote_type_49_nested_xml_refermsg_uses_inner_title(self): raw_text = ( '' '这种傻逼公众号怎么还在看57' '49' '' '为自己的美丽漂亮善良知性发声😊' '5https://mp.weixin.qq.com/s/example' 'https://mmbiz.qpic.cn/some-thumb.jpg' ']]>' ) parsed = _parse_app_message(raw_text) self.assertEqual(parsed.get("renderType"), "quote") self.assertEqual(parsed.get("quoteType"), "49") self.assertEqual(parsed.get("quoteTitle"), "水豚喧喧") self.assertEqual(parsed.get("quoteContent"), "[链接] 为自己的美丽漂亮善良知性发声😊") self.assertEqual(parsed.get("quoteThumbUrl"), "https://mmbiz.qpic.cn/some-thumb.jpg") def test_public_account_link_exposes_link_type_and_style(self): raw_text = ( '' '为自己的美丽漂亮善良知性发声😊' '#日常穿搭灵感 #白色蕾丝裙穿搭 #知性美女' '5' 'http://mp.weixin.qq.com/s?__biz=xx&mid=1' 'http://mmbiz.qpic.cn/abc/640?wx_fmt=jpeg' 'gh_0cef8eaa987d' '草莓不甜芒果甜' '' ) parsed = _parse_app_message(raw_text) self.assertEqual(parsed.get("renderType"), "link") self.assertEqual(parsed.get("linkType"), "official_article") self.assertEqual(parsed.get("linkStyle"), "cover") def test_finder_type_51_uses_nested_desc_and_cover(self): raw_text = ( '' '当前版本不支持展示该内容,请升级至最新版本。' '' '51' '' '' '' '' '' '' '' '' '' '' '' ) parsed = _parse_app_message(raw_text) self.assertEqual(parsed.get("renderType"), "link") self.assertEqual(parsed.get("linkType"), "finder") self.assertEqual(parsed.get("title"), "微信视频号全金融行业今公布发布") self.assertEqual(parsed.get("content"), "微信视频号全金融行业今公布发布") self.assertEqual(parsed.get("from"), "央视新闻") self.assertEqual(parsed.get("fromUsername"), "finder_cctv_news") self.assertEqual(parsed.get("thumbUrl"), "https://finder.video.qq.com/cover.jpg") self.assertEqual(parsed.get("url"), "https://channels.weixin.qq.com/web/pages/feed?feedid=abc") def test_finder_type_51_exposes_object_fields(self): raw_text = ( '' '当前版本不支持展示该内容,请升级至最新版本。' '' '51' '' '' '' '' '' '' ) parsed = _parse_app_message(raw_text) self.assertEqual(parsed.get("linkType"), "finder") self.assertEqual(parsed.get("objectId"), "1234567890") self.assertEqual(parsed.get("objectNonceId"), "nonce-abc") def test_quote_type_5_nested_xml_refermsg_uses_inner_title(self): raw_text = ( '' '这个年龄有点大啊57' '5' '\n' '谁说冬天不能穿裙子?5' 'https://mmbiz.qpic.cn/some-thumb2.jpg' 'https://mp.weixin.qq.com/s/example2' ']]>' ) parsed = _parse_app_message(raw_text) self.assertEqual(parsed.get("renderType"), "quote") self.assertEqual(parsed.get("quoteType"), "5") self.assertEqual(parsed.get("quoteTitle"), "水豚噜噜") self.assertEqual(parsed.get("quoteContent"), "[链接] 谁说冬天不能穿裙子?") self.assertEqual(parsed.get("quoteThumbUrl"), "https://mmbiz.qpic.cn/some-thumb2.jpg") if __name__ == "__main__": unittest.main()