脚本无法抓取上一次运行和这次运行期间公众号发布的所有信息,只会识别到距离这次运行最近的一篇发布文章,举例:公众号于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. 状态比对逻辑不严谨:如果脚本仅用“本次运行时间”做过滤,或去重/断点记录方式不准确,容易跳过中间时段的内容。
  3. 微信节点结构变更:微信可能调整了列表项的父容器或子节点层级,导致 find() 获取的集合不完整。

解决建议

  1. 强制滚动加载完整列表
    在抓取前循环滚动,直到无新节点加载为止,确保目标时间段内的文章全部渲染。
    // 文档地址 https://docs.hamibot.com/
    auto.waitFor();
    var list = className("androidx.recyclerview.widget.RecyclerView").findOne(3000);
    if (list) {
        while (true) {
            var countBefore = list.childCount();
            scrollDown();
            sleep(600);
            if (list.childCount() == countBefore) {
                log("列表已加载到底部");
                break;
            }
        }
    }
    
  2. 使用持久化存储记录断点
    不要依赖时间模糊匹配。使用 storages 记录上次成功抓取的最后一篇文章标题或唯一标识,本次从上往下遍历,匹配到断点即停止。
    // 文档地址 https://docs.hamibot.com/
    var storage = storages.create("wechat_mp_tracker");
    var lastTitle = storage.get("last_title", "");
    // 遍历逻辑中遇到 lastTitle 时 break,并在成功抓取后更新 storage.put("last_title", currentTitle);
    
  3. 检查遍历集合获取方式
    确保使用 find() 获取全部列表项,而不是 findOne()。微信列表项通常有固定的 classNameid,需结合 UI 查看器确认当前版本的准确选择器。

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

根本原因
微信对纯图片/海报类推文的无障碍节点结构与常规图文不同。图片文章通常缺少 text 属性,标题可能为空,或改用 desc(contentDescription)承载信息。如果脚本的选择器强依赖 text() 或固定文本匹配,会直接过滤掉这类节点。

解决建议

  1. 放宽节点匹配条件,兼容多属性
    同时检查 text()desc(),并增加兜底逻辑。
    // 文档地址 https://docs.hamibot.com/
    var items = className("android.widget.LinearLayout").find();
    for (var i = 0; i < items.length; i++) {
        var item = items[i];
        var titleNode = item.findOne(textMatches(".+"));
        var descNode = item.findOne(descMatches(".+"));
        var title = "";
        if (titleNode) {
            title = titleNode.text();
        } else if (descNode) {
            title = descNode.desc();
        } else {
            title = "[无文本标题-可能为图片推文]";
        }
        log("识别到文章: " + title);
    }
    
  2. 使用 Hamibot 无障碍调试工具定位差异
    在脚本中临时加入 log(item.className() + " | text:" + item.text() + " | desc:" + item.desc()),对比图文文章与图片文章的节点树差异。微信版本更新后,图片推文的容器 className 或层级可能已改变,需据此调整父级选择器。
  3. 避免过度过滤
    检查脚本中是否存在类似 if (!text) continue; 的硬过滤逻辑。图片文章的有效信息可能在子节点或兄弟节点中,需扩大查找范围或使用 findOne(depth) 限制层级。

通用调试与最佳实践

  • 微信更新频繁:无障碍节点结构可能随微信小版本更新而变化。建议关键操作前始终使用 findOne(timeout) 并判空,避免直接调用导致脚本崩溃退出。
  • 打印节点树排查:在选择器失效位置使用 log() 输出 childCount()text()desc()bounds(),快速定位是“没找到节点”还是“属性变了”。
  • Rhino 语法兼容:Hamibot 使用 Rhino 1.7.15 引擎,编写或修改脚本时避免使用箭头函数、默认参数、模板字符串等 ES6+ 语法,使用传统 function 和字符串拼接确保稳定运行。
  • 动态延迟替代固定 sleep:尽量用 waitFor() 或轮询节点状态替代长 sleep(),提升脚本在不同机型上的兼容性。

如果你能提供当前脚本中用于定位文章列表、判断文章类型以及记录运行状态的核心代码段,我可以直接帮你指出需要修改的选择器与逻辑位置。有其他 Hamibot 调试或自动化实现问题,随时告诉我。

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