我们是用百度PaddleOCR插件实现美团上订单的数字价格识别,然后借用autojs对识别到的价格数字进行判断,符合数字条件比如,PaddleOCR识别到的订单价格为5,那么我们在AUTOJS上的价格为3就会触发抢单,其实这个操作非常方便,比人工快好几倍,几乎是毫秒及反应,我这边本地做了具体的测试,效果可以,然后这边把源码直接分享过来了,感兴趣的可以下载尝试奥。
字库源码:
//比较文字
var 数1="/storage/emulated/0/脚本1.png"
var 数2="/storage/emulated/0/脚本/2.png"
var 数3="/storage/emulated/0/脚本/3.png"
var 数4="/storage/emulated/0/脚本/4.png"
var 数5="/storage/emulated/0/脚本/5.png"
var 数6="/storage/emulated/0/脚本/6.png"
var 数7="/storage/emulated/0/脚本/7.png"
var 数8="/storage/emulated/0/脚本/8.png"
var 数9="/storage/emulated/0/脚本/9.png"
var 数点="/storage/emulated/0/脚本/点.png"
arr = [];
内容=""
总数字 = new Array(数1,数2,数3,数4,数5,数6,数7,数8,数9,数点);
//toastLog("数组"+总数字.length);
//toastLog("数组"+总数字[0]);
function 对比(图片1){
for (let b = 0; b < 总数字.length; b++) {
//images.save(img, "/sdcard/" +a + ".png");
var 本地图=images.read(图片1)
//toastLog(总数字[0])
var 字库图=images.read(总数字[b])
//images.save(字库图, "/sdcard/字库"+b+".png")
var 反馈=images.getSimilarity(本地图, 字库图, {
"type": "PNSR"
})
if(反馈==0){
arr.push(总数字[b]);
}
// toastLog(总数字.length);
}
}
//比较文字
//以上为分割图片
图片 = images.read("/storage/emulated/0/脚本/价格.png");
识别()
图片.recycle()
function 识别() {
let w = 图片.getWidth()
let h = 图片.getHeight()
let color = images.pixel(图片, 0, 0);
let xsh = images.interval(图片, color, 60)
//images.save(xsh,"/sdcard/精灵.jpg");
let bitmap = xsh.getBitmap();
let ysz = util.java.array("int", w * h);
bitmap.getPixels(ysz, 0, w, 0, 0, w, h);
let bjs = ysz[0] //背景色
let jl = [] //记录
let jz = [] //记字
for (let x = 0; x < w; x++) {
i = 0
for (let y = 0; y < h; y++) {
let ys = ysz[y * w + x]
if (ys != bjs) {
log(ys)
jz.push({
x: x,
y: y
})
i++
}
}
if (i == 0 && jz.length > 0) {
jl.push(jz)
jz = []
}
}
let jzb = [] //记坐标
for (let i = 0; i < jl.length; i++) {
let sz = jl[i]
let x = sz[0].x,
y = sz[0].y,
w = sz[0].x,
h = sz[0].y
for (var z = 1; z < sz.length; z++) {
if (sz[z].x < x) {
x = sz[z].x
}
if (sz[z].x > w) {
w = sz[z].x
}
if (sz[z].y < y) {
y = sz[z].y
}
if (sz[z].y > h) {
h = sz[z].y
}
}
jzb.push({
x: x,
y: y,
w: w,
h: h
})
}
for (let i = 0; i < jzb.length; i++) {
img = images.clip(图片, jzb[i].x, jzb[i].y, jzb[i].w-jzb[i].x, jzb[i].h-jzb[i].y)
images.save(img, "/sdcard/" +i + ".png");
对比("/sdcard/" +i + ".png")
img.recycle()
}
xsh.recycle()
//这里为识别文字
for (let i = 0; i < arr.length; i++) {
内容=内容+arr[i]
}
//这里为识别文字
//这里为读取价格
//这里为读取价格
}
//内容=内容.replace('点','.');
var str =内容
var 内容 = str.replace(/storage/g, '');
var 内容 = 内容.replace(/emulated/g, '');
var 内容 = 内容.replace(//0/g, '');
var 内容 = 内容.replace(///g, '');
var 内容 = 内容.replace(/.jpg/g, '');
var 内容 = 内容.replace(/脚本/g, '');
//var result = str.replace(///g, '');
//console.log('result:' + 内容);
// 输出 result:AbcAbcAbc
toastLog(内容)
//以上为分割图片
价格判断+自动滑动源码:
"ui";
ui.layout(
<vertical h="*" w="*">
<text textSize="16sp" textColor="black" text="软件激活码:"/>
<input id="jhm" text="xxxxxxxxxxxxxxxxxxxxxxxxxxxx"/>
<text textSize="16sp" textColor="black" text="最低预设价:(订单价>预设价=抢单)"/>
<input id="jiage" text="5"/>
<text textSize="16sp" textColor="black" text="接单一次后延迟时间(防止多抢):"/>
<input id="huadongyanchi" text="1"/>
<text textSize="16sp" textColor="black" text="滑动抢单速度:(毫秒)"/>
<input id="huadonqd" text="120"/>
<radiogroup orientation="horizontal">
<radio id="单1"text="本地识别"/>
<radio id="单2"text="百度orc"/>
</radiogroup>
<button id="启动" text=">>>只抢10元以上单【默认】" w="*" h="auto"/>
<button id="近距离" text=">>>只抢近距离单(一公里内)" w="*" h="auto"/>
<button id="只抢先抢" text=">>>只抢近距离单(一公里内)" w="*" h="auto"/>
<button id="串号" text="获取设备机器码" w="*" h="auto"/>
<button id="激活" text="点我授权设备" w="*" h="auto"/>
</vertical>
);
ui.激活.click(() => {
var 机器码=device.getAndroidId()
var 最终机器码=机器码+"1995"+"
www.xkrj5.com
"
//importClass(
java.security.Me
ssageDigest);
function md5(string) {
return java.math.BigInteger(1,
java.security.Me
ssageDigest.getInstance("MD5")
.digest(java.lang.String(string).getBytes())).toString(16);
}
var md5=md5(最终机器码)
setClip(md5);//复制当前的授权码
//toastLog(md5);
var 编辑框=ui.jhm.getText();
if(编辑框==md5)
{toastLog("恭喜您!授权成功");
var 返回= files.create("/sdcard/1995/");
// toastLog(返回)
}else{toastLog("授权失败,请填写正确的授权码")}
});
ui.串号.click(() => {
var 串号=device.getAndroidId()
toastLog("当前机器码: "+串号+" 已复制到剪贴板,请发送给作者");
setClip(串号);
});
ui.近距离.click(() => {
//全局点击刷新坐标
x坐标=225
y坐标=1296
初始化=1
//全局点击刷新坐
//全局悬浮窗位置
宽=520
高=450
悬x=600
悬y=1800
//全局悬浮窗位置
//ocr = $plugins.load("com.hraps.ocr")
var 返回= files.create("/sdcard/1995/");
if(返回==false){
console.setSize(宽,高);
console.setPosition(悬x, 悬y);
console.log('感谢骑手选择星辰抢单辅助v1.2免root稳定版!只抢高价单');
console.show()
app.launchApp("VMOS Pro");
threads.start(进入初始化)
暂停=1
arr=[1];
threads.start(距离)
}
});
ui.启动.click(() => {
//全局点击刷新坐标
x坐标=342
y坐标=1976
初始化=1
//全局点击刷新坐
//全局悬浮窗位置
宽=520
高=450
悬x=600
悬y=1800
//全局悬浮窗位置
//ocr = $plugins.load("com.hraps.ocr")
var 返回= files.create("/sdcard/1995/");
if(返回==false){
console.setSize(宽,高);
console.setPosition(悬x, 悬y);
console.log('感谢骑手选择星辰抢单辅助v1.2免root稳定版!只抢高价单');
console.show()
app.launchApp("VMOS Pro");
threads.start(进入初始化)
暂停=1
arr=[1];
threads.start(action)
}else{
toastLog("很抱歉!当前手机设备没有授权")
}
});
//初始化
function 进入初始化(){
//悬浮窗停止脚本
var window = floaty.window(
<frame gravity="center">
<button id="action" text="点我暂停检测"/>
</frame>
);
window.exitOnClose();
window.setPosition(悬x, 悬y);
window.action.click(() => {
//threads.start(zta)
//toastLog("已暂停,如需重新检测订单,请重启检测程序,一定记得开启无障碍服务奥!");
//engines.stopAll();
if (window.action.getText() == '点我暂停检测') {
// engines.execScriptFile(action);
window.action.setText('继续运行');
console.log("已进行暂停脚本运行");
暂停=9999999999999
} else {
if (window.action.getText() == '继续运行') {
// engines.execScriptFile(action);
暂停=0
threads.start(action)
console.log("已重启订单检测服务");
window.action.setText('点我暂停检测');
}
}
});
setInterval(() => {}, 1000);
//悬浮窗停止脚本
requestScreenCapture();
}
//初始化
//价格识别本地
function 价格识别(){
图片 = images.read("/storage/emulated/0/脚本/wx.png");
识别()
图片.recycle()
function 识别() {
let w = 图片.getWidth()
let h = 图片.getHeight()
let color = images.pixel(图片, 0, 0);
let xsh = images.interval(图片, color, 60)
//images.save(xsh,"/sdcard/精灵.jpg");
let bitmap = xsh.getBitmap();
let ysz = util.java.array("int", w * h);
bitmap.getPixels(ysz, 0, w, 0, 0, w, h);
let bjs = ysz[0] //背景色
let jl = [] //记录
let jz = [] //记字
for (let x = 0; x < w; x++) {
i = 0
for (let y = 0; y < h; y++) {
let ys = ysz[y * w + x]
if (ys != bjs) {
log(ys)
jz.push({
x: x,
y: y
})
i++
}
}
if (i == 0 && jz.length > 0) {
jl.push(jz)
jz = []
}
}
let jzb = [] //记坐标
for (let i = 0; i < jl.length; i++) {
let sz = jl[i]
let x = sz[0].x,
y = sz[0].y,
w = sz[0].x,
h = sz[0].y
for (var z = 1; z < sz.length; z++) {
if (sz[z].x < x) {
x = sz[z].x
}
if (sz[z].x > w) {
w = sz[z].x
}
if (sz[z].y < y) {
y = sz[z].y
}
if (sz[z].y > h) {
h = sz[z].y
}
}
jzb.push({
x: x,
y: y,
w: w,
h: h
})
}
for (let i = 0; i < jzb.length; i++) {
let img = images.clip(图片, jzb[i].x, jzb[i].y, jzb[i].w-jzb[i].x, jzb[i].h-jzb[i].y)
images.save(img, "/sdcard/脚本/分割/价格" + i + ".jpg");
img.recycle()
}
// xsh.recycle()
//判断抢单
var arr = files.listDir("/sdcard/脚本/分割");
var 数量=arr.length
toast(数量);
if(数量>=5){
toast("大于");
//进入抢单
//进入抢单
}else{
toast("小于");
//价格不符合
//价格不符合
}
}
}
//价格识别本地
//识别价格
//价格识别
//检测距离
function 距离(){
while(true){
sleep(暂停);
var src = images.read("/storage/emulated/0/脚本/xq.png");
var xq = findImage(captureScreen(), src)
//如果找到滑动图标就循环检测距离
//检测到了
if(xq!=null){
console.log("zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz")
var src = images.read("/storage/emulated/0/脚本/huadong.png");
var hd = findImage(captureScreen(), src, {
region: [0,xq.y,device.width,500],
threshold: 0.8
});
if(hd!=null){
var suiji=Math.ceil(Math.random()*80);//生
swipe(hd.x,hd.y,1000,hd.y,parseInt(滑动速度)+parseInt(suiji))
sleep(2000);
}
if(hd==null){
click(357,1881)
}
//检测到了
}else{
console.log("m")
click(357,1881)
}
}
}
//检测距离
//剪辑价格
function action(){
//导入插件
//ocr = $plugins.load("com.hraps.ocr")
sleep(5000);
本地 =ui.单1.isChecked()
百度= ui.单2.isChecked()
var 接单延迟=ui.huadongyanchi.getText();
var 激活码=ui.jhm.getText();
var 最低价格=ui.jiage.getText();
var 延迟时间=ui.shijian.getText();
var 滑动速度=ui.huadonqd.getText();
toastLog("准备初始化数据,启动软件");
sleep(500);
//全局检测义
while(true){
sleep(暂停);
}
}