安卓自动化:Web方式实现某音未读消息检查采集
这篇文章完整记录了一个 Android 自动化实现过程:通过 Web 项目编写自动化逻辑,并在 AssistsX 中运行,完成某音 App 的未读消息检查与未读消息列表采集。 最终要实现的目标清晰明确: 自动打开某音 App 检查底部消息 Tab 是否存在未读红点 进入消息列表,逐页抓取未读会话 解
这篇文章完整记录了一个 Android 自动化实现过程:通过 Web 项目编写自动化逻辑,并在 AssistsX 中运行,完成某音 App 的未读消息检查与未读消息列表采集。
最终要实现的目标清晰明确:
- 自动打开某音 App
- 检查底部消息 Tab 是否存在未读红点
- 进入消息列表,逐页抓取未读会话
- 解析出昵称、未读数量、最后一条消息内容及时间
- 在日志浮窗中实时展示执行结果
Web 方式开发 Android 自动化需要什么
需要明确的是,这里并非要求你编写原生 Android 应用,而是开发一个 Web 插件,由 AssistsX 在 Android 端加载并执行。下面先梳理所需资源,再逐步展开实现步骤。
需要准备的两个平台
整个流程涉及两个端:
- 电脑端:用于开发 Web 项目,启动 Vite 开发服务器
- Android 手机端:安装 AssistsX,并开启无障碍服务
整体链路是这样的:Vue 页面和 assistsx-js 逻辑运行在 AssistsX 的 WebView 中,随后 AssistsX 调用 Android 的无障碍能力来操作某音 App。
需要集成哪些核心库
核心依赖是 assistsx-js,它负责桥接 Web 端代码与 Android 自动化能力。常用的功能包括:
- 查找节点:
findById、findByTags - 操作节点:点击、滚动
- 步骤编排:
Step.run、step.next - 浮窗与日志:用于展示执行过程
Web 项目选用什么框架
本项目采用 Vue 3、Vite、TypeScript、Vue Router 以及 assistsx-js。本质上仍是一个前端项目,只不过运行环境是 AssistsX 内部的 WebView,而非普通浏览器。
创建 Web 项目并配置自动化环境
从零搭建一个 assistsx-js 项目,直接使用脚手架即可快速完成:
npx create-assistsx-vue@latest my-app
cd my-app
npm run dev
上述命令会生成一个 Vue 3 + Vite + TypeScript 项目,并已集成 assistsx-js、路由、日志浮窗、测试面板及基础 Step 代码。后续只需将默认步骤替换为自己的自动化逻辑即可。
若想在当前目录初始化,也可执行:
mkdir my-app && cd my-app
npx create-assistsx-vue@latest --here
npm run dev
本文涉及的某音未读消息功能,正是在类似的项目结构上继续实现的。
如果已拉取本文源码,进入项目后先安装依赖:
npm install
然后启动开发服务:
npm run dev
项目已将 Vite 配置为局域网可访问,因此手机与电脑处于同一 Wi-Fi 时,手机可直接访问 http://电脑IP:5173。
配置插件信息
AssistsX 加载插件时会读取 public/config.json,其中包含插件名称、入口文件、图标等信息:
{
"name": "Message Automation",
"packageName": "com.dy.automation.example",
"index": "index.html",
"icon": "icon.png"
}
其中 index 指向 Web 项目的入口页面,packageName 是插件自身的包名标识,并非目标 App 的包名。
安装 AssistsX 平台并加载插件
手机端需先安装 AssistsX,安装后开启无障碍服务,并确保手机与电脑处于同一局域网。
在 AssistsX 中通过局域网加载插件,操作步骤如下:
- 电脑执行
npm run dev,手机与电脑连接同一 Wi-Fi - 打开 AssistsX,点击首页的「+」号
- 选择「扫描局域网」,等待扫描结果
- 找到本项目的开发地址(
http://电脑IP:5173),点击「安装」 - 返回首页即可看到插件,点击启动
分析某音页面节点结构
编写 Android 自动化最关键的步骤并非急于写代码,而是先观察页面节点。
例如,要点击底部的「消息」按钮,或判断某一行是否为未读消息,都需要了解这些控件在无障碍节点中的具体表现。这里可使用 AssistsX 的节点分析功能。
常规做法如下:
- 在手机上打开某音,停留在待分析的页面,如首页或消息列表页
- 在 AssistsX 中开启节点分析
- 通过电脑浏览器访问 AssistsX 提供的局域网分析地址
- 在节点树中找到目标控件
分析时需重点关注以下字段:
className:控件类型,例如android.widget.Button、android.widget.TextViewtext:界面显示的文字,如底部消息 Tab 上的未读数字des:无障碍描述,某音消息行中常将昵称、未读数、最后一条消息拼接在此id:资源 ID,某些页面可直接用它定位
掌握这些信息后,代码中即可使用 findByTags、findById、filterDes 等方法查找节点。这种方式比写死坐标更稳定,页面尺寸或手机分辨率变化时也不易失效。

实现功能入口
插件主页仅放置两个入口:
- 检查未读消息
- 获取未读消息列表
点击按钮后会打开日志浮窗,并将待执行的动作通过 query 参数传递:
void float.open(`/examples/log-panelaction=${action}`, {
showBottomOperationArea: true,
})
日志浮窗承担两项职责:一边实时显示执行日志,一边启动自动化流程。
启动流程的代码大致如下:
await Step.run(appLaunch.launch, {
data: {
appName: "DY",
packageName: "com.ss.android.ugc.aweme",
finishMethod: douyinMain.checkMainPage,
...flowData,
},
});
此处从 appLaunch.launch 开始,负责拉起某音应用。启动成功后,进入 douyinMain.checkMainPage,继续判断当前是否处于某音首页。
实现自动化流程
代码主要位于 src/steps/ 目录下。并未将所有逻辑塞入一个函数,而是拆分为多个步骤,通过 step.next() 依次推进。
整体流程如下:
启动某音
↓
确认回到某音首页
↓
检查底部消息 Tab 未读数
↓
如需收集列表,点击消息 Tab
↓
消息列表滚动到顶部
↓
逐页收集未读消息
检查未读消息较为直接:找到底部导航中的「消息,按钮」,再查看其附近是否存在纯数字的 TextView。有数字即表示存在未读。
收集未读消息列表稍显复杂。进入消息列表后,先找到屏幕内的 RecyclerView,再遍历其中的消息行。消息行通常为 android.widget.Button,未读角标位于右侧,具体内容包含在该行的 des 属性中。
例如,节点描述可能如下:
早上好咸鱼翻面,未读1条消息,hgff8分钟前
互动消息,未读1条消息,咸鱼翻面 近期访问过你的主页05/13
需要从中解析出四个字段:
nickname:昵称unreadCount:未读数量lastMessage:最后一条消息内容time:消息时间,最终转换为时间戳
若 des 中不包含 未读X条消息,则说明该行并非未读消息,直接跳过。
列表滚动时存在一个小问题:上下页之间可能重复扫到同一条消息。因此收集时会将已获取的数据存储在类变量中,若 nickname、unreadCount、lastMessage、time 四个字段均相同,则视为重复数据并跳过。
日志中最终呈现的效果类似:
【未读消息】
昵称:早上好咸鱼翻面
未读:1 条
内容:hgff
时间:2026-05-30 08:12:00
运行功能
运行前的准备条件不多:
- Android 手机已安装 AssistsX,并开启无障碍服务
- 手机已安装某音 App
- 电脑与手机处于同一局域网
- 本机具备 Node.js 环境
启动项目:
npm install
npm run dev
插件安装完成后,在 AssistsX 首页打开即可。进入插件后,点击「检查未读消息」或「获取未读消息列表」开始运行。
运行过程中,日志浮窗会持续显示当前执行进度。若流程出现偏差或需手动终止,可点击浮窗中的「停止」按钮,内部调用的是:
Step.stop()
合规说明
本文内容仅用于学习如何通过 Web 方式开发 Android 自动化。实际应用时,请严格遵守相关平台规则与法律法规,避免用于违规采集、骚扰或其他不合规场景。
