Giter Site home page Giter Site logo

robothelper's Introduction

issues forks stars lincense Codacy grade

RobotHelper

这是做什么的?

一个安卓自动化脚本的框架。包含了自动化辅助开发常用的点击,找点,文字识别等功能。具体开发说明参见 wiki

该框架主要是方便Android游戏、爬虫项目的快速开发。比按键精灵等商业软件扩展性强,比AutoJS等更轻量,更适合二次开发。

支持无缝切换使用无障碍、Root、xposed三种方式提权实现点击等模拟操作。

Demo

更多使用参见 cn.xjiangwei.RobotHelper.GamePackage.Main类代码和Wiki说明

Point point = Image.findPointByMulColor(ScreenCaptureUtil.getScreenCap(), "434FD7,65|0|414DDB,90|55|46CDFF,5|86|5FA119");
Robot.tap(point);

以上代码将会在屏幕中查找 图标,然后点击这个图标(你直接运行这段代码可能不会成功,因为你的手机屏幕尺寸跟我不一样)

String s = TessactOcr.img2string(ScreenCaptureUtil.getScreenCap(0,0,200,30), "chi_sim", "", "");
MLog.info("文字识别结果:" + s);

以上代码将输出(0,0)到(200,30)这个矩形区域内的文字。

chi_sim表示语言为简体中文,默认语言包只有chi_sim和eng(英语)

你可以自己引入TessactOcr所支持的任意语言。语言包下载

未来规划

  • 1.整体重构,将框架拆分为业务进程和Work进程,业务进程通过消息通知的方式向Work进程发送请求
  • 2.支持脚本暂停、停止等操作
  • 3.业务进程、Work进程支持跨机器部署,支持网络调用,方便群控需求
  • 4.业务进程脚本支持热更新

Thanks

Thanks for all these great works that make this project better.

robothelper's People

Contributors

jinnrry avatar zx900930 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

robothelper's Issues

没连接usb进行模拟点击会导致手机卡主

出现的条件:

  1. 在Root的机器上面
  2. 用你的RootInput或者InstrumentationInput作为点击类
  3. 不要连接usb线
    按照上面的步骤,模拟点击的次数多了,会导致整个手机卡主。这个时候如果连接usb线,就恢复了。不管这个usb是连接到电脑,还是充电宝,都可以。一旦断开usb,就会出现手机卡主的情况。初步怀疑是终端要通过usb输出数据,发现没法输出的时候,导致了整个手机卡了。

无法在逍遥模拟器Android7.1.2版本使用

目前我有写了几个脚本,在雷电模拟器可以使用,但是我在逍遥模拟器上却出现RobotHelper停止运行的情况。想麻烦作者看看问题出在哪里,能不能解决。

截取部分画面,会出现坐标轴偏移的问题

雷电模拟器,无障碍模式,截取屏幕,720*1280 320dpi。
截取0,0,720,1280。会包含两边的黑框。导致不是实际想截取的画面。。。
是要每个机型适配,还是有匹配的方法的?大佬

这个框架还可以正常运行吗?

我之前用这个框架写的脚本都是可以正常运行的,现在都不行了。重新编译也不行,界面正常打开,点击开始脚本没有任何反应,编译运行也没有报错。但没有执行Start方法,大家有没有遇到类似的情况?

root模式下,点击次数的限制

不管是root模式,还是xp模式,点击的次数超过一定次数,就无效了,不知道是不是因为往shell中写数据是有限制

能否考虑增加支持数字识别?

目前内置的文字识别方法对数字的准确度很低。游戏里很多地方要识别数字。
按键精灵有那种定义10个数字点阵的方式,准确度还挺高的,大大能否考虑下。

是不是暂时不支持Android模拟器

模拟器 网易Mumu
Android: 6.0.1
ExecTypeAccessibillty 无障碍
Accessibility状态:已加载
opencv加载成功
取点成功
然后执行点击的时候 提示
image
获得无障碍权限后重启过模拟器还是一样的提权错误
是不是无障碍也只支持Android 7 或者8 以上的?
PS: Android 10 无障碍 一点启动直接死机,log停留在opencv加载成功

切换应用的办法

目前没有找到可以从一个应用切换到另一个应用的方法,我的场景是这样的,在一个游戏里执行一些动作后切换到Gmail应用读取验证码,然后回到游戏来输入得到的验证码。

我觉得似乎可以取得应用包名然后用instrumentation类来做,不过具体怎么写没有想法。想请教一些作者有没有什么思路。

关于Toast函数显示时长

目前的Toast函数没办法更改显示时长,我自己有尝试重载了一个,但是还是没有显示更久,想请问怎么做?
附上代码:

//Toast.java

package cn.xjiangwei.RobotHelper.Tools;

import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.os.Vibrator;

import cn.xjiangwei.RobotHelper.MainApplication;

import static android.content.Context.VIBRATOR_SERVICE;

public class Toast {

/**
 * Toast提示
 * @param msg
 */
public static void show(final String msg) {
    Handler handler = new Handler(Looper.getMainLooper());
    handler.post(new Runnable() {
        public void run() {
            android.widget.Toast.makeText(MainApplication.getInstance(), msg, android.widget.Toast.LENGTH_LONG).show();
        }
    });
}

/**
 * Toast提示
 * @param msg
 * @param duration
 */
public static void show(final String msg,int duration) {
    Handler handler = new Handler(Looper.getMainLooper());
    handler.post(new Runnable() {
        public void run() {
            android.widget.Toast.makeText(MainApplication.getInstance(), msg, duration).show();
        }
    });
}

/**
 * 声音提示
 */
public static void notice() {
    Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    Ringtone r = RingtoneManager.getRingtone(MainApplication.getInstance(), notification);
    r.play();
    Vibrator vibrator = (Vibrator) MainApplication.getInstance().getSystemService(VIBRATOR_SERVICE);
    vibrator.vibrate(1000);
}

}

//Main.java

package cn.xjiangwei.RobotHelper.GamePackage;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;

import org.opencv.android.Utils;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

import java.io.IOException;
import java.io.InputStream;

import cn.xjiangwei.RobotHelper.MainApplication;
import cn.xjiangwei.RobotHelper.Tools.Image;
import cn.xjiangwei.RobotHelper.Tools.MLog;
import cn.xjiangwei.RobotHelper.Tools.Point;
import cn.xjiangwei.RobotHelper.Tools.Robot;
import cn.xjiangwei.RobotHelper.Tools.ScreenCaptureUtil;
import cn.xjiangwei.RobotHelper.Tools.TessactOcr;
import cn.xjiangwei.RobotHelper.Tools.Toast;

import static android.os.SystemClock.sleep;

public class Main {
private static final String SD_PATH = Environment.getExternalStorageDirectory().getPath();

/**
 * 在这个函数里面写你的业务逻辑
 */
public void start() {
    sleep(5000); //点击开始后等待5秒后再执行,因为状态栏收起有动画时间,建议保留这行代码



    /****************************  模板匹配demo  *******************************/
    InputStream is = null;
    try {
        is = MainApplication.getInstance().getAssets().open("Chrome_Icon_bmp.bmp");
    } catch (IOException e) {
        e.printStackTrace();
    }

    Bitmap bitmap = BitmapFactory.decodeStream(is);

    Toast.show(bitmap.toString());

    //在当前屏幕中查找模板图片
    Point point = Image.matchTemplate(ScreenCaptureUtil.getScreenCap(), bitmap, 0.7);
    MLog.info("找到模板", point.toString());
    Toast.show(point.toString());


    // 点击找到的这个图
    Robot.tap(point);
    Toast.show("tap!");


    /**************************** 文字识别demo  **********************************/
    try {
        //识别素材文件中的ocrTest.png图片中的文字
        is = MainApplication.getInstance().getAssets().open("ocrTest.png");
    } catch (IOException e) {
        e.printStackTrace();
    }
    bitmap = BitmapFactory.decodeStream(is);
    String res = TessactOcr.img2string(bitmap, "chi_sim", "", "");
    MLog.info("文字识别结果:" + res);

    Toast.show(res,10000);


    /*****************************  特征点找图  ************************************/
    //当前屏幕中查找chrome图标(特征点是3120X1440分辨率手机制作)
    point = Image.findPointByMulColor(ScreenCaptureUtil.getScreenCap(), "434FD7,65|0|414DDB,90|55|46CDFF,5|86|5FA119");
    //点击chrome图标
    Robot.tap(point);



    /***** 提示  *****/
    Toast.show("运行结束!");
    //声音提示
    Toast.notice();

}

}

能告诉我你的安卓环境吗

我在android studio 4.11上 使用雷电模拟器64 运行截图失败了.我发现你的源码使用 gradle5.11.
能说说你正常运行的android studio版本和使用的什么模拟器吗  .安卓模拟器推荐用什么版本啊? 现在是安卓11.

交流

大神,建个交流群呗

图片模板匹配

图片模板匹配成功概率有点低,还会造成crash,有什么好的配置阈值吗?

游戏会检测xposed和Magisk root

RT, 用的自己改的magisk可以过root检测但是不能安装任何插件 也就是不能装xposed
是不是没法使用这个脚本编辑器了?

以前用过
按键精灵旧版 不支持Android10
XX助手 不支持Android10 停更
Auto.js 强制收费
Xscript 关服

想找个开源的平台,实在不想在代码迁移上折腾了

可以适配安卓11吗?

我目的是将脚本软件安装在手机上,然后运行脚本,但是发现我的手机是安卓11,经过一番排查发现安卓11的文件存储发生了很大的变化,导致脚本并不能正常运行。

没有可以进行荧幕缩放的函数

目前我写的脚本有需要做到荧幕的缩放,但是使用现有的函数比如down,up,moveTo来重写一个都没办法做到。因为对android及java其实不是很熟悉,所以希望作者可以写一下实现的方法,谢谢。

图片匹配报错

2021-01-23 15:56:58.623 31535-32038/? E/cv::error(): OpenCV(3.4.1) Error: Assertion failed (info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 || info.format == ANDROID_BITMAP_FORMAT_RGB_565) in void Java_org_opencv_android_Utils_nBitmapToMat2(JNIEnv*, jclass, jobject, jlong, jboolean), file /build/master_pack-android/opencv/modules/java/generator/src/cpp/utils.cpp, line 37
2021-01-23 15:56:58.624 31535-32038/? E/org.opencv.android.Utils: nBitmapToMat caught cv::Exception: OpenCV(3.4.1) /build/master_pack-android/opencv/modules/java/generator/src/cpp/utils.cpp:37: error: (-215) info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 || info.format == ANDROID_BITMAP_FORMAT_RGB_565 in function void Java_org_opencv_android_Utils_nBitmapToMat2(JNIEnv*, jclass, jobject, jlong, jboolean)
2021-01-23 15:56:58.624 31535-32038/? E/AndroidRuntime: FATAL EXCEPTION: Thread-4
Process: cn.xjiangwei.RobotHelper, PID: 31535
CvException [org.opencv.core.CvException: OpenCV(3.4.1) /build/master_pack-android/opencv/modules/java/generator/src/cpp/utils.cpp:37: error: (-215) info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 || info.format == ANDROID_BITMAP_FORMAT_RGB_565 in function void Java_org_opencv_android_Utils_nBitmapToMat2(JNIEnv*, jclass, jobject, jlong, jboolean)
]
at org.opencv.android.Utils.nBitmapToMat2(Native Method)
at org.opencv.android.Utils.bitmapToMat(Utils.java:93)
at org.opencv.android.Utils.bitmapToMat(Utils.java:102)
at cn.xjiangwei.RobotHelper.Tools.Image.matchTemplate(Image.java:417)
at cn.xjiangwei.RobotHelper.GamePackage.Main.start(Main.java:46)
at cn.xjiangwei.RobotHelper.Service.RunTime.lambda$new$0(RunTime.java:12)
at cn.xjiangwei.RobotHelper.Service.-$$Lambda$RunTime$RDwjJ76_1WI5ryoCtkMEOSbuaCo.run(Unknown Source:0)
at java.lang.Thread.run(Thread.java:919)

不同分辨率有办法点到相同的按钮么

自己测试,找不到规律。识别同一张图片。识图后的坐标,点击不到那个图片。
有的是横坐标按比例缩放的,但纵坐标不变。有个横坐标纵坐标都缩放,但和和分辨率/DPI没法做一套自适应的算法。。。不能按比例换算。

请问一下一些脚本的功能

1 请问这个软件是否有录制脚本的功能 就是读取玩家的触摸坐标。是用什么实现的 Instrumentation adb 还是辅助功能 请提示一下 我再去你的代码相应部分里面仔细寻找。

2 这个软件生成的apk 很大 如果多台机器安装更新一下会很吃力 有精简的版本吗。

3 让游戏无法检测是模拟器还是手机 这种可能性存在吗 业界实现了吗。

最后感谢一下作者 竟然能做出如此优秀的软件 一个人就把按键精灵一个大公司给比下去了 哈哈。还是免费的。

适配rooted机器屏幕旋转问题

机型: rog phone 2 (rooted)
问题: 在运行横屏程序的时候,不能正确对应屏幕旋转方向给出旋转后的坐标
解决: 临时解决办法是把x与y手动交换,并且屏幕左方朝下时需要用重新计算的新坐标 ( 1080 - y )

opencv 安装问题

能给个安装opencv的教程吗?我试了好久都安装不成功。还有再问一下,只有这个抓图工具吗?有没有别的替代抓图工具

我有个小问题

这个要怎么使用呀,能不能来个说明
我跑起来 提示我xp框架加载失败
里面有个OcrServer 和python要怎么使用?
求大佬解惑

尝试使用回收的位图错误如何解决?

问题描述:在ScreenCaptureUtil.getScreenCap时,有时会抛出如下错误
2021-01-26 23:19:11.760 2294-3396/cn.xjiangwei.RobotHelper E/AndroidRuntime: FATAL EXCEPTION: Thread-12
Process: cn.xjiangwei.RobotHelper, PID: 2294
java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@f8ae68c
at android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1271)
at android.graphics.Canvas.drawBitmap(Canvas.java:1368)
at android.graphics.Bitmap.createBitmap(Bitmap.java:807)
at android.graphics.Bitmap.createBitmap(Bitmap.java:701)
at android.graphics.Bitmap.createBitmap(Bitmap.java:681)
at cn.xjiangwei.RobotHelper.Tools.ScreenCaptureUtil.getScreenCap(ScreenCaptureUtil.java:49)
at cn.xjiangwei.RobotHelper.Tools.ScreenCaptureUtil.getScreenCap(ScreenCaptureUtil.java:108)
at cn.xjiangwei.RobotHelper.GamePackage.Main$9.run(Main.java:617)
at java.lang.Thread.run(Thread.java:761)

雷电模拟器中不定时闪退

用的雷电4.0.53或者4.0.54
逍遥的 7.6.5
都是用的XP框架,同样的脚本和游戏,逍遥模拟器不会出现闪退,雷电会不定时直接退出了,就像被杀掉了一样,起初怀疑是被游戏杀了,但后来用了多款游戏,逍遥都正常,雷电还是一样不定时就直接退了。
测试了root模式,在雷电下取的坐标和点击的坐标有转向不匹配,找了资料也没解决。逍遥下root没生效。
之前用的按键精灵在雷电下跑,多开了时间长就卡,这也是我找到这里的一个原因,现在是雷电下用RobotHelper写的脚本多开跑时间长也不卡,但就是经常不定时直接退了,很难受。换成逍遥的脚本跑再长时间也不会退,但可能和逍遥模拟器本身有关,开多了有时候会几个模拟器全不动了,或者游戏中聊天窗口打开就是输入文字的时候直接卡死。
现在是彻底没用按键精灵了,在用逍遥的。雷电中因为没有任何日志,直接就退掉了,我本身不是搞android开发的技术也有限,搞不定,希望有高手来帮着排查一下雷电中闪退的原因(有偿)

关于中断脚本的问题

目前main()里 在不停的进行点击,识图操作。
在【停止脚本】按钮加了 thread.interrupt();希望通过捕捉异常的方式停止脚本。
把脚本放在try里面。try{脚本} catch ( InterruptedException e ) {}
但基本停不下来。
我现在是在识图的方法里加了判断,然后exit。但这样直接把整个程序弄崩了。。
if(Thread.currentThread().isInterrupted()){
System.exit( 0 );
}

大佬,有没有什么好点的办法?网上查了资料,好像java里就是不太好停止一个正在运行的程序。只能一步步判断正常结束线程吗?

取色工具

这个项目挺不错,取色的工具操作不太方便,C#写了个带界面的可以自动取色生成代码。自动取选择范围的不同色,还能魔棒取色,适合像游戏那样背景变化时用。另外我结合美团的开源项目robust,实现了可以热更新,这样代码可以直接生效,项目可以加上这功能。
取色工具界面如下,希望能有用可以加入到项目
https://github.com/bigursa/comImg/blob/main/tool.gif

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.