脚本无法抓取上一次运行和这次运行期间公众号发布的所有信息,只会识别到距离这次运行最近的一篇发布文章,举例:公众号于7:00、9:00、10:00:11:00分别发布了四篇文章,脚本第一次运行为8:00,可以抓到7:00的这篇文章;第二次运行为12:00,就只能抓到11:00这篇文章,中间9:00、10:00这两篇文章就抓不到(以前不会这样)。第二个问题是,脚本没有办法抓取图片文章(以前是可以的)。

六个荔枝 · 2 小时前

回答

Hamibot AI
1
· 2 小时前

这两个问题通常由微信客户端无障碍节点结构变更与脚本遍历/状态记录逻辑不匹配导致。微信频繁更新会改变列表渲染方式和节点属性,原有选择器或循环条件失效后就会出现漏抓或识别异常。以下是针对性解决方案:

问题一:漏抓两次运行期间的中间文章

根本原因

  1. 微信公众号列表采用虚拟滚动与懒加载,脚本未充分触发滚动或等待节点渲染,导致中间文章未加载到无障碍树中。
  2. 状态记录逻辑不严谨。仅依赖时间字符串或固定索引比对,微信更新后时间格式或节点顺序变化,导致脚本提前 break 或跳过未处理项。

解决方法

  1. 改用唯一标识持久化记录
    不要依赖时间比对。提取文章链接中的 mid 或无障碍节点中的稳定属性作为唯一ID,使用 storages 模块保存上次处理的位置。
    // 文档地址 https://docs.hamibot.com/
    var storage = storages.create("mp_article_sync");
    var lastId = storage.get("last_processed_id", "");
    
  2. 完善滚动与加载机制
    遍历前必须确保列表充分加载。使用滑动配合节点等待,避免读取未渲染的虚拟节点。
    // 文档地址 https://docs.hamibot.com/
    auto.waitFor();
    var container = className("androidx.recyclerview.widget.RecyclerView").findOne(3000);
    if (!container) {
        log("未找到文章列表容器");
        exit();
    }
    // 向下滚动触发懒加载
    for (var s = 0; s < 3; s++) {
        container.scrollDown();
        sleep(800);
    }
    
  3. 优化遍历与终止条件
    从列表顶部向下遍历,提取每项的唯一标识。遇到与 lastId 相同的项时停止,并将本次抓取的第一项ID更新为新的 lastId。避免使用固定长度或索引作为循环边界。

问题二:无法抓取纯图片文章

根本原因
纯图片文章在无障碍树中的节点结构与图文文章不同。通常缺少 text 属性,依赖 desc 或特定的 ImageView 容器。微信版本更新后,图片文章的父容器类名或属性可能已变更,导致原选择器过滤掉了该类节点。

解决方法

  1. 多属性兼容选择器
    同时监听 textdesc 及子节点特征,增加容错分支。
    // 文档地址 https://docs.hamibot.com/
    var items = className("android.view.View").find();
    for (var i = 0; i < items.length; i++) {
        var node = items[i];
        var title = node.text() || node.desc() || "";
        var hasImage = node.findOne(className("android.widget.ImageView"));
        
        if (title === "" && hasImage) {
            log("识别到图片文章,执行图片抓取逻辑");
            // 你的图片文章处理代码
        } else if (title !== "") {
            log("识别到常规文章: " + title);
            // 你的常规文章处理代码
        }
    }
    
  2. 使用 Hamibot 调试工具校准节点
    在脚本开头添加 auto.waitFor();,运行后使用 Hamibot 的「布局范围分析」或「节点查看」功能,对比图文文章与图片文章的当前节点树。重点记录图片文章的 classNamedesc 和层级路径,替换脚本中失效的选择器。

调试与最佳实践建议

  • 打印节点属性排查:在遍历循环内使用 log(node.className() + " | " + node.text() + " | " + node.desc()); 输出当前微信版本的实际节点数据,快速定位选择器失效位置。
  • 避免强依赖单一属性:微信无障碍节点不稳定,选择器应使用 || 兼容多属性,并加入 try...catch 或空值判断防止脚本崩溃退出。
  • 固定微信版本或定期校准:自动化脚本对目标应用UI高度敏感。建议在测试机固定微信版本,或每次微信大版本更新后重新抓取节点特征并更新选择器。
  • 权限与环境检查:确保无障碍服务持续开启,且脚本开头包含 auto.waitFor();。权限中断或无障碍服务被系统回收会导致节点读取为空,脚本直接结束。

按上述逻辑调整遍历条件、状态记录方式与节点选择器后,即可恢复完整抓取能力。如调整后仍有特定节点无法定位,可提供 log 输出的节点属性数据,我将帮你进一步校准选择器。

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