开宗明义:这篇文章实际上就是把我的操作记录一遍,以防以后忘记了,又要到处去搜罗。由于我是个python小白,所以这些操作都是各处学来拼到一起的,也因此我确信如果不赶紧记下来,很快就会忘掉。于是就趁热写了这随笔。


1 引言

背景

最近两个月一直在肝悠长假期这款海盗经营类的养老休(重)闲(肝)手游,说来伤心,真的我最初是冲着养老这俩字玩的,没想到啊没想到,现在竟然被动养成了生物钟,每天早上六点一醒,赶紧去收我的作物,然后就是一个小时的各种任务、配送和农活。回想以前七八点几个闹钟都喊不醒的我,现在意识到果然当一个“云农民”也不容易。

啊哈,闲话休提,今天我们要干什么呢?这就要说到这个游戏里的交易系统——集市。集市这个交易系统可谓是吐槽满满,此处不表,主要讲一下它是怎么运作的:在集市中,每个玩家可以上架各种多余的产品,也可以从架上购买其他玩家上架的自己需用的产品,就这样形成了供求。然而可想而知,不论在游戏还是在现实市场中,都会有稀缺的商品,而这种商品往往供不应求,这点在游戏中的市场尤其明显。在现实生活中,对此的解决办法是市场自动调节价格,直至稀缺的商品价格达到很高,便能自动实现供求平衡;但在这款游戏里,并不是如此,而是系统给每种产品都定好了价格,只能按照固定的价格交易,这样的话,由于基本上每个人都有购买的能力,而产品远远达不到每个人的需求,便产生了严重的供不应求。于是许多玩家专门“蹲”集市,每隔一定时间就刷新一下该产品的货架,一旦发现有上架立即抢之。然而想抢到货物总是要花费许多的时间和精力去等待,这对于我来说是严重不能忍受的(其实我还是忍受了很久,并且显然今后还要忍受)。

好吧,好多废话,其实引言可以略过不看的。这回真的回归正题,在这个集市中,我要做的事情是这样的:每隔一定时间刷新货架(因为系统有刷新冷却cd),并购买货物(注意也有购买间隔cd);当出现验证码时,自动填写验证码。

可以看见,其实前一个要求容易得很,随便一个自动点击器就可以轻松搞定;但是由于系统会定时对玩家要求填写一个简单的数字加法的验证码(这是游戏为了尝试应对集市中连点器泛滥的情况,但似乎并没有什么作用,反而让普通玩家更加艰难了),这对于一个普通的手机连点器似乎要求过高。我之前用的是,翻遍全网也没有找到相关的图片识别教程,似乎是不行的,如果有朋友能告诉我有关如何识别图片验证码的知识,实在感激不尽。于是我几经辗转用自学了不久的python希望实现这件事,但是我自己觉得自己的代码似乎颇为繁琐,尤其是识别效率堪忧,还请大家不吝赐教,帮助我提高一下自己的代码水平。

主要工具

用到了夜神模拟器;uiautomator2进行集市上的操作;tesseract进行文字识别;jupyter notebook, python 3.7.1

2 具体步骤

2.1 adb连接

在anaconda prompt中进入夜神模拟器bin目录,并输入

如图所示:

进行adb连接操作:

adb connect 127.0.:62026

ok,接下来进入打开jupyter notebook,可以用python对模拟器进行操作了。

导入库

import pytesseract
import
import time
import uiautomator2 as u2
d = u2.connect('') #进行连接

其中pytesseract用来进行验证码的识别;负责截取验证码;time用来控制点击之间的间隔;uiautomator2复杂在模拟器上进行点击和输入。

购买流程

由于我的需求是只对某一种商品进行循环刷新购买,因此先手动点到该界面。这是集市我要买的界面截图,此处我要买的是苹果。

下面是购买一次苹果需要的完整的操作,在之后对此操作循环即可。

至此购买成功,一次购买结束;当然,也有可能该商品已经售出,只不过提示不同而已,如下。

代码如下。

def buy_goods():(1300,370)#第1步,点击苹果商品,这也要求了苹果一栏必须在最上面的位置()#第2步,购买,连续买四格(300,430)#第一格()(1000,600)#确认按钮()(500,430)#第二格()(1000,600)()    (700,430)#第三格()(1000,600)()    (930,430)#第4格()(1000,600)(1)

有两点因为懒:一是automator2点击的是固定位置,这就要保持购买的商品应当在那个位置上:在我这里表现为,苹果一直处于商品栏最上面的一栏。另一是懒在连续买四格,这是因为可能有这种情况:前几格都被别人买了,但后面几格还是有货,所以就不能急着刷新(否则刷新完了或许反而没货了)。而如果第一格已经成功购买的话,也不会影响什么,只不过弹出几次冷却时间cd 的提示而已。当然,如果本来就是空的,就更是点空气了。

验证码处理

终于说到最关键的部分了,昨天为了这头大了老长时间,现在再看看,哎,真是一言难尽。

如前面所说,系统隔一段时间会给你出个小学计算题玩一玩,实现了典型的“防君子不防连点器”。诺,就是这个图。

.1 判断验证码出现

因为验证码不知道什么时候会弹出来,所以我们就在每次循环中都判断一下。怎么判断呢,在每次循环中对上面区域截图并识别文字,看识别结果是不是“输入正确答案完成验证”这几个字。如果是,那么就进入“识别输入验证码”环节,如果没有这几个字,就继续购买的循环。

pytesseract.pytesseract.tesseract_cmd = r"D:\tesseract-ocr\"#这一行是说清楚在自己电脑上的位置,不然运行时可能会报错(好像是Failed to find )。
flag = '输入正矗鲁案完咸验证\n\x0c' #笑死大牙def if_input():crop_img = .grab(bbox=(720,300,1200,360))words = (crop_img,lang='chi_sim')if words==flag:input_num()else:pass

·flag:好吧,它识别出来的结果是这几个字,我也不知道是怎么回事。不过好用就行,我发现不管它会妥妥地把“输入正确答案完成验证”几个字识别成上面的flag的,所以我们将错就错,也挺不错。

·.grab(),其中的bbox是裁剪矩形区域,分别是(左,上,右,下)。注意这里的坐标是基于电脑屏幕的坐标,而不是模拟器屏幕的坐标,这一点得和automator2的坐标操作区分开。

·(),就是把截的图转化成字符串了,这里写的是语言是简体中文(这个简中的tesseract训练数据包应该还要单独去下载,不过网上好多教程都提供了下载链接,在此表示感谢)

.2 识别验证码并输入

那么我们就来识别验证码,说来惭愧,这么简单的一件事,我竟然搞了许久,还是因为自己的python基础太不扎实了,难受。代码如下。

def input_num():crop_img = .grab(bbox=(700,400,870,530))num = (crop_img,lang='chi_sim')try:a = eval(num)except:num = (crop_img)a = eval(num)(1)(900,370)#点击输入框(1)(str(a))#输入答案(1)(960,540)#点击确认(1)(960,540)#再点一下,我也忘了为啥了(3)

代码中加上try...except是因为,tesseract识别准确率真的有点那啥,把0识别成o还是小事,把3认作g我也理解,但是把5说是v就太欺负人了。当然,并不总是这样,否则这篇随笔也不会有面世之日。不过,我意外地发现,参数加上和不加上lang='chi_sim'(即中文识别)得到的结果有时会不一样,而且有时加上会正确,有时不加上会正确。所以我干脆两个一并招工了。那么,如果都不行呢……额,那就认栽呗,尽管这真是笨得很,想知道大家有啥建议木有,诚心求教。

另外提高识别准确率的方法倒也照网上的代码试过几个,结果就是,处理了半天,图片仍是跟普通一句的识别没区别,就没再用了。

  执行

最后很简单了,我写的是酱紫。

def start(n):i = 0while(i<n):buy_goods()if_input()i +=1start(999)

循环几次可以自己定,顺便也可以统计一下平均循环几次能买到一次(因为可能点到了空气或者点到时已经售出)。

3 结语

我觉得如果python基础尚可的话,这些工作其实是一件很简单的事情,然而就因为我自学得零散又不成体系(而且基础应当算还没学完),所以真是事倍功半。不过自我安慰一下,毕竟花几个小时想这些代码也比几个小时蹲集市舒服的多,再说了,时间已经是沉默成本,无需再想什么了。


附 关于游戏集市交易机制的想法

挖个坑,对游戏集市交易机制的想法。说简单也简单,说复杂也复杂,别看许多游戏的发展路线很简单甚至很单一,但是由于游戏类型、游戏中商品性质等等的不同,会对游戏的交易机制具有很大的决定性作用。在Taptap上看见有老玩家对于悠长假期的一句评论,说“这个游戏是他见过的唯一一个毁在连点器上的”,深感触动,虽然可能又些主观情绪在内,但真的不无道理(不过现在还并没有毁哈)。改天有空结合一点经济学原理分析分析这些事情。


哦,我发现截图完全可以用uiautomator2来截图,根本不必导入一个,不过由于游戏是横屏的,处理时需要对截图旋转一下,于是用到了Image中的rotate。具体变动不补上去了。这样的话即使把模拟器最小化也照常工作不误,之前的电脑屏幕截图实在有多此一举之嫌,哈哈。

补一个实际效果图:

PHP 不跳转界面取input值进行验证_【Python】tesseract+uiautomator2+夜神模拟器 悠长假期手游集市识别验证码自动购买 - Amorius...相关推荐

  1. jq遍历table的行 取input值

    //遍历id为tableName的表格的所有行: $('#tableName tr').each(function(i){var ch = $(this).find('td:eq(4) input') ...

  2. jquery input值改变事件_前端技术--JQuery

    JQuery 一.引言 1.JQuery是一个基于javascript语言的框架 --- 是对js代码的合理封装 2.js缺点,jquery优点 ​1)js代码比较复杂 var tag = docum ...

  3. Python手写数字识别+GUI界面+手写板设计

    摘要 手写数字识别是模式识别中一个非常重要和活跃的研究领域,数字识别也不是一项孤立的技术,他涉及的问题是模式识别的其他领域都无法回避的:应用上,作为一种信息处理手段,字符识别有广阔的应用背景和巨大的市 ...

  4. 方舟手游服务器设置文件翻译,方舟生存进化手游界面中文翻译 语言不通不发愁...

    方舟生存进化手游已经上线谷歌商店了,不过只有英文版,大家是不是还在被不熟悉的界面困扰呢?下面小编就带来了方舟生存进化手游界面中文翻译,大家可以自信对照查看哦! 方舟生存进化手游界面英文翻译 disab ...

  5. Maven和Spring mvc下的页面的跳转与取值

    (此处tomcat的端口设置为80) 例如:在testForm.jsp里提交表单,在ok.jsp里取值 testForm.jsp页面代码如下: <%@ page contentType=&quo ...

  6. layui取input name_layui列表如何取input框的值

    layui列表如何取input框的值 发布时间:2020-09-21 11:30:46 来源:亿速云 阅读:374 作者:小新 这篇文章主要介绍了layui列表如何取input框的值,具有一定借鉴价值 ...

  7. iOS万能跳转界面的方法

    在开发项目中,会有这样变态的需求: 推送:根据服务端推送过来的数据规则,跳转到对应的控制器 feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我也不确定会跳转哪个界面哦 ...

  8. vue获取input的属性_vuejs 中如何优雅的获取 Input 值

    原生 js 使用 getElementById 比较麻烦的地方 需要为元素设置 id 设置 id 之后,无法复用,因为一个页面中不能存在两个相同的 id 双向绑定 v-model 分两种情况 inpu ...

  9. 【菜鸡学算法】用最笨最直观的方法讨论递归取中值时是不是陷入死循环

    错题本:分治 取中值(mid = l + r (?+1?) >> 1) 中的 l r i j 是否陷入递归死循环 所谓少壮不知道,老大徒伤悲. 被很简单的快排 代码运行状态: Memory ...

最新文章

  1. 20172329 2017-2018-2 《程序设计与数据结构》实验五报告
  2. 电视游戏会是未来客厅娱乐的主角吗?
  3. Squid安装与配置
  4. AES-256 加密 PHP实现
  5. centos svn 的搭建
  6. P5546-[POI2000]公共串【SAM】
  7. 计算机寄存器端口,CPU和外设之间的数据传送方式有哪几种
  8. 贪心算法,递归算法,动态规划算法比较与总结
  9. seaborn限制x与y的取值范围
  10. PyTorch实战福利从入门到精通之六——线性回归
  11. 计算机游戏有哪几种,这些游戏你玩过几个? 你认为最经典的电脑游戏有哪些?
  12. UE4中FString转UTF8及UTF8转FString
  13. exchange 日常管理之八:合并用户邮箱
  14. 修改保存hosts文件
  15. packet和frame区别
  16. 400 : perceived to be a client error 错误
  17. 实体操盘手开发分销商城小程序商业模式解析
  18. OpenGL学习之VS2017+glfw+glew/glad/freeglut的基本配置与中文教程汇总
  19. java画满天星_java实现的满天星效果实例
  20. Forest + IDEA = 双倍快乐,ForestX 隆重登场!

热门文章

  1. idea设置新增文件,自动添加到git
  2. Redis入门教程(一)
  3. iwconfig 安装_iwconfig linux 命令行配置无线网卡
  4. SQL语句中ON DUPLICATE KEY UPDATE column=IF(条件,值1,值2 ) 的使用
  5. 切换器黑屏_机房的KVM切换器是什么,故障如何解决?
  6. 北京理工大学计算机学院张教授,北京理工大学嵩天教授做客信息学院
  7. c语言 增加 删除 修改的功能 不用链表,不用链表,单是结构体写入文件后,是否可以进行修改删除...
  8. php in循环与for循环,详谈js中标准for循环与foreach(for in)的区别
  9. Android的自定义键盘颜色,android自定义键盘(解决弹出提示的字体颜色问题)
  10. apache php mysql是长连接吗_php关于mysql长连接问题