python用PIL、百度OCR、adb实现的手机自动答题辅助

python的学习之路,第一篇博客

零基础自学python3有一段时间了,遂产生了做一个自动答题程序的想法。答题界面如下:
在这里插入图片描述
题型分为:多选题、单选题、判断题。
选择时,如果选择正确,手机app会自动进入下一题。如果选择错误,会进入失败界面。

以下为编程思路:
编程思路
需要用到的库:

环境配置

import os                    # 导入以后可以使用shell命令,python自带不用安装
from PIL import Image       # PIL是一个对图片处理的库   python3 使用 pip install pillow 安装
from aip import AipOcr      #百度ocr  使用 pip install baidu-aip 安装(需要调用百度api)
import time               #导入后可以让程序等待一会儿,python自带不用安装
import pickle             # 这个库可以保存变量,使用,python自带不用安装

需要安装:Android Debug Bridge(安卓调试桥) 简称adb,安装后可以使用电脑对手机进行操作(这里主要是模拟人手,点击手机屏幕)
附:adb详细安装教程

打开手机内的usb调试,把手机用数据线连接到电脑
在cmd内输入命令:adb devices

PS C:\Users\Administrator\Desktop> adb devices
List of devices attached
954a63434594453454 (#这一串字符,每台设备均不同)     device

PS C:\Users\Administrator\Desktop>

若如上显示,则手机与电脑连接成功。

def screen_phone():      #用于截取手机屏幕并发送到电脑
        os.system('adb shell screencap -p /sdcard/111.png')   #截屏并将图片保存到手机
        os.system('adb pull /sdcard/111.png C:/Users/Administrator/Desktop/data/phone/111.png') #讲手机内保存的截屏发送到电脑指定文件夹
        print("开始截图!!!")
        return crop_string()  #截屏完成后,调用到修图函数

截屏取手机屏幕发送到电脑,得到如下图片在这里插入图片描述
此图片分辨率是1080x2220,图片蓝色部分背景处无题目,没有作用且容易对接下来的ocr识别造成干扰。所以进行剪切。

def crop_string():     #将图片修剪
                  #这里的文件路径根据你自己系统的文件路径来填
        im = Image.open("C:/Users/Administrator/Desktop/data/phone/111.png")
        size=(0,600,1080,2220) 
        after_cut=im.crop(size) #crop需要的参数为(左,上,右,下)
        after_cut.save("C:/Users/Administrator/Desktop/data/after cut/111.png")  #保存修剪后的图片
        im.close()  #使用open以后随时记得close~~~
        print("图片修剪完成")
        return baidu_ocr()  #调用图片识别

使用的是Image.crop()来对图片进行裁切的时候需要注意:
坐标原点在图片的左上角
crop函数带的参数为(左,上,右,下)

在这里插入图片描述
裁切后得到如下图片:
在这里插入图片描述
蓝色部分已经被去除。只剩下题目部分与确定键
在这里插入图片描述
使用百度的文字识别api来识别裁切后的图片**(目前个人账户每天可调用5万次)**
若对于此api调用不熟悉可以查看百度云的技术文档!
https://cloud.baidu.com/doc/OCR/index.html

开始对

def baidu_ocr():
        APP_ID = '这里填你自己的百度云账户'
        API_KEY = '这里填你自己的百度云账户'
        SECRET_KEY = '这里填你自己的百度云账户'     #百度api识别key
        aipOcr = AipOcr(APP_ID, API_KEY, SECRET_KEY)

        with open('C:/Users/Administrator/Desktop/data/after cut/111.png','rb') as file:
            asdf=file.read()
        result = aipOcr.basicGeneral(asdf)
        word_list=result.get('words_result')
        question=[]   #存放识别出来的题目
        for i in word_list:
            question.append(i.get('words'))
        print(question)
        print('----------------识别成功------------------')
        if question[0]=="判断题":     #如果题型是判断题,

            pd_a=806+40+(len(question)-3)*53
            print('pd_a:',pd_a)
            pd_b=180+806+55+(len(question)-4)*53
            print("pd_b:",pd_b)
            print('此题型为判断题!!!')
            print('pd_data:',pd_data)
            if pd_data==[]or pd_data==None:   #如果数据库为空,后面for循环不会执行,
                print("数据库没有题目!")
                os.system(f'adb shell input tap 957 {pd_a}')    #顶端到题目的距离(750)+题目到选项间的距离+选项框的一半高度+题目的行数*题目的高度
                os.system("adb shell input tap 540 2048")
                time.sleep(3)     #等待两秒
                os.system('adb shell screencap -p /sdcard/111.png')
                os.system('adb pull /sdcard/111.png C:/Users/Administrator/Desktop/data/phone/111.png')
                img=Image.open('C:/Users/Administrator/Desktop/data/phone/111.png')   #打开图片
                if img.getpixel((484,650))==(245, 245, 245):           #识别像素点若等于答案像素点,则判断正确
                    print("img.getpixel((484,650)",img.getpixel((484,650)))
                    print("判断题选择正确,已自动记录答案1")
                    question.append("a_coord")  #在列表后追加答案
                    pd_data.append(question)
                    return screen_phone()
                elif img.getpixel((484,650))==(245, 245, 245, 255):
                    print("img.getpixel((484,650)",img.getpixel((484,650)))
                    print("判断题选择正确,已自动记录答案2")
                    question.append("a_coord")  #在列表后追加答案
                    pd_data.append(question)
                    return screen_phone()
                else:
                    print("判断题选择错误,自动选择B")
                    question.append("b_coord")
                    pd_data.append(question)
                    return restart()


            for i in pd_data:  #题库遍历对比
                print("pd_data遍历的i:"
  • 15
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值