Files
wechat_chatter/onebot/protobuf_dump_test.go
2026-07-10 09:28:22 +08:00

247 lines
16 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package main
import (
"bytes"
"encoding/json"
"fmt"
"strings"
"testing"
)
// 把你抓到的 hexdump 直接粘到这里(支持地址列 + hex + ASCII 的完整格式)。
const dumpInput = `
0000000000000000 08 00 12 AD 10 08 02 12 A7 0D 08 05 12 A2 0D 08 ................
0000000000000010 9C 0D 12 9C 0D 08 ED EA 92 D5 01 12 15 0A 13 77 ...............w
0000000000000020 78 69 64 5F 6C 64 66 74 75 68 65 33 36 69 7A 67 xid_ldftuhe36izg
0000000000000030 31 39 1A 16 0A 14 34 35 38 37 32 30 32 35 33 38 19....4587202538
0000000000000040 34 40 63 68 61 74 72 6F 6F 6D 20 03 2A A0 0A 0A 4@chatroom .*...
0000000000000050 9D 0A 3C 3F 78 6D 6C 20 76 65 72 73 69 6F 6E 3D ..<?xml version=
0000000000000060 22 31 2E 30 22 3F 3E 0A 3C 6D 73 67 3E 0A 09 3C "1.0"?>.<msg>..<
0000000000000070 69 6D 67 20 61 65 73 6B 65 79 3D 22 39 61 34 39 img aeskey="9a49
0000000000000080 36 38 32 32 61 31 62 35 35 30 65 66 34 62 39 65 6822a1b550ef4b9e
0000000000000090 63 64 31 62 30 36 31 30 34 35 38 66 22 20 65 6E cd1b0610458f" en
00000000000000A0 63 72 79 76 65 72 3D 22 31 22 20 63 64 6E 74 68 cryver="1" cdnth
00000000000000B0 75 6D 62 61 65 73 6B 65 79 3D 22 39 61 34 39 36 umbaeskey="9a496
00000000000000C0 38 32 32 61 31 62 35 35 30 65 66 34 62 39 65 63 822a1b550ef4b9ec
00000000000000D0 64 31 62 30 36 31 30 34 35 38 66 22 20 63 64 6E d1b0610458f" cdn
00000000000000E0 74 68 75 6D 62 75 72 6C 3D 22 33 30 35 66 30 32 thumburl="305f02
00000000000000F0 30 31 30 30 30 34 34 62 33 30 34 39 30 32 30 31 0100044b30490201
0000000000000100 30 30 30 32 30 34 66 36 35 63 39 63 65 30 30 32 000204f65c9ce002
0000000000000110 30 33 32 66 35 63 33 39 30 32 30 34 32 33 30 30 032f5c3902042300
0000000000000120 30 63 37 39 30 32 30 34 36 61 34 66 34 64 63 66 0c7902046a4f4dcf
0000000000000130 30 34 32 34 33 34 36 32 36 34 36 33 33 33 33 39 0424346264633339
0000000000000140 33 38 33 32 32 64 33 37 33 34 33 33 33 33 32 64 38322d373433332d
0000000000000150 33 34 33 36 36 34 36 33 32 64 36 31 33 34 33 34 343664632d613434
0000000000000160 33 30 32 64 33 33 33 32 36 35 33 36 36 32 33 37 302d333265366237
0000000000000170 33 30 36 34 33 33 33 37 36 32 33 31 30 32 30 34 3064333762310204
0000000000000180 30 35 31 35 30 61 30 32 30 32 30 31 30 30 30 34 05150a0202010004
0000000000000190 30 64 30 30 34 63 35 61 65 31 30 30 30 30 30 30 0d004c5ae1000000
00000000000001A0 30 30 30 30 30 30 30 30 30 30 30 30 22 20 63 64 000000000000" cd
00000000000001B0 6E 74 68 75 6D 62 6C 65 6E 67 74 68 3D 22 39 38 nthumblength="98
00000000000001C0 37 37 22 20 63 64 6E 74 68 75 6D 62 68 65 69 67 77" cdnthumbheig
00000000000001D0 68 74 3D 22 32 31 30 22 20 63 64 6E 74 68 75 6D ht="210" cdnthum
00000000000001E0 62 77 69 64 74 68 3D 22 31 31 38 22 20 63 64 6E bwidth="118" cdn
00000000000001F0 6D 69 64 68 65 69 67 68 74 3D 22 30 22 20 63 64 midheight="0" cd
0000000000000200 6E 6D 69 64 77 69 64 74 68 3D 22 30 22 20 63 64 nmidwidth="0" cd
0000000000000210 6E 68 64 68 65 69 67 68 74 3D 22 30 22 20 63 64 nhdheight="0" cd
0000000000000220 6E 68 64 77 69 64 74 68 3D 22 30 22 20 63 64 6E nhdwidth="0" cdn
0000000000000230 6D 69 64 69 6D 67 75 72 6C 3D 22 33 30 35 66 30 midimgurl="305f0
0000000000000240 32 30 31 30 30 30 34 34 62 33 30 34 39 30 32 30 20100044b3049020
0000000000000250 31 30 30 30 32 30 34 66 36 35 63 39 63 65 30 30 1000204f65c9ce00
0000000000000260 32 30 33 32 66 35 63 33 39 30 32 30 34 32 33 30 2032f5c390204230
0000000000000270 30 30 63 37 39 30 32 30 34 36 61 34 66 34 64 63 00c7902046a4f4dc
0000000000000280 66 30 34 32 34 33 34 36 32 36 34 36 33 33 33 33 f042434626463333
0000000000000290 39 33 38 33 32 32 64 33 37 33 34 33 33 33 33 32 938322d373433332
00000000000002A0 64 33 34 33 36 36 34 36 33 32 64 36 31 33 34 33 d343664632d61343
00000000000002B0 34 33 30 32 64 33 33 33 32 36 35 33 36 36 32 33 4302d33326536623
00000000000002C0 37 33 30 36 34 33 33 33 37 36 32 33 31 30 32 30 7306433376231020
00000000000002D0 34 30 35 31 35 30 61 30 32 30 32 30 31 30 30 30 405150a020201000
00000000000002E0 34 30 64 30 30 34 63 35 61 65 31 30 30 30 30 30 40d004c5ae100000
00000000000002F0 30 30 30 30 30 30 30 30 30 30 30 30 30 22 20 6C 0000000000000" l
0000000000000300 65 6E 67 74 68 3D 22 34 37 32 35 31 22 20 6D 64 ength="47251" md
0000000000000310 35 3D 22 36 31 62 38 32 39 62 65 34 38 62 39 39 5="61b829be48b99
0000000000000320 65 34 65 36 36 62 65 36 65 36 64 62 61 39 33 34 e4e66be6e6dba934
0000000000000330 63 33 32 22 20 68 65 76 63 5F 6D 69 64 5F 73 69 c32" hevc_mid_si
0000000000000340 7A 65 3D 22 34 37 32 35 31 22 20 6F 72 69 67 69 ze="47251" origi
0000000000000350 6E 73 6F 75 72 63 65 6D 64 35 3D 22 62 63 39 31 nsourcemd5="bc91
0000000000000360 66 37 62 34 61 39 39 64 31 37 65 36 31 66 36 32 f7b4a99d17e61f62
0000000000000370 35 37 64 31 32 66 39 32 33 30 36 30 22 3E 0A 09 57d12f923060">..
0000000000000380 09 3C 73 65 63 48 61 73 68 49 6E 66 6F 42 61 73 .<secHashInfoBas
0000000000000390 65 36 34 3E 65 79 4A 77 61 47 46 7A 61 43 49 36 e64>eyJwaGFzaCI6
00000000000003A0 49 6A 45 77 4F 54 45 32 4D 6A 45 77 4E 54 49 79 IjEwOTE2MjEwNTIy
00000000000003B0 4D 44 45 77 4E 44 41 69 4C 43 4A 77 5A 48 46 6F MDEwNDAiLCJwZHFo
00000000000003C0 59 58 4E 6F 49 6A 6F 69 4F 44 51 77 59 7A 55 33 YXNoIjoiODQwYzU3
00000000000003D0 4D 47 49 33 59 54 4D 77 4D 57 45 7A 5A 57 45 32 MGI3YTMwMWEzZWE2
00000000000003E0 4E 6A 4E 6C 4F 57 59 32 4E 54 6B 77 5A 6A 56 6D NjNlOWY2NTkwZjVm
00000000000003F0 4F 44 68 68 4E 6D 45 7A 5A 57 45 33 4D 47 59 34 ODhhNmEzZWE3MGY4
0000000000000400 4E 47 51 77 4E 57 4D 7A 4D 44 63 77 4D 47 59 34 NGQwNWMzMDcwMGY4
0000000000000410 4D 44 4D 33 4F 44 4E 6D 5A 6D 5A 6D 5A 43 4A 39 MDM3ODNmZmZmZCJ9
0000000000000420 3C 2F 73 65 63 48 61 73 68 49 6E 66 6F 42 61 73 </secHashInfoBas
0000000000000430 65 36 34 3E 0A 09 09 3C 6C 69 76 65 3E 0A 09 09 e64>...<live>...
0000000000000440 09 3C 64 75 72 61 74 69 6F 6E 3E 30 3C 2F 64 75 .<duration>0</du
0000000000000450 72 61 74 69 6F 6E 3E 0A 09 09 09 3C 73 69 7A 65 ration>....<size
0000000000000460 3E 30 3C 2F 73 69 7A 65 3E 0A 09 09 09 3C 6D 64 >0</size>....<md
0000000000000470 35 20 2F 3E 0A 09 09 09 3C 66 69 6C 65 69 64 20 5 />....<fileid
0000000000000480 2F 3E 0A 09 09 09 3C 68 64 73 69 7A 65 3E 30 3C />....<hdsize>0<
0000000000000490 2F 68 64 73 69 7A 65 3E 0A 09 09 09 3C 68 64 6D /hdsize>....<hdm
00000000000004A0 64 35 20 2F 3E 0A 09 09 09 3C 68 64 66 69 6C 65 d5 />....<hdfile
00000000000004B0 69 64 20 2F 3E 0A 09 09 09 3C 73 74 69 6C 6C 69 id />....<stilli
00000000000004C0 6D 61 67 65 74 69 6D 65 6D 73 3E 30 3C 2F 73 74 magetimems>0</st
00000000000004D0 69 6C 6C 69 6D 61 67 65 74 69 6D 65 6D 73 3E 0A illimagetimems>.
00000000000004E0 09 09 3C 2F 6C 69 76 65 3E 0A 09 3C 2F 69 6D 67 ..</live>..</img
00000000000004F0 3E 0A 09 3C 70 6C 61 74 66 6F 72 6D 5F 73 69 67 >..<platform_sig
0000000000000500 6E 61 74 75 72 65 20 2F 3E 0A 09 3C 69 6D 67 64 nature />..<imgd
0000000000000510 61 74 61 68 61 73 68 20 2F 3E 0A 09 3C 49 6D 67 atahash />..<Img
0000000000000520 53 6F 75 72 63 65 49 6E 66 6F 3E 0A 09 09 3C 49 SourceInfo>...<I
0000000000000530 6D 67 53 6F 75 72 63 65 55 72 6C 20 2F 3E 0A 09 mgSourceUrl />..
0000000000000540 09 3C 42 69 7A 54 79 70 65 3E 30 3C 2F 42 69 7A .<BizType>0</Biz
0000000000000550 54 79 70 65 3E 0A 09 3C 2F 49 6D 67 53 6F 75 72 Type>..</ImgSour
0000000000000560 63 65 49 6E 66 6F 3E 0A 3C 2F 6D 73 67 3E 0A 30 ceInfo>.</msg>.0
0000000000000570 03 38 02 42 02 08 00 48 E4 EF BD D2 06 52 9B 02 .8.B...H.....R..
0000000000000580 3C 6D 73 67 73 6F 75 72 63 65 3E 0A 09 3C 62 69 <msgsource>..<bi
0000000000000590 7A 66 6C 61 67 3E 30 3C 2F 62 69 7A 66 6C 61 67 zflag>0</bizflag
00000000000005A0 3E 0A 09 3C 73 65 63 5F 6D 73 67 5F 6E 6F 64 65 >..<sec_msg_node
00000000000005B0 3E 0A 09 09 3C 75 75 69 64 3E 38 62 31 31 62 33 >...<uuid>8b11b3
00000000000005C0 66 63 32 33 35 34 30 33 62 36 63 65 34 37 32 33 fc235403b6ce4723
00000000000005D0 62 62 65 62 31 39 62 64 31 35 5F 3C 2F 75 75 69 bbeb19bd15_</uui
00000000000005E0 64 3E 0A 09 09 3C 72 69 73 6B 2D 66 69 6C 65 2D d>...<risk-file-
00000000000005F0 66 6C 61 67 20 2F 3E 0A 09 09 3C 72 69 73 6B 2D flag />...<risk-
0000000000000600 66 69 6C 65 2D 6D 64 35 2D 6C 69 73 74 20 2F 3E file-md5-list />
0000000000000610 0A 09 3C 2F 73 65 63 5F 6D 73 67 5F 6E 6F 64 65 ..</sec_msg_node
0000000000000620 3E 0A 09 3C 73 69 67 6E 61 74 75 72 65 3E 4E 30 >..<signature>N0
0000000000000630 5F 56 31 5F 6D 74 6F 4A 64 6D 49 35 7C 76 31 5F _V1_mtoJdmI5|v1_
0000000000000640 6E 6B 4D 6F 79 50 6F 55 3C 2F 73 69 67 6E 61 74 nkMoyPoU</signat
0000000000000650 75 72 65 3E 0A 09 3C 74 6D 70 5F 6E 6F 64 65 3E ure>..<tmp_node>
0000000000000660 0A 09 09 3C 70 75 62 6C 69 73 68 65 72 2D 69 64 ...<publisher-id
0000000000000670 3E 3C 2F 70 75 62 6C 69 73 68 65 72 2D 69 64 3E ></publisher-id>
0000000000000680 0A 09 3C 2F 74 6D 70 5F 6E 6F 64 65 3E 0A 3C 2F ..</tmp_node>.</
0000000000000690 6D 73 67 73 6F 75 72 63 65 3E 0A 60 FC 96 DB BC msgsource>.....
00000000000006A0 D3 F9 C6 BB 65 68 F8 B8 AC D4 02 72 02 08 00 78 ....eh.....r...x
00000000000006B0 00 12 FE 02 08 05 12 F9 02 08 F3 02 12 F3 02 08 ................
00000000000006C0 8E F9 82 DC 06 12 15 0A 13 77 78 69 64 5F 6C 64 .........wxid_ld
00000000000006D0 66 74 75 68 65 33 36 69 7A 67 31 39 1A 16 0A 14 ftuhe36izg19....
00000000000006E0 34 35 38 37 32 30 32 35 33 38 34 40 63 68 61 74 45872025384@chat
00000000000006F0 72 6F 6F 6D 20 33 2A 9D 01 0A 9A 01 3C 6D 73 67 room 3*.....<msg
0000000000000700 3E 0A 3C 6F 70 20 69 64 3D 27 31 27 3E 0A 3C 75 >.<op id='1'>.<u
0000000000000710 73 65 72 6E 61 6D 65 3E 34 35 38 37 32 30 32 35 sername>45872025
0000000000000720 33 38 34 40 63 68 61 74 72 6F 6F 6D 3C 2F 75 73 384@chatroom</us
0000000000000730 65 72 6E 61 6D 65 3E 0A 3C 6E 61 6D 65 3E 6C 61 ername>.<name>la
0000000000000740 73 74 4D 65 73 73 61 67 65 3C 2F 6E 61 6D 65 3E stMessage</name>
0000000000000750 0A 3C 61 72 67 3E 7B 22 6D 65 73 73 61 67 65 53 .<arg>{"messageS
0000000000000760 76 72 49 64 22 3A 30 2C 22 4D 73 67 43 72 65 61 vrId":0,"MsgCrea
0000000000000770 74 65 54 69 6D 65 22 3A 31 37 38 33 35 39 32 39 teTime":17835929
0000000000000780 33 32 7D 3C 2F 61 72 67 3E 0A 3C 2F 6F 70 3E 0A 32}</arg>.</op>.
0000000000000790 3C 2F 6D 73 67 3E 30 03 38 01 42 02 08 00 48 E5 </msg>0.8.B...H.
00000000000007A0 EF BD D2 06 52 76 3C 6D 73 67 73 6F 75 72 63 65 ....Rv<msgsource
00000000000007B0 3E 0A 09 3C 73 69 67 6E 61 74 75 72 65 3E 76 31 >..<signature>v1
00000000000007C0 5F 71 38 43 30 51 43 64 78 3C 2F 73 69 67 6E 61 _q8C0QCdx</signa
00000000000007D0 74 75 72 65 3E 0A 09 3C 74 6D 70 5F 6E 6F 64 65 ture>..<tmp_node
00000000000007E0 3E 0A 09 09 3C 70 75 62 6C 69 73 68 65 72 2D 69 >...<publisher-i
00000000000007F0 64 3E 3C 2F 70 75 62 6C 69 73 68 65 72 2D 69 64 d></publisher-id
0000000000000800 3E 0A 09 3C 2F 74 6D 70 5F 6E 6F 64 65 3E 0A 3C >..</tmp_node>.<
0000000000000810 2F 6D 73 67 73 6F 75 72 63 65 3E 0A 60 E2 BB AE /msgsource>....
0000000000000820 8D D0 B7 A7 ED 1A 68 F9 B8 AC D4 02 72 02 08 00 ......h.....r...
0000000000000830 78 00 18 00 22 EC 02 08 E6 02 12 E6 02 08 2F 12 x..."........./.
0000000000000840 08 08 01 10 B6 9F FA 8D 03 12 04 08 65 10 00 12 ............e...
0000000000000850 08 08 02 10 F9 B8 AC D4 02 12 04 08 66 10 00 12 ............f...
0000000000000860 04 08 0D 10 00 12 05 08 CC 01 10 00 12 08 08 03 ................
0000000000000870 10 8E 91 FA 8D 03 12 04 08 67 10 00 12 08 08 0B .........g......
0000000000000880 10 F2 9D FA 8D 03 12 04 08 6F 10 00 12 04 08 04 .........o......
0000000000000890 10 00 12 04 08 68 10 00 12 04 08 05 10 00 12 04 .....h..........
00000000000008A0 08 69 10 00 12 04 08 07 10 00 12 04 08 6B 10 00 .i...........k..
00000000000008B0 12 04 08 08 10 00 12 04 08 6C 10 00 12 08 08 09 .........l......
00000000000008C0 10 96 9F FA 8D 03 12 04 08 6D 10 00 12 08 08 16 .........m......
00000000000008D0 10 A1 9F FA 8D 03 12 04 08 06 10 00 12 04 08 7A ...............z
00000000000008E0 10 00 12 04 08 6A 10 00 12 04 08 10 10 00 12 04 .....j..........
00000000000008F0 08 11 10 00 12 04 08 72 10 00 12 08 08 0E 10 CA .......r........
0000000000000900 ED F9 8D 03 12 04 08 70 10 00 12 06 08 13 10 D9 .......p........
0000000000000910 EB 02 12 04 08 1A 10 00 12 06 08 1B 10 8B B7 02 ................
0000000000000920 12 08 08 18 10 E5 EF BD D2 06 12 08 08 17 10 D9 ................
0000000000000930 EF BD D2 06 12 08 08 19 10 F9 B8 AC D4 02 12 04 ................
0000000000000940 08 0A 10 00 12 09 08 C9 01 10 E5 EF BD D2 06 12 ................
0000000000000950 05 08 CD 01 10 00 12 05 08 CA 01 10 00 12 09 08 ................
0000000000000960 CB 01 10 E3 92 A7 D2 06 12 05 08 CE 01 10 67 12 ..............g.
0000000000000970 05 08 CF 01 10 00 12 04 08 14 10 00 12 04 08 15 ................
0000000000000980 10 00 12 09 08 E8 07 10 98 BF BD D2 06 12 09 08 ................
0000000000000990 E9 07 10 D9 DB BD D2 06 12 09 08 D3 0F 10 92 F4 ................
00000000000009A0 BC D2 06 28 01 30 DA E0 DA DA 02 38 E5 EF BD D2 ...(.0.....8....
00000000000009B0 06 42 15 08 11 12 11 0A 0F 08 02 08 1A 08 1B 10 .B..............
00000000000009C0 BF C0 B4 A7 0A 18 E9 07 ........
`
// TestProbeProtobufDump 直接测试 HandleProtobufMsg
// 把 hexdump 还原成字节 → 按 JS 侧一样封装成 {"data": [byte...]} 的 payload
// → 调用 HandleProtobufMsg,打印它返回的 WechatMessage JSON 或错误。
func TestProbeProtobufDump(t *testing.T) {
rawBytes := parseDump(t, dumpInput)
t.Logf("解析出的字节数: %d", len(rawBytes))
// 构造 HandleProtobufMsg 期望的 payloaddata 是 []interface{}{float64,...}
dataArr := make([]interface{}, len(rawBytes))
for i, b := range rawBytes {
dataArr[i] = float64(b)
}
payload := map[string]interface{}{"data": dataArr}
jsonList, err := HandleProtobufMsg(payload)
if err != nil {
t.Fatalf("HandleProtobufMsg 失败: %v", err)
}
if len(jsonList) == 0 {
t.Fatalf("HandleProtobufMsg 返回空(消息被全部跳过)")
}
fmt.Printf("========== HandleProtobufMsg 返回 %d 条消息 ==========\n", len(jsonList))
for idx, jsonData := range jsonList {
var pretty bytes.Buffer
if err := json.Indent(&pretty, jsonData, "", " "); err != nil {
fmt.Printf("--- 消息 %d ---\n%s\n", idx, string(jsonData))
} else {
fmt.Printf("--- 消息 %d ---\n%s\n", idx, pretty.String())
}
}
}
// parseDump 从 hexdump 里抽出真正的字节。
// 针对 lldb / hexdump -C 的固定列宽格式:
//
// 地址(16 hex) + 2空格 + hex列(16字节) + 2空格 + ASCII列
//
// 第 0..17 字符是地址列,第 18 起是 hex 列(16 字节 = 48 字符宽,
// 中缝再占 1 空格)。按固定列宽切片,彻底避开 ASCII 列被误当字节。
func parseDump(t *testing.T, dump string) []byte {
t.Helper()
const addrCols = 18 // 16 hex 地址 + 2 空格
const hexCols = 49 // 8字节*3 + 中缝1 + 8字节*3 = 49(含末尾空格,Fields 会忽略)
var out []byte
for _, line := range strings.Split(dump, "\n") {
if strings.TrimSpace(line) == "" {
continue
}
if len(line) <= addrCols {
continue
}
end := addrCols + hexCols
if end > len(line) {
end = len(line)
}
for _, tk := range strings.Fields(line[addrCols:end]) {
if len(tk) == 2 && isHexTok(tk) {
var v int
fmt.Sscanf(tk, "%02x", &v)
out = append(out, byte(v))
}
}
}
return out
}
func isHexTok(s string) bool {
for _, c := range s {
if !((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) {
return false
}
}
return len(s) > 0
}