在微信逆向开发中,获取到消息内容只是第一步,如何从消息附带的文件(如Excel、CSV、TXT等)中提取有价值的信息才是核心。本文将结合实际场景,详细拆解一套用于解析微信消息附件的工具类代码,展示如何从逆向获取的微信文件路径出发,提取关键业务数据(如订单号)。
背景:微信逆向中的文件处理需求
通过微信逆向,我们可以获取到以下关键信息:
- 消息中的文件本地缓存路径(如
C:\Users\XXX\Documents\WeChat Files\XXX\FileStorage\File\2025-10\订单列表.xlsx) - 消息中的图片URL(通过CQ码格式解析,如
[CQ:image,file=xxx,url=https://xxx]) - 消息中的XML格式文件元数据(如文件大小、文件名)
这些信息需要通过工具类进行解析处理,最终提取出业务所需的核心数据(如订单号、物流单号等)。本文拆解的ReadFileUtil工具类正是为此设计。
核心功能拆解:从文件路径到业务数据
1. 多格式文件解析:提取关键编号(以订单号为例)
getFileBillList方法是核心,支持解析Excel(xls/xlsx)、CSV、TXT格式文件,提取其中的订单号(通过JTBillNoMatchUtil工具类匹配)。
1.1 Excel文件解析逻辑
微信消息中的Excel文件通常有两种读取方式,工具类做了双重保障:
// 方式1:通过Hutool的ExcelReader读取(适用于规范格式的Excel)
ExcelReader reader = ExcelUtil.getReader(FileUtil.file(path));
List<Map<String, Object>> readList = reader.readAll();
// 从单元格值中提取订单号
List<String> extractedBillList = readList.stream()
.flatMap(map -> map.values().stream())
.filter(value -> value != null && StringUtils.isNotBlank(value.toString()))
.map(value -> JTBillNoMatchUtil.matchSingleOrderNum(value.toString()))
.filter(StringUtils::isNotBlank)
.toList();
// 从表头中提取订单号(防止订单号出现在表头)
Set<String> heads = readList.stream()
.flatMap(map -> map.keySet().stream())
.filter(StringUtils::isNotBlank)
.map(JTBillNoMatchUtil::matchSingleOrderNum)
.filter(StringUtils::isNotBlank)
.collect(Collectors.toSet());
如果Hutool读取失败(如合并单元格、格式异常),则降级使用POI原生API读取:
// 方式2:POI原生API读取(兼容复杂格式)
XSSFWorkbook wb = new XSSFWorkbook(Files.newInputStream(Paths.get(path)));
XSSFSheet sheet = wb.getSheetAt(0);
int lastRowNum = sheet.getLastRowNum


320

被折叠的 条评论
为什么被折叠?



