jinnrry / robothelper Goto Github PK
View Code? Open in Web Editor NEW安卓游戏自动化脚本框架|Automated script for Android games
License: GNU Affero General Public License v3.0
安卓游戏自动化脚本框架|Automated script for Android games
License: GNU Affero General Public License v3.0
出现的条件:
目前内置的文字识别方法对数字的准确度很低。游戏里很多地方要识别数字。
按键精灵有那种定义10个数字点阵的方式,准确度还挺高的,大大能否考虑下。
是不是只支持XPOSED方式,看了说明好像一定要安装xposed才可以
有些游戏优化不好,运行久了就变卡了。
在网上找过了一遍但是还是不太理解而且也没有相关基础,可以麻烦作者写一段相关代码吗,还有代码放在哪里之类的。
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)
RT, 用的自己改的magisk可以过root检测但是不能安装任何插件 也就是不能装xposed
是不是没法使用这个脚本编辑器了?
以前用过
按键精灵旧版 不支持Android10
XX助手 不支持Android10 停更
Auto.js 强制收费
Xscript 关服
想找个开源的平台,实在不想在代码迁移上折腾了
都是需要配置什么环境才能运行起来
目前没有找到可以从一个应用切换到另一个应用的方法,我的场景是这样的,在一个游戏里执行一些动作后切换到Gmail应用读取验证码,然后回到游戏来输入得到的验证码。
我觉得似乎可以取得应用包名然后用instrumentation类来做,不过具体怎么写没有想法。想请教一些作者有没有什么思路。
貌似app里调用adb命令是需要root权限的
机型: rog phone 2 (rooted)
问题: 在运行横屏程序的时候,不能正确对应屏幕旋转方向给出旋转后的坐标
解决: 临时解决办法是把x与y手动交换,并且屏幕左方朝下时需要用重新计算的新坐标 ( 1080 - y )
input方法目前是空的, 请问如何实现输入,有个方向吗大佬
这个项目挺不错,取色的工具操作不太方便,C#写了个带界面的可以自动取色生成代码。自动取选择范围的不同色,还能魔棒取色,适合像游戏那样背景变化时用。另外我结合美团的开源项目robust,实现了可以热更新,这样代码可以直接生效,项目可以加上这功能。
取色工具界面如下,希望能有用可以加入到项目
https://github.com/bigursa/comImg/blob/main/tool.gif
我点开始就提示 xp 框架加载失败
图片模板匹配成功概率有点低,还会造成crash,有什么好的配置阈值吗?
能给个安装opencv的教程吗?我试了好久都安装不成功。还有再问一下,只有这个抓图工具吗?有没有别的替代抓图工具
之前的文字识别有点不准,我把文字识别的换成调用PaddleOCR了,识别很好,现在xp框架版挺好的,可惜输入功能没实现,想问一下XP框架版有办法实现吗,有计划后边实现输入功能吗
比如点击back, home, menu之类的按键
增加几个函数
类似这种
Accessibility.getInstance().performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
不会安卓开发,给简单的列一下怎么安装或者需要什么环境,多谢
用的雷电4.0.53或者4.0.54
逍遥的 7.6.5
都是用的XP框架,同样的脚本和游戏,逍遥模拟器不会出现闪退,雷电会不定时直接退出了,就像被杀掉了一样,起初怀疑是被游戏杀了,但后来用了多款游戏,逍遥都正常,雷电还是一样不定时就直接退了。
测试了root模式,在雷电下取的坐标和点击的坐标有转向不匹配,找了资料也没解决。逍遥下root没生效。
之前用的按键精灵在雷电下跑,多开了时间长就卡,这也是我找到这里的一个原因,现在是雷电下用RobotHelper写的脚本多开跑时间长也不卡,但就是经常不定时直接退了,很难受。换成逍遥的脚本跑再长时间也不会退,但可能和逍遥模拟器本身有关,开多了有时候会几个模拟器全不动了,或者游戏中聊天窗口打开就是输入文字的时候直接卡死。
现在是彻底没用按键精灵了,在用逍遥的。雷电中因为没有任何日志,直接就退掉了,我本身不是搞android开发的技术也有限,搞不定,希望有高手来帮着排查一下雷电中闪退的原因(有偿)
问题描述:在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)
目前我有写了几个脚本,在雷电模拟器可以使用,但是我在逍遥模拟器上却出现RobotHelper停止运行的情况。想麻烦作者看看问题出在哪里,能不能解决。
1 请问这个软件是否有录制脚本的功能 就是读取玩家的触摸坐标。是用什么实现的 Instrumentation adb 还是辅助功能 请提示一下 我再去你的代码相应部分里面仔细寻找。
2 这个软件生成的apk 很大 如果多台机器安装更新一下会很吃力 有精简的版本吗。
3 让游戏无法检测是模拟器还是手机 这种可能性存在吗 业界实现了吗。
最后感谢一下作者 竟然能做出如此优秀的软件 一个人就把按键精灵一个大公司给比下去了 哈哈。还是免费的。
请问支持二值化找图吗
自己测试,找不到规律。识别同一张图片。识图后的坐标,点击不到那个图片。
有的是横坐标按比例缩放的,但纵坐标不变。有个横坐标纵坐标都缩放,但和和分辨率/DPI没法做一套自适应的算法。。。不能按比例换算。
雷电模拟器,无障碍模式,截取屏幕,720*1280 320dpi。
截取0,0,720,1280。会包含两边的黑框。导致不是实际想截取的画面。。。
是要每个机型适配,还是有匹配的方法的?大佬
bitmapCacheVertical.isRecycled() 应该改为
bitmapCacheHorizontal.isRecycled()
这个库相当不错
最开始发现个别游戏识别不到颜色,后来通过脚本中调用截图保存下来,发现脚本中取的图和模拟器自己截的不同,所以颜色有差别才识别不到的
模拟器截图是和正常看到的一样,脚本中截的图,某些文字被混入了其他的颜色
https://github.com/bigursa/comImg/blob/main/aa.jpg
目前main()里 在不停的进行点击,识图操作。
在【停止脚本】按钮加了 thread.interrupt();希望通过捕捉异常的方式停止脚本。
把脚本放在try里面。try{脚本} catch ( InterruptedException e ) {}
但基本停不下来。
我现在是在识图的方法里加了判断,然后exit。但这样直接把整个程序弄崩了。。
if(Thread.currentThread().isInterrupted()){
System.exit( 0 );
}
大佬,有没有什么好点的办法?网上查了资料,好像java里就是不太好停止一个正在运行的程序。只能一步步判断正常结束线程吗?
test
不管是root模式,还是xp模式,点击的次数超过一定次数,就无效了,不知道是不是因为往shell中写数据是有限制
我之前用这个框架写的脚本都是可以正常运行的,现在都不行了。重新编译也不行,界面正常打开,点击开始脚本没有任何反应,编译运行也没有报错。但没有执行Start方法,大家有没有遇到类似的情况?
我目的是将脚本软件安装在手机上,然后运行脚本,但是发现我的手机是安卓11,经过一番排查发现安卓11的文件存储发生了很大的变化,导致脚本并不能正常运行。
目前的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.
目前我写的脚本有需要做到荧幕的缩放,但是使用现有的函数比如down,up,moveTo来重写一个都没办法做到。因为对android及java其实不是很熟悉,所以希望作者可以写一下实现的方法,谢谢。
作者还更新吗
大神,建个交流群呗
还在维护吗
这个要怎么使用呀,能不能来个说明
我跑起来 提示我xp框架加载失败
里面有个OcrServer 和python要怎么使用?
求大佬解惑
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.