业务流程说明
我的 Hamibot 脚本作用:抓取抖音私信客户消息,先保存到wla_leads.txt,再把这个 txt 文件转成wla_upload_buffer.json,最后由我的 APP 读取这个 JSON 文件展示客户信息。
已确认正常部分
wla_leads.txt 文件内容完全没问题,格式固定:时间 | 用户昵称 | 完整聊天留言 | 手机号 | 微信号,每条消息的聊天内容、电话、微信都完整抓取到,没有丢失。
脚本存在的问题(txt 转 JSON 转换出错)
脚本读取wla_leads.txt生成wla_upload_buffer.json时逻辑错误,导致 APP 读取后展示异常:
客户留言显示异常
txt 里完整的客户聊天内容,没有放到 JSON 的rawMessage字段(APP 读取留言的固定字段),反而把纯手机号填进了rawMessage;完整对话被错误放到无用的douyinId字段里。APP 页面只能看到一串手机号,看不到客户完整咨询话术。
微信号完全不显示
txt 文件里已经提前提取好了客户微信号,但转换代码没有直接取用,又重新用正则去聊天文本里解析微信;正则识别不了+V: abc123这种带空格的微信格式,最终 JSON 里wxList永远是空数组,APP 微信一栏全部空白。
昵称全部统一显示 “未知”
txt 里每条记录都有真实用户昵称,但转换代码没有读取,直接固定写死 “未知”。
关键验证(证明不是 APP 的问题)
我手动按标准格式写了一份正确 JSON 放进wla_upload_buffer.json,APP 打开后所有内容(昵称、完整留言、电话、微信)都能正常展示,确定故障只出在 Hamibot 脚本「txt 转 JSON」这一段代码。
需要修复的函数
getUnUploadDouyinLeads():读取 txt 转 JSON 的核心函数,分段下标赋值错乱;
extractContact():提取微信的正则,无法识别+V:带空格的微信号场景。
怎么解决?
回答
你的问题定位很清晰,两个函数存在逻辑错误导致 JSON 结构错乱。下面给出修复方案,直接替换这两个函数即可。
修复代码
在脚本开头添加文档注释:
// 文档地址 https://docs.hamibot.com/
1. 修复 extractContact() 函数 —— 支持带空格的微信格式
原正则在遇到 +V: abc123 这种带空格的情况时无法匹配,需要调整为可选空格,同时保留从纯文本中提取的能力。
function extractContact(text) {
var wxList = [];
var phone = "";
// 匹配微信常见格式:微信、wx、v、+V 等,冒号后可带空格,账号为字母数字下划线减号组合
var wxRegex = /(?:微信|wx|v|\+V)\s*[::]?\s*([a-zA-Z0-9_\-]+)/gi;
var match;
while ((match = wxRegex.exec(text)) !== null) {
var wx = match[1];
if (wx && wxList.indexOf(wx) === -1) {
wxList.push(wx);
}
}
// 提取手机号:1开头的11位数字
var phoneMatch = text.match(/1[3-9]\d{9}/);
if (phoneMatch) {
phone = phoneMatch[0];
}
return {
wxList: wxList,
phone: phone
};
}
2. 修复 getUnUploadDouyinLeads() 函数 —— 正确解析 txt 并构建 JSON
txt 每行格式:时间 | 用户昵称 | 完整聊天留言 | 手机号 | 微信号
需要按分隔符 | 拆分,并正确映射到 JSON 字段。
function getUnUploadDouyinLeads() {
// 读取文件,假设文件在脚本同目录下,可根据实际路径调整
var txtContent = files.read("/sdcard/wla_leads.txt"); // 路径按实际修改
if (!txtContent) {
return [];
}
var lines = txtContent.split("\n");
var leads = [];
for (var i = 0; i < lines.length; i++) {
var line = lines[i].trim();
if (!line) continue;
var parts = line.split("|");
// 确保至少有5个字段(时间、昵称、留言、手机、微信)
if (parts.length < 5) continue;
var time = parts[0].trim();
var nickName = parts[1].trim();
var rawMessage = parts[2].trim();
var phone = parts[3].trim();
var wxFromTxt = parts[4].trim();
// 构建 wxList,优先使用 txt 中的微信号,如果为空再尝试从留言中提取
var wxList = [];
if (wxFromTxt) {
wxList.push(wxFromTxt);
} else {
// 如果 txt 微信号为空,回退使用 extractContact 从留言中提取
var contact = extractContact(rawMessage);
wxList = contact.wxList;
if (!phone && contact.phone) {
phone = contact.phone;
}
}
// 构建标准 JSON 对象
var lead = {
time: time,
nickName: nickName,
rawMessage: rawMessage,
phone: phone || "",
wxList: wxList,
// 保留 douyinId 字段但置空,避免 APP 读到无用数据
douyinId: ""
};
leads.push(lead);
}
return leads;
}
然后调用该函数并写入 JSON 文件:
var leads = getUnUploadDouyinLeads();
files.write("/sdcard/wla_upload_buffer.json", JSON.stringify(leads));
关键修复点说明
-
字段赋值对齐:
rawMessage接收parts[2](完整聊天内容),phone接收parts[3],wxList接收parts[4],不再错位。 -
昵称不再写死:
直接使用parts[1],也就是 txt 中的真实昵称。 -
微信号优先取用 txt 已有值:
如果 txt 第5列有微信号,直接放入wxList;若为空才调用extractContact()从留言中提取,避免因正则匹配失败导致丢失。 -
微信正则优化:
支持+V: abc123这类带空格、冒号中英文混写的格式,\s*允许空格存在。
验证方法
将修复后的脚本运行一次,然后检查生成的 wla_upload_buffer.json,应包含正确的 nickName、rawMessage、phone 和 wxList 数组。再用你的 APP 打开,所有字段应正常展示。
如果还有问题,检查一下 txt 文件的路径是否正确,以及分隔符是否确实是 |(注意可能有多余空格,代码中已用 trim() 处理)。