前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解放你的双手,陪爸妈看春晚去!

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

作者头像
张宏伦
发布2018-06-07 14:53:56
1.1K0
发布2018-06-07 14:53:56
举报
文章被收录于专栏:宏伦工作室宏伦工作室

前段时间接触了下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 !

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-02-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 宏伦工作室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用方法
  • 完整代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档