今天来做一个好玩的,这个脚本做出来需要一点脑洞,hh~
当然,当你可以用adb控制手机的时候,不止能干这么些,还有更多有意思的,这就需要更大的脑洞了,比如自动薅羊毛~
adb即 Android Debug Bridge,我们一般简称为adb,它是一个非常强大的命令行工具,通过这个工具你能够利用电脑与你的android设备进行交互。
adb下载:百度网盘获取:链接:https://pan.baidu.com/s/1tElgryyIuKRJ3h1PPSgGLw 密码:reop
记得将解压后的工具包添加到系统变量上,这样方便你用python脚本调用它。
可以参考这篇博文:常用的adb命令
这一步首先需要手机开启开发者模式,因为各个手机打开的方式不一样,请根据自己机型自行百度。
然后是将手机用usb线连接电脑,在cmd下输入adb devices
若有如下图的返回则手机和电脑连接成功:
这两步放在一个函数里就行了
这里先说一说下面一些(left, upper, right, lower)坐标是怎么确定的
首先,从微信进入头脑王者2,开始一场比赛
将比赛的有题目图截下来,截到图片的一般大小都是(1920*1080),比如下图:
然后以实际尺寸打开这张图片,再用截图工具量一下所需位置的宽高(当你截图时,一般截图工具会显示将要截的像素大小),或者你有更好的方法就另说。比如下两图是我获取问题的位置(左,上,右,下)的思路,其他位置也是这样获取:
然后就确定这些坐标了~
adb截手机实时图代码:
import os import random import requests import subprocess from PIL import Image from aip import AipOcr from io import BytesIO def get_screenshot(): process=subprocess.Popen('adb shell screencap -p',shell=True,stdout=subprocess.PIPE) #相对于在cmd下执行了adb shell screencap -p,将会去截手机屏幕图 screenshot=process.stdout.read() #读取截到的数据 screenshot=screenshot.replace(b'\r\n', b'\n') #adb直接截的图在有点的问题,以二进制替换一下字符就可以了。 img_fb=BytesIO() #BytesIO操作二进制数据,因为图片是二进制文件 img_fb.write(screenshot) #写入内存 img=Image.open(img_fb) #在内存打开图片 title_img=img.crop((200,420,890,790)) #裁剪原图,对应(left, upper, right, lower)剪出来的是问题那部分图片 answers_img=img.crop((80,960,1000,1720)) #裁剪原图,剪出来的是答案那部分图片 new_img=Image.new('RGBA',(920,1140)) #新建一张图片,用来保存上面剪问题和答案部分,就是去掉了玩家头像之类的那些杂质 new_img.paste(title_img,(0,0,690,370)) #问题粘贴到新建的大图 new_img.paste(answers_img,(0,380,920,1140)) #答案粘贴到新建的大图,过滤了不必要的元素 new_img_fb=BytesIO() new_img.save(new_img_fb,'png') #保存图片 with open('test.png','wb') as f: f.write(new_img_fb.getvalue()) return new_img_fb #返回新生成的图片
到百度云注册个账号:直达
到控制台-产品服务-人工智能-文字识别创建一个文字识别的应用如下,这种普通的文字识别每月有5w次的免费次数(开通这个应用免费,不用实名认证),我感觉没什么特殊的要求的话这已经绰绰有余了。
创建之后要找到这个位置,待会要用到里面的key:
对,还要pip安装百度云的python sdk
pip install baidu-aip
详情可到这里看看:文档直达
具体的利用:
def get_word_by_image(img): APPID = '' APIKey = '' SecretKey = '' #这三个都在账号里面,上面有提到 client = AipOcr(APPID, APIKey, SecretKey) #创建链接 res=client.basicGeneral(img) #将图片传过去 return res #识图结果
这两个也在一个函数里~
写个简单的爬虫逻辑就行了,如下:
def baidu(question,answer): url='https://www.baidu.com/s' headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'} data={ 'wd':question } res=requests.get(url=url,params=data,headers=headers) res.encoding=res.apparent_encoding html=res.text for i in range(len(answer)): answer[i]=(html.count(answer[i]),answer[i],i) #循环4次,将答案在百度返回源码中出现的次数统计出来 answer.sort(reverse=True) #按降序排序答案,以出现在源码中次数最高的为答案 return answer
因为脚本有多次图像处理及连接网络的要求,所以效率会有点慢的其实。
而且也不一定对,因为是靠百度的答案,若你有题库就能快很多了。
The end~
转载于:https://www.cnblogs.com/byadmin/articles/10859991.html