文章目录
1、简介
定时 实现对蚂蚁森林能量的自动拾取,以及帮指定好友浇水
2、开发环境搭建
语言: javaScript
开发工具:vcCode. auto.js
1)、手机安装 auto.js
我们编写的脚本就是在这个上面运行
auto.js 官网
可以下载源码自己编译 apk,
同时官网提供开发文档,帮助编写开发
或者 下载别人已经编译好的 a’p’k
autojs 下载
安装在手机上,并且设置无障碍服务
开启音量上键关闭 运行程序
2)、电脑安装vcCode
为了编写脚本方便 我们在使用 vccode 来编写代码
vccode 官网下载
3)、vcCode 安装autojs插件
4)、连接电脑端的 vcCode 和手机端的 autojs
(1).开启AutoJS插件
按 Ctrl+Shift+P
移动光标到命令Auto.js: Start Server,按回车键执行该命令。
此时VS Code会在右上角显示"Auto.js server running",即开启服务成功。
(2) 查看电脑ip
电脑 cmd 运行 ipconfig 命令,查找当前ip
(3) autojs 手机连接电脑
auto.js app 设置里点击连接电脑,输入 电脑 ip
电脑显示连接成功
3、编写功能代码
可以参考autojs 开发文档 对 功能进行开发
autojs 官方文档
1) 、使用 vcCode 进行代码编写
2) 使用 android sdk里面的 uiautomatorviewer.bat 抓取app 控件信息
3) 、运行代码
在电脑上按 F5 就能够让电脑上编写的代码直接在手机运行
4) 保存电脑上的代码到手机
按 Ctrl+Shift+P
移动光标到命令Auto.js: Sava On Device,按回车键执行该命令。
就保存到了手机上的 autojs apk 里面 ,以后可以直接在这里面运行。
5)自动拾取蚂蚁能量的参考代码
auto();// 自动打开无障碍服务
requestScreenCapture(); //请求截图
var boundTopY = 560 ; //能量区域上 自己手机上的能量区域 需要更改本机适配
var boundBomY = 820; //能量区域下
var boundLeftX = 150; //能量区域左
var boundRightX = 900; //能量区域右
var enrgyBound = 80; //自己手机能量球大小 120 取 80 跨度
var energyPoint = [220,740,360,690,490,640,610,610,750,640,890,770] //自己手机 能量球位置 ,最多六个
var waterPointX = 980; //浇水按钮x坐标
var waterPointY = 1520;
var isWaterFriend = false; //是否给好友浇水
var waterFriendList = ["小猪佩奇","灰太狼"] //浇水的 好友列表
var ownName = "自己的名字" //自己的名字
var lastPoaition = null //图片识别 容易出错,容错计算
//打开森林页面
function openForestPage(){
launchApp("支付宝") //打开支付宝
text("首页").waitFor()
sleep(500)
click("首页") //点击首页
text("蚂蚁森林").waitFor()
sleep(500)
click("蚂蚁森林") //点击蚂蚁森林
}
//拾取自己能量
function collectOwnEnergy(){
text("公益林").waitFor()
sleep(1000)
if ( null != textContains("收集能量").findOne(3000)) {
var Energys = textContains("收集能量").find() //查找所有的可以搜集的能量
for (var i = 0; i< Energys.length;i++) {
var energyBound = Energys[i].bounds()
click(energyBound.centerX(), energyBound.centerY());
}
}
}
//通过区域来点选
function collectOtherEnergyFromBound(){
for (var x = boundLeftX ; x < boundRightX;x += enrgyBound ){
for (var y = boundTopY; y < boundBomY; y += enrgyBound ){
click(x,y)
}
}
}
//通过能量球的位置来点选
function collectOtherEnergyFromPoint(){
for (var i = 0; i<energyPoint.length;i += 2){
click(energyPoint[i],energyPoint[i+1])
}
}
//拾取他人或者自己能量
function collectOtherEnergy(){
//collectOtherEnergyFromBound()
collectOtherEnergyFromPoint()
}
//点击查看更多好友
function swipToMoreFriends(){
while(!text("查看更多好友").exists()) {
swipe(device.width/2, device.height * (2/3), device.width/2, device.height/3, 1000);
}
text("查看更多好友").findOne().click()
sleep(2000)
}
//获取好友的名字 通过列表位置ByList
function getFriendNameByList(friend){
return friend.child(2).child(0).child(0).text()
}
//获取好友的名字 通过森林主页
function getFriendNameByForstTitle(){
if (id("com.alipay.mobile.nebula:id/h5_tv_title") != null){
var friendName = id("com.alipay.mobile.nebula:id/h5_tv_title").findOne(3000).text() //** **的蚂蚁森林 */
}
return friendName.slice(0,-5)
}
//判断点击的是不是自己
function judgeIfSelf(friend){
var name = getFriendNameByList(friend)
if (name == ownName) {
return true
} else {
return false
}
}
//给好友浇水
function waterFriendEnergy(){
click(waterPointX,waterPointY)
sleep(2000)
if (text("浇水送祝福").exists()) {
click("浇水送祝福")
sleep(500)
}
}
//遍历 好友列表 拾取好友能量 每个人都收
function selectFriendsEnergyByFriendList(){
while(!text("没有更多了").exists()) {
swipe(device.width/2, device.height * (5/6), device.width/2, device.height/6, 1000);
}
var friendsList = className("android.webkit.WebView").findOne().child(0).child(0).child(1) //获取好友列表
for (var i = 0;i<friendsList.childCount() ;i++){
//toast(i)
if(!judgeIfSelf(friendsList.child(i))){
friendsList.child(i).click()
sleep(2000)
collectOtherEnergy()
if (isWaterFriend) {
var waterFriend = judgeWaterDesignatedFriends(getFriendNameByList(friendsList.child(i))) //不给好友浇水 注释掉
if (waterFriend) {waterFriendEnergy()} //不给好友浇水 注释掉
}
back()
sleep(1000)
}
}
}
//根据图片 最终拾取 或 帮助好友拾取
function exeCollectOrHelpCollectEnergy(position){
if (lastPoaition == null || position.x != lastPoaition.x || position.y != lastPoaition.y ) {
toast(lastPoaition)
lastPoaition = position
} else {
swipe(device.width/2, device.height*(2/12), device.width/2, device.height/12, 1000);
return
}
lastPoaition = position
click(position.x,position.y+20)
sleep(2000)
collectOtherEnergy()
if (isWaterFriend) {
var waterFriend = judgeWaterDesignatedFriends(getFriendNameByForstTitle()) //不给好友浇水 注释掉
if (waterFriend) {waterFriendEnergy()} //不给好友浇水 注释掉
}
back()
sleep(1000)
}
//根据图片点击拾取 并且滑动
function exeSelectFriendsEnergyByHaveEnergyPicture(){
var positionCollectEnergy = getHasEnergyfriendPosition()
var positionHelpCollectEnergy = getHelpCollectEnergyfriendPosition()
if (positionCollectEnergy != null){
exeCollectOrHelpCollectEnergy(positionCollectEnergy)
} else if(null != positionHelpCollectEnergy) {
exeCollectOrHelpCollectEnergy(positionHelpCollectEnergy)
} else {
swipe(device.width/2, device.height*(3/4), device.width/2, device.height/4, 1000);
sleep(300)
}
}
//根据图片识别 只拾取 有能量的 好友
function selectFriendsEnergyByHaveEnergyPicture(){
while(!text("没有更多了").exists()) {
exeSelectFriendsEnergyByHaveEnergyPicture()
}
for(var i = 0;i<3;i++){ //图片识别最后一点会加载不出,用for 遍历循环
swipe(device.width/2, device.height*(3/4), device.width/2, device.height/4, 1000);
while(getHasEnergyfriendPosition() != null) {
exeSelectFriendsEnergyByHaveEnergyPicture()
}
}
}
//根据截屏对比 像素点,获取有能量的好友位置
function getHasEnergyfriendPosition() {
var img = captureScreen();
//img 是截取屏幕图片
//"#30bf6c" 第一个颜色
//[0, 33, "#30bf6c"] 第二颜色和它的相对坐标
//[34,45, "#ffffff"] 第三个颜色和他的相对坐标
var p = images.findMultiColors(img, "#1da06d",[[59, 0, "#1da06d"], [18,30, "#ffffff"]]);
if(p!=null){
return p;
}else {
return null;
}
}
//根据截屏对比 像素点,获取可帮助待收的好友
function getHelpCollectEnergyfriendPosition() {
var img = captureScreen();
// img 是截取屏幕图片
// "#f99137" 第一个颜色
// [0, 33, "#f99137"] 第二颜色和它的相对坐标
// [34,45, "#f99137"] 第三个颜色和他的相对坐标
var p = images.findMultiColors(img, "#f99137",[[50, 0, "#f99137"], [50,50, "#f99137"]]);
if(p!=null){
return p;
}else {
return null;
}
}
//根据普片位置获取像素
function getPointPixel(){
var img = captureScreen();
var color = images.pixel(img,1020,1395)
alert((color & 0xffffff).toString(16))
}
//给指定浇水的好友
function judgeWaterDesignatedFriends (friendName){
for (var i= 0;i< waterFriendList.length;i++) {
if (waterFriendList[i] == friendName) {
return true
}
}
return false
}
//解锁手机
function unlock(){
if(!device.isScreenOn()){
//点亮屏幕
device.wakeUp();
sleep(1000);
//滑动屏幕到输入密码界面
swipe(device.width/2, device.height/2, device.width/2, device.height/5, 1000);
sleep(1000);
id("com.android.systemui:id/key0").findOne(2000).click() //根据密码布局找到对应按键
sleep(500)
id("com.android.systemui:id/key1").findOne(2000).click()
sleep(500)
id("com.android.systemui:id/key2").findOne(2000).click()
sleep(500)
id("com.android.systemui:id/key3").findOne(2000).click()
sleep(500)
id("com.android.systemui:id/key4").findOne(2000).click()
sleep(500)
id("com.android.systemui:id/key5").findOne(2000).click()
}
}
//退出程序
function endCollectEnergy(){
back();sleep(1000);
back();sleep(1000);
back();sleep(1000);
home()
}
unlock() //解锁
openForestPage() //打开蚂蚁森林界面
collectOwnEnergy() //收取自己能量
swipToMoreFriends() //打开更多好友列表
// //selectFriendsEnergyByFriendList() //遍历所有好友 收取能量
selectFriendsEnergyByHaveEnergyPicture() //根据图片像素 收取有能量的好友
endCollectEnergy() //结束收取
因为好友页面蚂蚁森林使用html 制作,不能用元素 获取,所以不同机型需要根据自己机型设置。
具体位置 可以打开 自己开发者选项 里面的 指针位置 进行定位
图中方框 是自己机器设定的区域位置,和 能量球大小。
也可以自己定位 自己手机上 6 个能量球的位置,还有好友浇水位置这里就不展示。
其中根据图片收取能量方法:
getHasEnergyfriendPosition()
就是截取屏幕,判断图片是否有如下相对位置 和颜色都比较符合设定的 像素点,有就返回第一个像素点的位置,没有返回null
具体使用方法 看官方文档 :
findMultiColors
其中根据图片来查找 会出现一定概率的查找到别的相似图片,不如遍历所有好友稳定,但是能够节省很多时间。
最新代码:
github 源码地址
文件参考:
https://github.com/hyb1996/Auto.js