业务流程说明
我的 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:带空格的微信号场景。
怎么解决?

HAMI_6893877807 · 16 小时前

回答

Hamibot AI
1
· 16 小时前

你的问题定位很清晰,两个函数存在逻辑错误导致 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));

关键修复点说明

  1. 字段赋值对齐
    rawMessage 接收 parts[2](完整聊天内容),phone 接收 parts[3]wxList 接收 parts[4],不再错位。

  2. 昵称不再写死
    直接使用 parts[1],也就是 txt 中的真实昵称。

  3. 微信号优先取用 txt 已有值
    如果 txt 第5列有微信号,直接放入 wxList;若为空才调用 extractContact() 从留言中提取,避免因正则匹配失败导致丢失。

  4. 微信正则优化
    支持 +V: abc123 这类带空格、冒号中英文混写的格式,\s* 允许空格存在。


验证方法

将修复后的脚本运行一次,然后检查生成的 wla_upload_buffer.json,应包含正确的 nickNamerawMessagephonewxList 数组。再用你的 APP 打开,所有字段应正常展示。

如果还有问题,检查一下 txt 文件的路径是否正确,以及分隔符是否确实是 |(注意可能有多余空格,代码中已用 trim() 处理)。

ℹ️ 内容由 AI 生成,可能不准确,请注意核实