专栏首页宏伦工作室解放你的双手,陪爸妈看春晚去!

解放你的双手,陪爸妈看春晚去!

前段时间接触了下Auto.js(https://github.com/hyb1996/Auto.js),很好上手而且挺有意思,于是写了个微信红包监测脚本,完整代码见文末

大概思路是,不断获取手机屏幕截图,发现新消息则进入,如果进一步发现了红包,则点击红包并打开

由于Auto.js只能在安卓上安装,所以脚本同样仅适用于安卓

Auto.js简介

  • 适用于安卓的脚本工具
  • 一个主要由无障碍服务实现的,不需要Root权限的自动操作软件
  • 可以实现自动点击、滑动、输入文字、打开应用等功能

更详细的介绍可以参考项目官方Github

下载链接如下,https://github.com/hyb1996/Auto.js/releases,下载最新的apk文件到手机并安装即可

软件界面如下,包括多个标签页:

  • 脚本:查看当前已有的脚本(Scripts)
  • 教程:Auto.js官方文档
  • 社区:Auto.js交流社区
  • 示例:大量的示例代码
  • 管理:对当前运行中的脚本进行管理,例如全部终止等

简而言之,你可以按照Auto.js的语法(主要是JavaScript)来编写脚本,然后通过Auto.js运行,从而完成一些手机上的自动化任务

使用方法

让微信回到主界面,即不让要微信处于聊天页、朋友圈等状态

在手机上运行Auto.js软件,点击左上角的三条横线,在菜单栏中打开 无障碍服务 和 稳定模式,便于Auto.js完成截屏、模拟按压等自动化操作

回到软件主界面,在 脚本 标签页中,点击右下角的加号,选择 文件,名称取为 微信红包,点 确定 保存,即可进入脚本的编辑页面

将完整代码复制到脚本中,点击 保存,之后点击 运行 即可

手机会自动跳转到微信中,首先检测一些相关参数(例如消息起始位置、每行消息的高度等),然后便会按照代码中定义的时间间隔(即倒数第三行sleep函数中的数字,以毫秒为单位),不断监测新消息并执行操作

完整代码

console.show(); // 设备信息 var WIDTH = device.width, HEIGHT = device.height, TYPE = device.brand + ' ' + device.model; device.keepScreenOn(); log('欢迎使用微信红包辅助'); console.setSize(parseInt(WIDTH * 0.58), parseInt(WIDTH * 0.7)); console.setPosition(parseInt(WIDTH * 0.36), 0); // 获取截图权限 if (!requestScreenCapture()) { toast('请求截图失败,程序结束'); exit(); } // 启动微信 launchApp('微信'); sleep(1000); var check = false; // 是否检测过布局 var lineHeight; // 每行消息的高度 var redX = 0; // 消息红点X坐标 var startX; // 每行消息开始的X坐标 var startY; // 第一行消息开始的Y坐标 var white = 255; // 消息行背景色 var gray = 153; // 文字的颜色 var totalCount = 0; // 总共获取的红包数量 var loopCount = 0; // 已循环的次数 do { // 获取截图 var img = captureScreen(); // 检测布局 if (!check) { log('===== 检测布局中 ====='); // 寻找有像素的X起点 var sx = 0; for (let c = 0; c < WIDTH; c++) { if (colors.red(images.pixel(img, c, parseInt(HEIGHT * 0.4))) > 0 && colors.red(images.pixel(img, c, parseInt(HEIGHT * 0.6))) > 0) { sx = c; break; } } // 寻找startY for (let r = 0; r < HEIGHT; r++) { var point = images.pixel(img, sx, r); var red = colors.red(point), green = colors.green(point), blue = colors.blue(point); if (Math.abs(red - white) + Math.abs(green - white) + Math.abs(blue - white) <= 15) { // 找到startY startY = r; log('第一行起始Y坐标', startY); break; } } // 寻找lineHeight var jump = false; for (let r = startY; r < HEIGHT; r++) { var point = images.pixel(img, sx, r); var red = colors.red(point), green = colors.green(point), blue = colors.blue(point); if (Math.abs(red - white) + Math.abs(green - white) + Math.abs(blue - white) > 60) { jump = true; } if (Math.abs(red - white) + Math.abs(green - white) + Math.abs(blue - white) <= 15 && jump) { // 找到lineHeight lineHeight = r - startY; log('每行高度:', lineHeight); break; } } // 寻找startX var y1 = startY + parseInt(lineHeight * 0.581), y2 = startY + parseInt(lineHeight * 0.806); var error = {}; for (let c = lineHeight; c < parseInt(WIDTH * 0.5); c++) { error[c] = 0; // 每列的颜色误差 for (let y = y1; y < y2; y++) { var point = images.pixel(img, c, y); var red = colors.red(point), green = colors.green(point), blue = colors.blue(point); error[c] += Math.abs(red - white) + Math.abs(green - white) + Math.abs(blue - white); } if (error[c] == 0 && redX == 0) { // 找到redX redX = c; log('红点X坐标:', redX); } if (c > lineHeight && error[c - 1] <= 15 * (y2 - y1) && error[c] > error[c - 1]) { // 找到startX startX = c; log('消息起始X坐标', startX); break; } } log('===== 布局检测完毕 ====='); check = true; } // 检查前三条消息 for (let m = 0; m < 3; m++) { var redY = startY + parseInt((0.12 + m) * lineHeight) var point = images.pixel(img, redX, redY); var red = colors.red(point), green = colors.green(point), blue = colors.blue(point); if (red > 240 && green < 80 && blue < 80) { // 有未读消息 click(redX, redY + parseInt(0.5 * lineHeight)); sleep(600); // 寻找红包颜色 var chat = captureScreen(); for (let k = parseInt(HEIGHT * 0.9); k > parseInt(HEIGHT * 0.1); k--) { var point = images.pixel(chat, parseInt(WIDTH * 0.5), k); var red = colors.red(point), green = colors.green(point), blue = colors.blue(point); if (Math.abs(red - 250) + Math.abs(green - 158) + Math.abs(blue - 59) <= 15) { // 找到红包 click(parseInt(WIDTH * 0.5), k); sleep(800); // 寻找“开” chat = captureScreen(); var count = 0; for (let y = parseInt(HEIGHT * 0.4); y < parseInt(HEIGHT * 0.8); y++) { var point = images.pixel(chat, parseInt(WIDTH * 0.5), y); var red = colors.red(point), green = colors.green(point), blue = colors.blue(point); if (Math.abs(red - 235) + Math.abs(green - 205) + Math.abs(blue - 153) <= 15) { count += 1; } } if (count > HEIGHT * 0.4 * 0.1) { // 有“开”,点击! click(parseInt(WIDTH * 0.5), parseInt(HEIGHT * 0.55)); sleep(1000); // 查看是否抢到了 chat = captureScreen(); var count = 0; for (let y = parseInt(HEIGHT * 0.4); y < parseInt(HEIGHT * 0.8); y++) { var point = images.pixel(chat, parseInt(WIDTH * 0.5), y); var red = colors.red(point), green = colors.green(point), blue = colors.blue(point); if (Math.abs(red - 255) + Math.abs(green - 255) + Math.abs(blue - 255) <= 15) { count += 1; } } if (count > HEIGHT * 0.4 * 0.3) { totalCount += 1; } } back(); sleep(600); break; } } back(); sleep(600); } } loopCount += 1; log('已监测', loopCount, '次,抢到', totalCount, '个'); sleep(1000); // break; } while (true);

Have Fun !

本文分享自微信公众号 - 宏伦工作室(HonlanFarm),作者:张宏伦

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-02-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 地铁有多挤,生活就有多不易

    张宏伦
  • 全栈 - 4 Python 先学会基本语法

    张宏伦
  • 一键上妆的BeautyGAN

    作者也很nice地给出了自建的数据集,包括1116张无妆图、2720张有妆图,在官方网站提供了下载链接

    张宏伦
  • 动态显示下拉框内容

    过了冬至,你在北方瑟瑟发抖,我在广东秋风瑟瑟~ 最近小编经常梦回母校~放一张母校的美图! 年底了,又到了预订报刊的时候! 肯定有人会问,这年头还有谁看报刊...

    用户1332619
  • 病人个人健康知识图表(CS AI)

    现有的患者数据分析平台无法整合具有上下文、个人和针对患者的信息。为了使推荐系统对查询做出适当的响应或从患者数据中获得有意义的见解,它应该考虑有关患者健康历史的个...

    用户7095611
  • 文化和旅游发展保障有力 | 共国庆·悦文旅

    ? ? ? ? 编辑| 张聪聪 审核| 孙晖 来源| 中国文化报 ?

    腾讯文旅
  • 浅谈原理--hashCode方法

    每增加一个元素,我们就可以通过equals方法判断集合中的每一个元素是否重复,但是如果集合中有10000个元素了,我们每添加一个元素的时候,就需要进行10000...

    Arebirth
  • Python+树莓派制作IoT(物联网)门控设备

    因为考虑需要在户外使用这套物联网门控设备,所以利用树莓派完成这个设备有两个问题需要解决, 第一是需要解决树莓派和相关模块的供电问题。 第二就是需要户外没有宽带网...

    緣來
  • Flutter完整开发实战详解(六、 深入Widget原理)

    作为系列文章的第六篇,本篇主要在前文的探索下,针对描述一下 Widget 中的一些有意思的原理。

    恋猫
  • Java设计模式-单例模式-懒汉式-同步代码块

    1)这种方式,本意是想对懒汉式-线程安全这种方式进行的改进,因为前面同步方法效率太低,改为同步产生实例化的代码块

    桑鱼

扫码关注云+社区

领取腾讯云代金券