脚本无法抓取上一次运行和这次运行期间公众号发布的所有信息,只会识别到距离这次运行最近的一篇发布文章,举例:公众号于7:00、9:00、10:00:11:00分别发布了四篇文章,脚本第一次运行为8:00,可以抓到7:00的这篇文章;第二次运行为12:00,就只能抓到11:00这篇文章,中间9:00、10:00这两篇文章就抓不到(以前不会这样)。第二个问题是,脚本没有办法抓取图片文章(以前是可以的)。
回答
这两个问题通常由微信客户端无障碍节点结构变更与脚本遍历/状态记录逻辑不匹配导致。微信频繁更新会改变列表渲染方式和节点属性,原有选择器或循环条件失效后就会出现漏抓或识别异常。以下是针对性解决方案:
问题一:漏抓两次运行期间的中间文章
根本原因
- 微信公众号列表采用虚拟滚动与懒加载,脚本未充分触发滚动或等待节点渲染,导致中间文章未加载到无障碍树中。
- 状态记录逻辑不严谨。仅依赖时间字符串或固定索引比对,微信更新后时间格式或节点顺序变化,导致脚本提前
break或跳过未处理项。
解决方法
- 改用唯一标识持久化记录
不要依赖时间比对。提取文章链接中的mid或无障碍节点中的稳定属性作为唯一ID,使用storages模块保存上次处理的位置。// 文档地址 https://docs.hamibot.com/ var storage = storages.create("mp_article_sync"); var lastId = storage.get("last_processed_id", ""); - 完善滚动与加载机制
遍历前必须确保列表充分加载。使用滑动配合节点等待,避免读取未渲染的虚拟节点。// 文档地址 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); } - 优化遍历与终止条件
从列表顶部向下遍历,提取每项的唯一标识。遇到与lastId相同的项时停止,并将本次抓取的第一项ID更新为新的lastId。避免使用固定长度或索引作为循环边界。
问题二:无法抓取纯图片文章
根本原因
纯图片文章在无障碍树中的节点结构与图文文章不同。通常缺少 text 属性,依赖 desc 或特定的 ImageView 容器。微信版本更新后,图片文章的父容器类名或属性可能已变更,导致原选择器过滤掉了该类节点。
解决方法
- 多属性兼容选择器
同时监听text、desc及子节点特征,增加容错分支。// 文档地址 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); // 你的常规文章处理代码 } } - 使用 Hamibot 调试工具校准节点
在脚本开头添加auto.waitFor();,运行后使用 Hamibot 的「布局范围分析」或「节点查看」功能,对比图文文章与图片文章的当前节点树。重点记录图片文章的className、desc和层级路径,替换脚本中失效的选择器。
调试与最佳实践建议
- 打印节点属性排查:在遍历循环内使用
log(node.className() + " | " + node.text() + " | " + node.desc());输出当前微信版本的实际节点数据,快速定位选择器失效位置。 - 避免强依赖单一属性:微信无障碍节点不稳定,选择器应使用
||兼容多属性,并加入try...catch或空值判断防止脚本崩溃退出。 - 固定微信版本或定期校准:自动化脚本对目标应用UI高度敏感。建议在测试机固定微信版本,或每次微信大版本更新后重新抓取节点特征并更新选择器。
- 权限与环境检查:确保无障碍服务持续开启,且脚本开头包含
auto.waitFor();。权限中断或无障碍服务被系统回收会导致节点读取为空,脚本直接结束。
按上述逻辑调整遍历条件、状态记录方式与节点选择器后,即可恢复完整抓取能力。如调整后仍有特定节点无法定位,可提供 log 输出的节点属性数据,我将帮你进一步校准选择器。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实