微信小程序头脑风暴2答题辅助

今天来做一个好玩的,这个脚本做出来需要一点脑洞,hh~

当然,当你可以用adb控制手机的时候,不止能干这么些,还有更多有意思的,这就需要更大的脑洞了,比如自动薅羊毛~

思路:

  1. 利用adb截手机实时图
  2. 利用python图像处理库PIL处理图片将问题和答案的那一块截出来
  3. 利用百度识图,将图片转为中文字符串
  4. 利用百度搜索,搜索已转为中文字符串的问题
  5. 统计百度返回网页源码中对应答案出现的次数,出现次数最多的则视为正确答案
  6. 继续利用adb模拟点击手机中答案位置
什么是adb?

adb即 Android Debug Bridge,我们一般简称为adb,它是一个非常强大的命令行工具,通过这个工具你能够利用电脑与你的android设备进行交互。

adb下载:百度网盘获取:链接:https://pan.baidu.com/s/1tElgryyIuKRJ3h1PPSgGLw 密码:reop

记得将解压后的工具包添加到系统变量上,这样方便你用python脚本调用它。

可以参考这篇博文:常用的adb命令

 

 

一、将手机与电脑连接上

这一步首先需要手机开启开发者模式,因为各个手机打开的方式不一样,请根据自己机型自行百度。

 

然后是将手机用usb线连接电脑,在cmd下输入adb devices

 

若有如下图的返回则手机和电脑连接成功:

 

 

 

二、按上面的思路来打码

1、 利用adb截手机实时图
2、利用python图像处理库PIL处理图片将问题和答案的那一块截出来

这两步放在一个函数里就行了

这里先说一说下面一些(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  #返回新生成的图片

 

3、利用百度识图,将图片转为中文字符串

到百度云注册个账号:直达

到控制台-产品服务-人工智能-文字识别创建一个文字识别的应用如下,这种普通的文字识别每月有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  #识图结果

 

4、利用百度搜索,搜索已转为中文字符串的问题
5、统计百度返回网页源码中对应答案出现的次数,出现次数最多的则视为正确答案

这两个也在一个函数里~

写个简单的爬虫逻辑就行了,如下:

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

 

6、继续利用adb模拟点击手机中答案位置
def click(point):
    cmd='adb shell input swipe %s %s %s %s %s'%(
        point[0],
        point[1],
        point[0]+random.randint(0,3),  #swipe实际上是拖动手机,这里加randint(0,3)是为了模拟长按手机
        point[1]+random.randint(0,3),
        200  #上面4个为坐标,这个200为持续点击的时间ms为它的单位
    )
    os.system(cmd)

三、利用以上函数

config={  #配置
    '头脑王者':{
        'title':(200,420,890,790), #用来记录标题的位置
        'answers':(80,960,1000,1720),
        'point':[
            (316,993,723,1078),
            (316,1174,723,1292),
            (316,1366,723,1469),
            (316,1570,723,1657),#四个答案的位置
        ]
    }
}


def run():
    print('准备答题')
    while True:
        input('请按回车键开始答题:')
        img=get_screenshot()
        info=get_word_by_image(img.getvalue())
        if info['words_result_num']<5:
            continue
        answers=[x['words'] for x in info['words_result'][-4:]]  #提取返回的对应题目答案的中文字符串,这个与百度云返回的数据结构有关,不必深究,会用就行
        question=''.join([x['words'] for x in info['words_result'][:-4]])  #提取返回的问题的中文字符串
        res=baidu(question,answers)
        print(question)
        print(res)
        print(config['头脑王者']['point'][res[0][2]])
        click(config['头脑王者']['point'][res[0][2]])  #模拟点击

 四、总结

因为脚本有多次图像处理及连接网络的要求,所以效率会有点慢的其实。

而且也不一定对,因为是靠百度的答案,若你有题库就能快很多了。

 

 

The end~

转载于:https://www.cnblogs.com/byadmin/articles/10859991.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值