目录

前言

一、滑动点击&截图

二、图片比对

三、文字识别

四、与Excel联动

总结

部分源码展示:


前言

乱斗不过是个过气的网易弃游罢了。

额,虽然但是,作为在安卓2战区享有一定知名度的打工仔,每天无脑上100来个号,重复几个固定操作也是着实让我有点厌恶。因此,我乘着寒假这几天用尽毕生所学写了个自动买礼包的python程序,实现了从自动买礼包到自动记录在Excel上的一系列小功能。这一举动也成功将我带上了自动化耕作的道路,从此解放了双手,过上了幸福美满的生活(狗头)。

这个脚本的终极目标是买礼包与记录,分解下来只需要实现以下几个功能即可:滑动点击、截取图片、图片比对、文字识别、操作Excel表格。

下面我来一一介绍如何解决。

一、滑动点击&截图

其实实现这一步是比较简单的,一开始我用的模块PyMouse,直接操纵鼠标对雷电模拟器进行操作,后面发现这实在是太拉了:首先得固定雷电模拟器的分辨率和桌面上的相对位置,每次位置必须一样程序才有效,其次运行期间我打不了LOL啥的,甚至不能操作鼠标。显然这不能满足我的要求。于是我另寻他法,发现了雷电模拟器的新天地--adb,直接调用雷电的内部命令行,轻易的实现了目的操作。

安装好雷电模拟器之后,大家可以在安装目录下面找到ldconsole.exe和ld.exe两个命令行程序。ld命令用来执行adb命令,而ldconsole.exe更是重量级,它可以控制模拟器参数的设定,包括imei,序列号,手机号分辨率等等参数,还可以检测和控制模拟器的启动和关闭。甚至能够模拟输入,按键,滑动等操作。

以下是用来自雷电论坛官方论坛中的提示写的几个简单函数:

def touch(index: int, x: int, y: int):  # 点击Dnconsole.touch(index, x, y, 0)time.sleep(0.5)def touch_01(index: int, x: int, y: int, z: int, w: int):  # 长按Dnconsole.touch(index, x, y, 0)for i in range(0, z):Dnconsole.touch(index, x, y, 0)time.sleep(w)def swipe(index: int, x1: int, y1: int, x2: int, y2: int):  # 滑动A = [x1, y1]B = [x2, y2]Dnconsole.swipe(index, A, B)time.sleep(1.5)

截图功能虽然简单,但是里面没有现成的,我摸索着搞出了一个函数:

def screen(index: int):cmd = "adb -s 127.0.0.1:5559 shell screencap -p /sdcard/Pictures/Screenshots/two.png"os.popen(cmd)time.sleep(0.5)

-p后面是截图保存的地址,-s后面是模拟器的序列号,在cmd中输入adb devices即可得到。

关于截图其实还有一个小问题,那就是局部截图。比如下图我只想要币的数字所在局部图,如何实现呢?

其实很简单啦,在这张截图的基础之上再裁剪一次就ok了,如下:

import cv2
file_path = 'D:/PycharmProjects/ldxd.UE/Screenshots/two.png'  #图片地址
im = cv2.imread(file_path)
im = im[91:113, 766:808]   #裁剪范围
save_path_file = os.path.join('D:/PycharmProjects/ldxd.UE/Screenshots/currency.png')
cv2.imwrite(save_path_file, im)

演示效果如下:

啊~  传视频好麻烦,算了。。。

二、图片比对

这个功能的目的是判断游戏目前在什么界面,如果出现了告示栏,而且里面有6元包,这时候该执行什么,如果是另外的又该执行什么。要实现这个功能就比较easy了,因为站里面相关资源比较多,我找了个哈希差值比对,输入俩图片地址,输出差异值,值越小越相似。亲测效果还行。

def dHash(img):# 缩放8*8img = cv2.resize(img, (9, 8), interpolation=cv2.INTER_CUBIC)# 转换灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)hash_str = ''# 每行前一个像素大于后一个像素为1,相反为0,生成哈希for i in range(8):for j in range(8):if gray[i, j] > gray[i, j + 1]:hash_str = hash_str + '1'else:hash_str = hash_str + '0'return hash_str# Hash值对比
def cmpHash(hash1, hash2):n = 0# hash长度不同则返回-1代表传参出错if len(hash1) != len(hash2):return -1# 遍历判断for i in range(len(hash1)):# 不相等则n计数+1,n最终为相似度if hash1[i] != hash2[i]:n = n + 1return n# 哈希差值
def valunhash(img1, img2):  # img图片地址img1 = cv2.imread(img1)img2 = cv2.imread(img2)hash1 = dHash(img1)hash2 = dHash(img2)n = cmpHash(hash1, hash2)# print('差值哈希算法相似度:' + str(n))return n

三、文字识别

为了识别“6元”(其实也可以用图片比对)和“币数”这俩玩意儿,我采用了百度智能云中的文字识别模块,个人感觉比较nice。使用方法就不赘述了,我找了个教程供大家参考学习,不懂的可以评论区再问。

from aip import AipOcr#以下在百度智能云中获取
APPP_ID = '  '
API_KEY = '  '
SECRET_KEY = ' '
client = AipOcr(APPP_ID, API_KEY, SECRET_KEY)# 文字识别
def character(filepath):#输入图片地址i = open(filepath, 'rb')img = i.read()message = client.basicGeneral(img)string = '';for i in message.get('words_result'):string += i.get('words')return string

四、与Excel联动

这个功能的实现在站里遍地都有,我用的是openpyxl模块。目的就是每个小号收完币后记录在相应的表格之中,以便后续查看。示意如下:

b = int(b)
workbook = openpyxl.load_workbook("three.xlsx")  #打开Excel文件
worksheet = workbook.worksheets[0]               #载入第一张表格
worksheet.cell(j, 2, b)                          #第j-1行和第2列的那个格子填上b
workbook.save(filename="three.xlsx")             #保存并关闭

总结

不难发现,虽然步骤多,但都是比较简单的,而且组合起来效果奇佳。学会了这个其他的功能就可以自己去开发了(比如截技能~~)(我可没截过技能)。欢迎批评指正。

部分源码展示:

import os
import time
import cv2
import openpyxl
from aip import AipOcr
from ldconsole import DnconsoleAPPP_ID = ' '
API_KEY = ' '
SECRET_KEY = '  '
client = AipOcr(APPP_ID, API_KEY, SECRET_KEY)# 文字识别
def character(filepath):i = open(filepath, 'rb')img = i.read()message = client.basicGeneral(img)string = '';for i in message.get('words_result'):string += i.get('words')return string# 截图
def screen(index: int):if index == 1:cmd = "adb -s 127.0.0.1:5557 shell screencap -p /sdcard/Pictures/Screenshots/one.png"os.popen(cmd)if index == 2:cmd = "adb -s 127.0.0.1:5559 shell screencap -p /sdcard/Pictures/Screenshots/two.png"# cmd = "adb -s emulator-5558 shell screencap -p /sdcard/Pictures/Screenshots/two.png"os.popen(cmd)if index == 3:cmd = "adb -s 127.0.0.1:5561 shell screencap -p /sdcard/Pictures/Screenshots/three.png"os.popen(cmd)if index == 4:cmd = "adb -s 127.0.0.1:5557 shell screencap -p /sdcard/Pictures/Screenshots/four.png"os.popen(cmd)time.sleep(0.5)# 差值感知算法
def dHash(img):# 缩放8*8img = cv2.resize(img, (9, 8), interpolation=cv2.INTER_CUBIC)# 转换灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)hash_str = ''# 每行前一个像素大于后一个像素为1,相反为0,生成哈希for i in range(8):for j in range(8):if gray[i, j] > gray[i, j + 1]:hash_str = hash_str + '1'else:hash_str = hash_str + '0'return hash_str# Hash值对比
def cmpHash(hash1, hash2):n = 0# hash长度不同则返回-1代表传参出错if len(hash1) != len(hash2):return -1# 遍历判断for i in range(len(hash1)):# 不相等则n计数+1,n最终为相似度if hash1[i] != hash2[i]:n = n + 1return n# 哈希差值
def valunhash(img1, img2):  # img图片地址img1 = cv2.imread(img1)img2 = cv2.imread(img2)hash1 = dHash(img1)hash2 = dHash(img2)n = cmpHash(hash1, hash2)# print('差值哈希算法相似度:' + str(n))return ndef touch(index: int, x: int, y: int):Dnconsole.touch(index, x, y, 0)time.sleep(0.5)def swipe(index: int, x1: int, y1: int, x2: int, y2: int):A = [x1, y1]B = [x2, y2]Dnconsole.swipe(index, A, B)time.sleep(1.5)def select(index: int):touch(index, 542, 435)  # 点击6元time.sleep(3.5)touch(index, 660, 493)  # 点击支付time.sleep(25)touch(index, 265, 106)  # 查看告示栏time.sleep(0.5)touch(index, 265, 106)  # 查看告示栏time.sleep(0.5)touch(index, 541, 430)  # 点击领取time.sleep(1)touch(index, 135, 238)  # 点击空白touch(index, 432, 107)  # 点击连城礼touch(index, 486, 443)  # 点击领取time.sleep(1)touch(index, 135, 238)  # 点击空白touch(index, 321, 45)touch(index, 532, 207)  # 点击领取touch(index, 135, 238)  # 点击空白touch(index, 135, 238)  # 点击空白address_01 = 'D:/PycharmProjects/ldxd.UE/Screenshots/one.png'
address_02 = 'D:/PycharmProjects/ldxd.UE/Screenshots/two_2.png'
x = [429, 670]
y = [108, 178, 253, 328, 394, 467]# 检查是否闪退
def check(index: int):touch(index, 644, 196)Dnconsole.invokeapp(index, 'com.netease.ldxy.ewan.x7sy')time.sleep(1)screen(index)if index == 2:a = valunhash('D:/PycharmProjects/ldxd.UE/Screenshots/two.png','D:/PycharmProjects/ldxd.UE/Screenshots/compare.png')if index == 1:a = valunhash('D:/PycharmProjects/ldxd.UE/Screenshots/one.png','D:/PycharmProjects/ldxd.UE/Screenshots/compare.png')if a < 5:time.sleep(5)touch(index, 381, 437)  # 确定协议time.sleep(30)touch(index, 755, 121)  # 上次登录time.sleep(5)touch(index, 481, 459)  # 点击确定# 换区函数
def handoff(index: int, number: int, i: int):if i <= 16:touch(index, 572, 398)time.sleep(1.5)touch(index, 248, 340)  # 选择2战区if i > 11:Dnconsole.swipe(2, [545, 466], [545, 28], 10100)time.sleep(0.8)a = x[i % 2]b = y[(int(i / 2)) % 6]touch(index, a, b)touch(index, 478, 454)  # 进入touch(index, 478, 454)  # 进入def screen_small(index: int):if index == 2:file_path = 'D:/PycharmProjects/ldxd.UE/Screenshots/two.png'im = cv2.imread(file_path)im = im[91:113, 766:808]save_path_file = os.path.join('D:/PycharmProjects/ldxd.UE/Screenshots/currency.png')cv2.imwrite(save_path_file, im)if index == 1:file_path = 'D:/PycharmProjects/ldxd.UE/Screenshots/one.png'im = cv2.imread(file_path)im = im[91:113, 766:808]save_path_file = os.path.join('D:/PycharmProjects/ldxd.UE/Screenshots/currency.png')cv2.imwrite(save_path_file, im)def rent(index: int):time.sleep(1.8)screen(index)time.sleep(2)if index == 2:has = valunhash(address_02, 'D:/PycharmProjects/ldxd.UE/Screenshots/goinx7_02.png')if index == 1:has = valunhash(address_01, 'D:/PycharmProjects/ldxd.UE/Screenshots/goinx7_02.png')if has < 4:select(index)# touch(index, 97, 37)  # 点击人物头像# touch(index, 700, 431)  # 退出游戏if 4 <= has <= 14:touch(index, 135, 238)  # 点击空白栏# touch(index, 97, 37)  # 点击人物头像# touch(index, 700, 431)  # 退出游戏if has > 14:touch(index, 266, 106)  # 点击告示栏time.sleep(0.5)screen(index)screen_small_02(2)if index == 2:has = valunhash(address_02, 'D:/PycharmProjects/ldxd.UE/Screenshots/two_2.reference.png')if index == 1:has = valunhash(address_01, 'D:/PycharmProjects/ldxd.UE/Screenshots/goinx7_02.png')if 3 < has <= 14:touch(index, 135, 238)  # 点击空白栏# touch(index, 97, 37)  # 点击人物头像# touch(index, 700, 431)  # 退出游戏if has < 4:select(index)# touch(index, 97, 37)  # 点击人物头像# touch(index, 700, 431)  # 退出游戏def check_01(j):index = 2;touch(index, 135, 238)  # 点击空白touch(index, 326, 110)  # 点击珍宝轩time.sleep(1)screen(2)time.sleep(0.5)screen_small(index)a = valunhash('D:/PycharmProjects/ldxd.UE/Screenshots/currency.png','D:/PycharmProjects/ldxd.UE/Screenshots/sam.png')if a < 3:workbook = openpyxl.load_workbook("one.xlsx")worksheet = workbook.worksheets[0]worksheet.cell(j + 1, 2, 1)workbook.save(filename="one.xlsx")else:b = character('D:/PycharmProjects/ldxd.UE/Screenshots/currency.png')if b == ' ':workbook = openpyxl.load_workbook("one.xlsx")worksheet = workbook.worksheets[0]worksheet.cell(j + 2, 2, '出错')workbook.save(filename="one.xlsx")else:b = int(b)workbook = openpyxl.load_workbook("one.xlsx")worksheet = workbook.worksheets[0]worksheet.cell(j + 2, 2, b)workbook.save(filename="one.xlsx")touch(index, 97, 37)  # 点击人物头像touch(index, 700, 431)  # 退出游戏def screen_small_02(index: int):if index == 2:file_path = 'D:/PycharmProjects/ldxd.UE/Screenshots/two.png'im = cv2.imread(file_path)im = im[261:370, 346:748]save_path_file = os.path.join('D:/PycharmProjects/ldxd.UE/Screenshots/two_2.png')cv2.imwrite(save_path_file, im)if index == 1:file_path = 'D:/PycharmProjects/ldxd.UE/Screenshots/one.png'im = cv2.imread(file_path)im = im[261:370, 346:748]save_path_file = os.path.join('D:/PycharmProjects/ldxd.UE/Screenshots/one_2.png')cv2.imwrite(save_path_file, im)'''
workspace workspace workspace workspace
workspace workspace workspace workspace
workspace workspace workspace workspace
workspace workspace workspace workspace
workspace workspace workspace workspace
workspace workspace workspace workspace
workspace workspace workspace workspace
workspace workspace workspace workspace
'''
for j in range(0, 17):index = 2time.sleep(1)handoff(index, 1, j)rent(index)check_01(j)

关于坐标的确定可用PicPick。

基于雷电模拟器的python脚本(乱斗西游2自动收礼包)相关推荐

  1. 安卓setclicklistener函数没有_金主脚本按键精灵安卓按键初体验—乱斗西游2自动签到...

    按键精灵安卓按键初体验-乱斗西游2自动签到 金猪脚本(原飞猪脚本)以按键精灵教学为主,涉及UiBot,Python,Lua等脚本编程语言,教学包括全自动办公脚本,游戏辅助脚本,引流脚本,网页脚本,安卓 ...

  2. 乱斗西游2服务器修改,为我们的友谊干杯《乱斗西游2》转服功能邀你面基

    世界上最遥远的距离不是生与死,而是我们在玩同一款游戏,而却不在同一个服务器!为了让有情人终成眷属.基友基情得到质的飞跃,全面革新的网易超人气MOBA手游<乱斗西游2>转服功能开启测试.目前 ...

  3. 乱斗西游2辅助 强力辅助排行一览

    在乱斗西游2中,辅助英雄是重要的战力之一,那么卓易市场给大家带来了游戏中的辅助排行,希望玩家们能够在游戏中及时的获取这些英雄哦~先跟小编一起看看排行吧!    铁扇公主 铁扇公主是目前热门的辅助英雄, ...

  4. 乱斗西游2服务器没响应,乱斗西游2月3日维护_无法连接服务器公告_蚕豆网新闻...

    <乱斗西游>的玩家今日可能都遇到了登陆不上游戏,无法连接当前服务器的情况.这是什么情况呢?官方也一直没有相关提示.原来由于本周游戏最大规模的更新,服务器出现了一些小问题,正在临时维护中,以 ...

  5. 鸿蒙石boss 怎么杀,乱斗西游帮派boss怎么打,掉落,打法详细介绍攻略

    乱斗西游帮派boss怎么打,掉落,打法详细介绍攻略已经由未来小编为大家整理好了,在下面会详细为大家介绍,接下来就一起来看看吧,希望大家喜欢. 乱斗西游帮派boss怎么打?很多玩家都在抱怨为什么自己的伤 ...

  6. 乱斗西游中获得英雄碎片的途径有哪些

    手机网络游戏免费下载平台上的一款手游--乱斗西游,引起了疯狂的下载量.对于一款英雄集成类的游戏,我们该怎么收集一些英雄碎片,升级英雄呢?今天,就跟随着小编的步伐去看一下乱斗西游怎么获得英雄碎片吧. 想 ...

  7. 鸿蒙石boss 怎么杀,乱斗西游帮派boss烛龙怎么抗

    满意答案 fvelmibq 2015.09.29 采纳率:48%    等级:10 已帮助:919人 跟麒麟差不多,主要注意的是boss会击退技能,要手控抗BOSS的.还有就是3个英雄都会收到伤害,全 ...

  8. 荒野乱斗手游怎么在电脑上玩 荒野乱斗手游模拟器教程

    <荒野乱斗>是Supercell旗下开发的全新射击游戏.游戏将每场对战时间定为3分钟,玩家可以在3分钟内享受有别以往的刺激玩法,体验你来我往的激烈对决.游戏除有3v3玩法,还包含3位玩家对 ...

  9. 《基于Unity的2D多人乱斗闯关游戏设计与开发》--小组博客综述

    文章目录 项目名称 项目背景 项目简介 项目架构 项目特色 大致功能需求 游戏模式/内容 项目技术选型 项目分工 项目具体计划 此次项目实训不完全按照项目计划书进行,因为游戏范围太广,可能随时调整游戏 ...

最新文章

  1. SQL反模式笔记17——用一条sql解决复杂问题
  2. shell 取中间行的第一列_shell脚本的使用该熟练起来了,你说呢?(篇三)
  3. 【算法】动图展示八大常用排序算法,一次看个够!
  4. Gitlab 项目上传
  5. jpa多表关联查询_Spring Boot 整合mybatis如何自定义 mapper 实现多表关联查询
  6. linux 如何查看属性,linux 下查看系统属性
  7. ​​2021快手母婴行业数据价值报告
  8. Mysql慢查询操作梳理
  9. m1芯片Mac安装jekyll+搭建GitHub pages个人博客站点
  10. java模拟dos窗口
  11. js中改变原数组的方法以及解决改变原数组的方法
  12. 爬取豌豆荚app数据(总结篇)
  13. 第一行代码 第二版pdf及源码(分享)
  14. Phodal 的 2018 节点:Think Big Be Long
  15. 英语在线听力翻译器_英语翻译_在线英语听力室
  16. 正圆锥体空间方程_数值模拟偏微分方程的三种方法:FDM、FEM及FVM
  17. hihocoder01串
  18. Netty 实现一对一客户端聊天(由服务器转发)
  19. 易失性存储DRAM详解
  20. iFixit是被破拆解Galaxy Fold?Galaxy Fold的问题点

热门文章

  1. Low-cost Sensor-enabled Freehand 3D Ultrasound
  2. 软件测试黑盒用例文档,看完这篇黑盒测试用例编写教程,我豁然开朗
  3. 【模块】ESP32终于连上PS4手柄了,满满的都是经验和泪水
  4. Dubbo学习(一)
  5. 保护你的数据安全,了解网络安全法!
  6. 微信小程序开发入门教程(三)
  7. 硬币问题(随机生成假硬币 找出它的位置)
  8. 搜外蜘蛛池属于什么模式?
  9. KISS原则(Kiss Principle)
  10. 平面左右手坐标系与旋转矩阵的碎碎念