Skip to content

🔥Android无障碍服务(AccessibilityService)开发框架,Android自动化脚本框架,快速开发复杂自动化任务、远程协助、监听等

License

Notifications You must be signed in to change notification settings

ven-coder/Assists

Repository files navigation

利用Android无障碍服务(AccessibilityService)能做什么

可以开发各种各样的自动化脚本程序以及协助脚本,比如:

  1. 微信自动抢红包
  2. 微信自动接听电话
  3. 支付宝蚂蚁森林自动浇水
  4. 支付宝芭芭农场自动施肥、自动收集能量...
  5. 各种平台的拓客、引流、营销系统
  6. 远程控制

Assists作用

基于Android无障碍服务(AccessibilityService)封装的框架

  1. 简化自动化脚本开发
  2. 为自动化脚本提供各种增强能力
  3. 提高脚本易维护性
  4. 支持html+js/vue开发自动化脚本

主要能力

  1. 易于使用的无障碍服务API
  2. 浮窗管理器:易于实现及管理浮窗
  3. 步骤器:为快速实现、可复用、易维护的自动化步骤提供框架及管理
  4. 配套屏幕管理:快速生成输出屏幕截图、元素截图
  5. 屏幕管理结合opencv:便于屏幕内容识别为自动化提供服务
  6. 封装webview接口支持html+js/vue开发自动化脚本

一些示例

基础示例 进阶示例 高级示例 图片截取
自动收能量 自动发朋友圈 自动滑动朋友圈 无障碍服务开启引导
防止下拉通知栏 通知/Toast监听 自动接听微信电话 窗口缩放&拖动
更多示例可以直接下载demo查看

📥直接下载

🚀 快速开始

1. 导入依赖

1.1 项目根目录build.gradle添加

allprojects {
    repositories {
	//添加jitpack仓库
        maven { url 'https://jitpack.io' }
    }
}

1.2 主模块build.gradle添加

最新版本:

dependencies {
    //按需添加
    //基础库(必须)
    implementation "com.github.ven-coder.Assists:assists-base:最新版本"
    //屏幕录制相关(可选)
    implementation "com.github.ven-coder.Assists:assists-mp:最新版本"
    //opencv相关(可选)
    implementation "com.github.ven-coder.Assists:assists-opcv:最新版本"
    //html+js/vue自动化脚本支持(可选,⚠️当前还处于可用但非稳定版本)
    implementation "com.github.ven-coder.Assists:assists-web:最新版本"
  
}

2. 注册&开启服务

1.1 主模块AndroidManifest.xml中注册服务

一定要在主模块中注册服务,不然进程被杀服务也会自动被关闭需要再次开启(小米可保持杀进程保持开启,其他vivo、oppo、鸿蒙机型似乎不行)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.ven.assists.simple">

    <application
        android:name="com.ven.assists.simple.App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:requestLegacyExternalStorage="true"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:usesCleartextTraffic="true">
        <!-- 添加代码 ↓-->
        <service
            android:name="com.ven.assists.service.AssistsService"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
            <!--android:priority="10000" 可提高服务在设置中的权重,排在前面-->
            <intent-filter android:priority="10000">
                <action android:name="android.accessibilityservice.AccessibilityService" />
            </intent-filter>
            <meta-data
                android:name="android.accessibilityservice"
                android:resource="@xml/assists_service" />
        </service>
      
        <!-- 或者使用下面的服务可以解决一些应用混淆节点的问题,比如微信8.0.51以上版本获取的节点元素错乱问题 -->
        <!-- ⚠️ 选其一 -->
        <service
            android:name="com.google.android.accessibility.selecttospeak.SelectToSpeakService"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
            <!--android:priority="10000" 可提高服务在设置中的权重,排在前面     -->
            <intent-filter android:priority="10000">
                <action android:name="android.accessibilityservice.AccessibilityService" />
            </intent-filter>
            <meta-data
                android:name="android.accessibilityservice"
                android:resource="@xml/assists_service" />
        </service>
      
        <!-- 添加代码 ↑-->
    </application>

</manifest>

1.2 开启服务

调用 AssistsCore.openAccessibilitySetting()跳转到无障碍服务设置页面,找到对应的应用开启服务。 服务开启后执行以下API测试是否成功集成:

AssistsCore.getAllNodes().forEach { it.logNode() }

这段代码是获取当前页面所有节点元素的基本信息在Logcat(tag:assists_log)打印出来,如下图:

至此,已成功集成Assists。如果没有任何输出请检查集成步骤是否正确。

步骤器-快速实现复杂自动化脚本

步骤器可以帮助快速实现复杂的业务场景,比如自动发朋友圈、获取微信所有好友昵称、自动删除好友...等等都是一些逻辑较多的业务场景,步骤器可帮助快速实现。

1.继承 StepImpl

直接在接口 onImpl(collector: StepCollector)写步骤逻辑,每个步骤自定义步骤的序号,用于区分执行的步骤。如果重复则会以最后一个步骤为准

class MyStepImpl:StepImpl() {
    override fun onImpl(collector: StepCollector) {
	//定义步骤序号为1的逻辑
        collector.next(1) {// 1为步骤的序号
            //步骤1逻辑
	    ...
            //返回下一步需要执行的序号,通过Step.get([序号]),如果需要重复该步骤可返回Step.repeat,如果返回Step.none则不执行任何步骤,相当于停止
            return@next Step.get(2) //将会执行步骤2逻辑
        }.next(2) {
            //步骤2逻辑
	    ...
	    //返回下一步需要执行的序号,通过Step.get([序号])
	    return@next Step.get(3)
        }.next(3) {
            //步骤3逻辑
	    ...
	    //返回下一步需要执行的序号,通过Step.get([序号])
	    return@next Step.get(4)
        }
	其他步骤
	...
    }
}

2. 开始执行

执行前请确保无障碍服务已开启

//从MyStepImpl步骤1开始执行,isBegin是否作为起始步骤,默认false
StepManager.execute(MyStepImpl::class.java, 1, isBegin = true)

3. 停止执行

// 设置停止标志,将取消所有正在执行的步骤
StepManager.isStop = true

API列表

初始化和服务管理

方法名 说明 返回值
init(application: Application) 初始化AssistsCore
openAccessibilitySetting() 打开系统无障碍服务设置页面
isAccessibilityServiceEnabled() 检查无障碍服务是否已开启 Boolean
getPackageName() 获取当前窗口所属的应用包名 String

元素查找

方法名 说明 返回值
findById(id, filterText?, filterDes?, filterClass?) 通过id查找所有符合条件的元素 List
AccessibilityNodeInfo.findById(id, filterText?, filterDes?, filterClass?) 在指定元素范围内通过id查找元素 List
findByText(text, filterViewId?, filterDes?, filterClass?) 通过文本内容查找所有符合条件的元素 List
findByTextAllMatch(text, filterViewId?, filterDes?, filterClass?) 查找所有文本完全匹配的元素 List
AccessibilityNodeInfo.findByText(text, filterViewId?, filterDes?, filterClass?) 在指定元素范围内通过文本查找元素 List
findByTags(className, viewId?, text?, des?) 根据多个条件查找元素 List
AccessibilityNodeInfo.findByTags(className, viewId?, text?, des?) 在指定元素范围内根据多个条件查找元素 List
getAllNodes(filterViewId?, filterDes?, filterClass?, filterText?) 获取当前窗口中的所有元素 List

元素信息获取

方法名 说明 返回值
AccessibilityNodeInfo.txt() 获取元素的文本内容 String
AccessibilityNodeInfo.des() 获取元素的描述内容 String
AccessibilityNodeInfo.getAllText() 获取元素的所有文本内容(包括text和contentDescription) ArrayList
AccessibilityNodeInfo.containsText(text) 判断元素是否包含指定文本 Boolean
AccessibilityNodeInfo.getBoundsInScreen() 获取元素在屏幕中的位置信息 Rect
AccessibilityNodeInfo.getBoundsInParent() 获取元素在父容器中的位置信息 Rect
AccessibilityNodeInfo.isVisible(compareNode?, isFullyByCompareNode?) 判断元素是否可见 Boolean

元素层级操作

方法名 说明 返回值
AccessibilityNodeInfo.getNodes() 获取指定元素下的所有子元素 ArrayList
AccessibilityNodeInfo.getChildren() 获取元素的直接子元素 ArrayList
AccessibilityNodeInfo.findFirstParentByTags(className) 查找第一个符合指定类型的父元素 AccessibilityNodeInfo?
AccessibilityNodeInfo.findFirstParentClickable() 查找元素的第一个可点击的父元素 AccessibilityNodeInfo?

元素操作

方法名 说明 返回值
AccessibilityNodeInfo.click() 点击元素 Boolean
AccessibilityNodeInfo.longClick() 长按元素 Boolean
AccessibilityNodeInfo.paste(text) 向元素粘贴文本 Boolean
AccessibilityNodeInfo.setNodeText(text) 设置元素的文本内容 Boolean
AccessibilityNodeInfo.selectionText(selectionStart, selectionEnd) 选择元素中的文本 Boolean
AccessibilityNodeInfo.scrollForward() 向前滚动可滚动元素 Boolean
AccessibilityNodeInfo.scrollBackward() 向后滚动可滚动元素 Boolean

示例教程

其他教程博客

获取节点信息

有问题欢迎反馈交流(微信群二维码失效可以加我拉进群)

交流群 个人微信
1群已满200人,要进1群可加我备注进1群

💝 支持开源

开源不易,您的支持是我坚持的动力!

如果Assists框架对您的项目有帮助,可以通过以下方式支持我喔:

⭐ Star支持

  • 给项目点个Star,让更多开发者发现这个框架
  • 分享给身边的朋友和同事

💰 赞助支持

  • 爱发电支持 - 您的每一份支持都是我们前进的动力
  • 一杯Coffee的微信赞赏
image

💁 付费社群

付费社群提供的服务:

  1. 完整易于阅读的开发文档
  2. Assists开发指导
  3. 开发疑难解答
  4. 群友互助资源对接
  5. 基于Assists开发的抖音养号,小红书养号,支付宝能量收集,支付宝农场,无线远程控制等源码(补充中...) image

微信扫扫即可加入

定制开发可直接联系个人微信: x39598

感谢所有的支持者,得到你们的支持我将会更加完善开源库的能力! 🚀

新增支持Html+js/vue/vite开发自动化脚本

⚠️当前处于可用但非稳定版本

本仓库源码中包含了一个通过vite编写的一个自动化脚本示例:assists-web-simple,可自行下载编译。项目中已经有编译好的vite示例在 simple/src/main/assets/assists-web-simple目录下,在当前示例App中可直接加载查看这个vite编写的自动化脚本。

assists-web是基础的web支持库,封装了webview js接口对web端调用的支持,但是对于web端本地开发调试不友好,需要了解android端相关知识

AssistsX脚本平台

为了支持本地开发调试和动态化加载脚本,特地开发了脚本平台App:AssistsX,可支持脚本的本地安装,在线安装,局域网加载,远程加载

License

GNU General Public License v3.0

About

🔥Android无障碍服务(AccessibilityService)开发框架,Android自动化脚本框架,快速开发复杂自动化任务、远程协助、监听等

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published