上一期链接:

我是是不是补齐两个作答QQ小流程的(一)

脱离Windows

他们要先把二维倚赖去掉,彻底除去对二维应用软件的倚赖,那要想配套措施用PC间接操纵者Android智能手机了, 这要加进他们以后说到的adb了,先普及两个常识,Android是Google的儿子,Google非官方有许多有关Android开发很有用的流程,adb是这种两个小东西,adb的全称Android Debug Bridge,自此已经开始和从前不那样了,以后他们用的全都是建模的介面,比如说工具包啊、二维啊,滑鼠点选啊,都能间接的看到,而adb已经开始是小墨镜了,你要从那个配置文件小询问处输出许多指示来顺利完成操作了。比如说在配置文件输出adb input tap 200 200,adb会通过充电器来操纵者你的智能手机点选(200,200)那个直方图。

笔者也是极少用配置文件辅助工具……从前都是能用有介面的用有介面的,已经开始尝试adb的时候很伤痛,查了许多数据资料,每一步都要去试验那个是干什么用的,掌握了adb的基本采用,能采用adb的功能去顺利完成上两个板块中他们实现的路子。然而看了许多数据资料之后觉得adb也没所以可怕,没有介面而已,但是本质上是把以后的许多表达式替换呵呵,比如说把截屏从采用Python截屏的表达式改成采用adb指示来截屏能了,截屏座标再次测量呵呵,消除对Windows的倚赖之后,甚至不须要像以后那样计算相对座标,采用windows的api查询询问处。点选事件由以后的控制滑鼠点选,换成采用adb发送点选座标请求来顺利完成。

很伤痛的是课程表须要再次存档,因为智能手机的解析度的原因,你二维在萤幕上的解析度不是智能手机的原生植物解析度,仔细看知道,它是智能手机介面的两个增大,如果他们笔记本电脑上那个二维大小不一发生了变化,他们以后的标识符都没用了,他们又说了一次倚赖的恐怖……

那那时他们再次存档课程表,路子完全相同,存档点选的座标。不过以后的座标是在windows上的,他们能采用qq截屏这种的小东西来看有多少直方图,但是那时不行了,那时小东西在Android上,于是我整配套措施……

我是是不是补齐两个作答QQ小流程的(二)插图

左边每两个纵线对应的是它的纵座标,横座标他们以后说过,ABCD在一条斜线上,横座标是完全相同的,所以只须要看要选的点上下相近的一条线,简单估计呵呵能了。他们存档完课程表,这种的标识符又能完全跑起来了。同时它不倚赖二维和Windows了,你把你的智能手机插到其他人笔记本电脑上,如果课程表复制过去,adb环境配置好,能在N57Cpp笔记本电脑上刷题。

思考:说是除去倚赖,只不过是换了个辅助工具,以后是对二维应用软件的倚赖,那时是对adb组件的倚赖,不过这种更平衡。因为二维应用软件是两个第三方的小东西,依照试验,笔记本电脑萤幕上没有表明完整的Android网页,而要按比例增大了许多,所以说明那个二维应用软件,会依照完全相同的笔记本电脑完全相同的解析度完全相同的萤幕大小不一有完全相同的表明效果,这些都叫做不平衡的不利因素,不平衡的不利因素越多,流程越不平衡。而adb是非官方发布的组件,它对完全相同Android设备都有网络连接(只不过是Vertus的网络连接),这种的组件不平衡的不利因素极少,倚赖于这种的小东西,会让你的标识符更平衡。

举个更实际的例子,比如说以后的标识符倚赖Windows和二维应用软件,换两个笔记本电脑换两个二维应用软件可能标识符间接失效了。而那时采用了adb,消除了对Windows和二维应用软件的倚赖,你换个笔记本电脑,换个解析度,换个系统,如果adb环境配好了,你的标识符仍然能用,因为它变成了对当前智能手机的倚赖。如果你那个智能手机不变,随便换笔记本电脑,它都能运行。

抓包

用完adb一身轻松,那时能插根充电器打开流程后台刷题了,不用继续操控我的滑鼠了,不过它仍然倚赖着智能手机设备,是说,我换一台智能手机设备,以后存档的课程表信息失效了,于是我已经开始寻找脱除设备倚赖的技术。

以后他们提过,我在次做的时候觉得那个题目整体是一张图片,但是那时再次思考,它不可能是一张图片,完全相同的智能手机ABCD的位置是不那样的,萤幕窄一点,表明的题目短一点,萤幕宽一点呢,现实的题目长一点。图片肯定不会这么自适应,所以题目和答案一定是许多文本,然后那个表明题目有两个模板,在模板上的对应位置把文本放上去能了。之后让那个模板适应智能手机的萤幕。这种才能解释完全相同智能手机表明的效果完全相同。

如果题目和答案都是文本的话,背景是两个模板,那他们所看到的那个小流程的网页,和正常的网络网页很相像了,正常的网络网页也是这种,两个模板留好多的空位,然后两个两个把数据放上去,成了网页。那是不是能用网络爬虫的路子做?不过正常的网页我爬过,智能手机的小流程我没爬过啊……而且这是智能手机上的小流程,我笔记本电脑上也访问不到,是不是看到数据呢?

又一通查数据资料,终决定用抓包来解决问题,什么是抓包?他们能思考呵呵通信流程,他们点选作答,然后小流程给我返回随机五十道题,然后我不停地答,答完了提交。那想呵呵,是谁给他们返回这随机的五十道题呢?是QQ吗?QQ肯定不会管这么多事,小流程所以多,不会是QQ非官方给你当服务器。是小流程自己吗?这里查了许多数据资料,小流程本质上是依附QQ存在的,没有这么大的权限在你智能手机里调用那个调用那个。那只剩两个情况了,是有两个服务器在做这件事。他们把那个过程画个图:

我是是不是补齐两个作答QQ小流程的(二)插图1

那是智能手机向服务器发两个数据请求,服务器返回数据,这是非常简化之后的过程了,那个请求也不叫请求,发送过去的和接收回来的,都叫数据包,他们把这些数据包获取到,叫抓包。

抓吧,百度一大通智能手机抓包的数据资料,终找到了charles那个应用软件,按照网络教程配置好,抓包……失败,抓包……失败。包能能抓到,但是点进去什么都看不到,有些包能表明,有些包会告诉我unknown,不让我看。那不行,又查数据资料解决那个问题,了解到了只不过各类网站能分为两类,仔细看域名能发现,有的是http开头,有的是https开头,查数据资料了解http和https的区别之后,大概明白了https的基本原理,是你想抓到http的包很容易,一抓抓到了,但是https的包呢,须要两个叫证书的小东西,没那个证书你不能抓,抓了也看不了。那个证书你能看做是访问https数据包的许可证,没证不行。

那解决那个问题吧,那个问题还是蛮多人遇到的,一查能查到,给智能手机装个证书,给笔记本电脑装个证书,能抓到了。次抓包让我非常惊喜,有这种的包:

我是是不是补齐两个作答QQ小流程的(二)插图2

右边这一堆……似乎……题和答案间接给我了?我按照上面的作答顺序试了试,果然不错,间接按照那个作答行。那还是不行啊……我只抓到了题目和答案的包,不过没有网页模板的包,虽然告诉我答案ABCD了,但是我不知道那个ABCD对应萤幕的啥地方啊。

那我得想配套措施获取那个网页模板的数据包,但是是不是抓都抓不到……然后我放弃了,想配套措施去绕过那个问题。

思考:笔者后来想到,可能有两种方法会导致我抓不到包。一种是那个网页模板包含在了小流程里面,而我没法获得小流程的源码,另一种是可能那个网页是缓存在智能手机里了,每次加进的时候间接从智能手机内部取,而不是从服务器获取,能采用清除QQ应用数据的策略,再次抓包,试验看能不能抓到。

没有模板的包是不是办,那我能不能用Android的许多小东西来获取元素的位置呢,像两个网站网页那样,是HTML文件,每个数据都是找到自己的坑位放在那里。那我应该想配套措施通过Android来获得许多小东西啊。好像随便两个浏览器,假如他们不看网页标识符,他们是是不是看到这些元素的呢?这些元素是是不是找到自己的位置把自己放上去的呢?

只不过不是元素把自己放上去的,是浏览器把他们放上去的,给元素找到正确的位置放到它对应的位置上,那个过程叫渲染,是浏览器的工作,浏览器看到的本质上是两个网页模板,加上许多数据,他们却能看到完整的网页,那个工作只不过都是浏览器做的。于是做爬虫的,能通过浏览器的许多辅助工具或者接口来获得网站网页上的数据。同样的,QQ也有自己的渲染,那个把数据放到对应的位置上应该是QQ那个app做的,而QQapp是倚赖Android系统的,那他们能不能用Android系统的许多小东西来获取到数据呢?

答案那必然是能,前提是要查足够多的数据资料。查到Google给Android提供的开发组件中,有两个叫uiautomator的小东西,它是帮助开发者做网页的,但是反过来,它也能帮助开发者拆网页。又查了许多关于那个辅助工具的采用,简单学习了呵呵,发现adb中集成了两个和它有关的指令,能采用那个指令来获取到两个XML文件,XML本质上来说和正常的文本没什么两样,是它多了许多小东西,那个文件是这种的:

我是是不是补齐两个作答QQ小流程的(二)插图3

XML只不过是给许多文本贴了标签,同时这些标签有上下级关系,两个标签能包含另两个标签,比如说大的那个背景网页包含了题目标签、选项标签等等,而题目标签里面包含了题目文本,选项标签包含了选项的文本,和选项的许多属性,比如说那个bounds属性,是他们想要的,它标志着那个选项在什么位置。

好了,OK了,大功告成,他们的路子完美的成了两个闭环,通过抓包获取题目和答案,再通过uiautomator+adb获取题目答案位置,再通过adb点选位置,路子非常清晰,而且比他们版做得不知道高到哪里去了。

那问题来了,能通过抓包间接解决问题吗?是须要我做一次题抓一次包吗?只不过是不行的,charles能抓包是能抓包,但是Python没法控制它,也不能间接的从charles中获取数据包,意思是说,Python不能间接获取到题目的数据和答案。那咋办?那他们能延续以后那样的路子,构建课程表,通过抓包来构建包含所有题的课程表。

我遍想的路子是每次抓包获取数据,都将那个数据复制出来,交给Python处理,虽然Python不能间接从charles中获取数据,但是处理许多json数据还是手到擒来的。但是那个过程很苦逼,不像是两个高智慧的流程员干的事,那想配套措施自动化吧。

那个时候应该看看数据包了,他们只顾着能看到数据,却忘了数据是不是来的,看呵呵请求,思考呵呵,如果数据包不是从QQ小流程里面发出去的,而要我自己随便发的,或者是从浏览器间接访问那个url来发起请求,或者我用Python构造两个请求,是否可行?

是否可行那得试呵呵,用Python构造了呵呵请求,看呵呵返回的数据,看完舒服了,和QQ小流程发的请求返回的数据一模那样。那我只须要发足够多完全相同的请求,每次获取到的50道题相互叠加,慢慢的能构成两个完整地课程表了。

接下来能机械的做许多劳动了,比如说已经开始作答,退回已经开始介面,已经开始作答,退回已经开始介面,直到请求足够多了,把这些请求网址复制到两个文本文件中,让Python读取那个文本文件,对每两个网址都发两个请求,把这些获取到的数据叠加起来,课程表构建顺利完成了。

伪标识符呼之欲出:

while 1:    通过uiautomator获取题目文本    通过题目文本搜索课程表获取答案    通过uiautomator获取答案的座标    通过adb点选答案座标

简单易懂,到这里问题他们已经解决了90%了,还有后两个没通过的点,是不是通过uiautomator获取题目文本,uiautomator返回的是两个XML文件啊,虽然题目文本什么的都包含在里面,不过里面的关系错综复杂,是不是用标识符提取出来?不能每次都自己看一遍XML文件人工提取出来题目文本来给Python输出进去吧?

那个时候我的爬虫基础发挥作用了,在XML文件中读取两个小东西,能加进xpath的小东西,不过已经忘了差不多了……再次打开w3cschool学了呵呵,而Python有许多能操纵者XML文件的第三方库,简单学习呵呵,能从XML文件中提取文本了。

大功告成!那时的标识符, 只倚赖adb和uiautomator,如果那个小流程没有变,任何Android智能手机任何笔记本电脑任何PC的操作系统,都没关系,都能用,他们倚赖的adb和uiautomator都是很平衡的小东西,很长时间都不会变的那种,所以他们的标识符也非常平衡。

学习之路到此结束啦。

附言

这里可能更多的是我想和同学们说的话吧。同时这里没所以多科普,偏硬核许多,谨慎阅读。

补齐小流程到底须要懂多少小东西?

只不过不用懂许多小东西……有些不懂的能查,有些不懂的你可能不知道是不是查。比如说:不会读XML文件你能百度如何用Python读取XML文件,会查到许多小东西,比如说我用的Python的lxml库读取的,你可能能查到你用着更顺手的库。不知道是不是用笔记本电脑操纵者Android能百度是不是用笔记本电脑控制Android,你能搜到投屏,能搜到adb,能搜到许多远控应用软件,然后你能每条路都走一走,找到你觉得用的舒服的。

但是有些小东西你不会了是没法查的,比如说如果你想不到你玩小流程的过程只不过是你的智能手机和服务器交互的过程,所以你很难想到他们背后是数据包的接发过程,可能接触不到抓包那个小东西了。如果你的基础还没有让你知道网站的本质是许多标识符的组合,如果你还不知道浏览器是通过执行许多js标识符来顺利完成那些花里胡哨的介面的, 可能你想不到去用类似的思想去解决Android小流程的问题,你可能想不到能将网页拆开这种方法,也接触不到uiautomator了。

你看我文中写了多少个查数据资料,累得不行了才把那个小东西做出来,所以要懂的更多的都是原理性的,是知道某些小东西的工作原理,比如说计算机网络中TCP/IP的原理、HTTP的原理,浏览器的工作原理甚至爬虫的工作原理等等,这些你要了解。而有些小东西你能遇到问题了再查,比如说小流程的工作原理,抓包的工作原理,等等,如果你有了前面各种知识的基础,后面这些小东西是前面小东西的许多组合或者延伸。

优雅的标识符

开发中一定要想着如何写更优雅的标识符。

比如说已经开始他们写的标识符可能是两个循环,许多表达式调用来调用去,能跑是真的,但是改标识符很伤痛,比如说你想修改你对题目的截屏区域,它包括4个值,左上角座标的x和y,右下角座标的x和y,要改好多地方,截屏的地方要改,相对座标计算的位置要改,经常牵一发动全身,而这种还是极度负面性的。那个时候能优化标识符, 将这些值抽出来放到两个文件里面,那个文件叫配置文件,之后所有加进这些值的地方都从配置文件读取,这种你只须要修改两个配置,后面的工作流程会自动修改。

之后他们能想到,整个补齐小流程的流程无外乎这几步:在已经开始介面点选已经开始作答,在作答介面作答,在结束介面结束作答。把所有的流程都在主表达式里面用if表示,if 是xxx介面做xxxx操作,也能跑,不过如果要新增两个网页呢?比如说多选网页?是不是办?你要在下面新加一套if,所有相关那个多选网页的小东西都要写在里面。那个时候他们能抽象一层,比如说将每两个网页看做两个事件,事件有两个表达式,两个条件表达式,两个执行表达式,条件表达式是当那个为真的时候确定是那个事件,执行它的执行表达式。而主表达式中只须要不停地判断是不是那个事件,如果是执行,不是判断下两个事件。这种新增两个网页也是新增两个事件,在主表达式的所有事件的列表中新增两个能了,不会影响主标识符。(能反过来思考,不是事件,而要状态的改变,比如说由主介面状态进入作答状态,由作答状态进入结束网页状态,这种能用设计模式中的状态模式改写,这里涉及到计算理论中的有限状态机,值得一学)。

上面是随便举了两个例子,你标识符写的越优雅,你之后改标识符会越顺畅。

本文作者:王悟空

作者 nasiapp

在线客服
官方客服
我们将24小时内回复。
12:01
您好,有任何疑问请与我们联系!

选择聊天工具: