python实现自动答题详解含代码

预备软件(这几个都百度一下,攻略多,不难):
1.intellij idea下载
2.python下载
3.requests、AIP 、PIL安装
4.adb下载(用于手机截图)

https://www.lfd.uci.edu/~gohlke/pythonlibs/
这个网址有很多python可以直接下载的

首先将整个过程分为几步:

  1. 手机截图:通过adb进行手机截图,保存到手机里,然后取出来放到电脑里。
    (用的是os.system函数,需要import os,开始用的各种方式都说图片格式不对,就找到了这种 方法,两步搞定,毕竟新手)
    os.system('adb shell screencap -p /sdcard/image.png')
    os.system('adb pull /sdcard/image.png')
  1. 图片预处理:保存的图片需要进行裁剪,使用img.crop()函数操作,里面的4个参数分别是图片的左上和右下(一个坐标是两个参数)。如果题目和答案在一起,中间没有任何其他汉字,就只需进行一次裁剪即可拿去文字识别,如果中间有汉字,就将题目和答案分布裁剪下来,剩下可以选择将题目和答案分开进行文字识别,或者将题目和答案拼接在一张图上,我选的方法是后者。首先创建一个空图片,然后用paste函数将题目和答案粘贴上去,合成一张,识别一次即可。
    裁剪需要根据位置,自己试几次,我这个是找的VX里面 头脑王者做得试验。

  2. 文字识别:使用的OCR,百度一下‘百度AI’,进入官网,右上角有个控制台,点击文字识别,自己创建一个项目,记录下面代码所需的三个参数即可.(我建了一个项目后,第二天就有人打电话过来问我是不是在百度上使用了智能工具,吓我一跳,还以为咋了,最后知道是来推销的不用管)

  # 文字识别
    APP_ID = '16227766'
    API_KEY = 'FgubvnxtReF32vR4jGsS4FY4'
    SECRET_KEY = 'R5YbhWyY2NMF102wRZTwVm9U4hjeAwQG'
    client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
    i = open(r'D:\dati\new_img_fb.png', 'rb')
    img = i.read()
    img_res = client.basicGeneral(img)
    return img_res
  1. 百度:使用requests进行访问。
    url就是百度的网址,headers应该都差不多,可以自己找(毕竟自己找到的才有满足感),打开一个网页,按F12,再按F5,如下图,随便点一个进去找headers就可以了,最后params参数就是你要百度的内容。enconding函数是将html上的乱码转化成中文。
    python实现自动答题详解含代码_第1张图片
    # 进行百度
    url = 'https://www.baidu.com/s'

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
    data = {
        'wd': question
    }
    res = requests.get(url=url, params=data, headers=headers)
    res.encoding = 'utf-8'
    html = res.text
  1. 找答案:文字识别函数是一行一行识别的,如果题目有两行,就需要处理一下,将两行合到一行进行百度,写代码的时候多加几个print函数看看就知道了。
        answers = [x['words'] for x in info['words_result'][-4:]]
        question = ''.join([x['words'] for x in info['words_result'][:-4]])
        resy = baidu(question, answers)
        print(resy)

使用的答题判定比较简单,就是通过百度你的问题,然后在该网页上找到4个答案中,出现频率最高的答案,然后进行排序,第一个答案就是正确答案(感觉这种方式,答案正确率不是很高,一旦问的是以下哪个不是,必定出错)

整个过程说起来很简单,但毕竟刚开始学python,很多不明就里,自己好多地方出错过,自己百度后一个一个函数验证的。

整个代码贴在下面(新手写代码,不喜欢写注释,见谅):

import requests
import os
from PIL import Image
from aip import AipOcr


def get_screenshot():
    # 截屏
    os.system('adb shell screencap -p /sdcard/image.png')
    os.system('adb pull /sdcard/image.png')


def get_word_by_img():
    # 文字识别
    APP_ID = '16227766'
    API_KEY = 'FgubvnxtReF32vR4jGsS4FY4'
    SECRET_KEY = 'R5YbhWyY2NMF102wRZTwVm9U4hjeAwQG'
    client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
    i = open(r'D:\dati\new_img_fb.png', 'rb')
    img = i.read()
    img_res = client.basicGeneral(img)
    return img_res


def baidu(question, answers):
    # 进行百度
    url = 'https://www.baidu.com/s'

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
    data = {
        'wd': question
    }
    res = requests.get(url=url, params=data, headers=headers)
    res.encoding = 'utf-8'
    html = res.text
    for i in range(len(answers)):
        answers[i] = (html.count(answers[i]), answers[i], i)
    answers.sort(reverse=True)
    return answers

def run():
    while True:
        input("回车答题")
        get_screenshot()
        img = Image.open('D:\dati\image.png')
        title_img = img.crop((80, 500, 1000, 880))
        answers_img = img.crop((80, 960, 1000, 1720))
        new_img = Image.new('RGBA', (920, 1140))
        new_img.paste(title_img, (0, 0, 920, 380))
        new_img.paste(answers_img, (0, 380, 920, 1140))
        new_img.save('new_img_fb.png')

        info = get_word_by_img()
        answers = [x['words'] for x in info['words_result'][-4:]]
        question = ''.join([x['words'] for x in info['words_result'][:-4]])
        resy = baidu(question, answers)
        print(resy)

if __name__ == '__main__':
    run()

然后试验一下:
先找个图:python实现自动答题详解含代码_第2张图片
程序结果是:

E:\新建文件夹\python.exe D:/dati/main.py
回车答题
[ 11%] /sdcard/image.png
[ 23%] /sdcard/image.png
[ 35%] /sdcard/image.png
[ 47%] /sdcard/image.png
[ 59%] /sdcard/image.png
[ 71%] /sdcard/image.png
[ 82%] /sdcard/image.png
[ 94%] /sdcard/image.png
[100%] /sdcard/image.png
/sdcard/image.png: 1 file pulled. 23.0 MB/s (552991 bytes in 0.023s)
[(19, '路飞', 0), (3, '汉库克', 2), (0, '路由器', 1), (0, '路夫', 3)]
回车答题
Process finished with exit code -1

正确率跟题目类型有关.
终于搞定了

你可能感兴趣的:(笔记)