目录
写在前面:
最近小猿口算已经被不少大学生攻占,小学生直呼有挂。原本是以为大学生都打着本科一年级也是一年级,研一也是一年级,博一也是一年级的口号,凭借自己实力去欺负小学生呢。没曾想竟然是大学生通过脚本刷题。
一个好好的给小学生的口算题已经变成了大学生的计算机大战,比谁的脚本刷题速度更快了(这里偷偷怀疑一下,是不是清华的老师给他的学生们布置了一项作业:比谁的脚本刷题刷的快了)
小猿口算已经连夜招聘网络安全工程师了:
这里也分享一个小编的脚本,质量很差,甚至还没自己做的快呢,不过可以用来自己练手或者自己跑着玩儿,也算是顺应时代潮流。
最后,欺负小学生这种事情,还是不推荐干的。
一、关于小猿口算:
主页就长这样,也没啥好介绍的,今天的主角是"口算PK"里的"20以内的数字比大小",比赛规则啥的,大家应该看名称就能才出来。我这里是为了方便运行脚本,是在电脑MuMu模拟器上运行的小猿口算:
至于比赛过程,则是给两个数字,可以通过画大于号小于号来进行答题:
二、代码逻辑
1.数字识别
数字识别用来一种很笨的方法:截图,然后通过OpenCv识别。代码的话放在最后一块演示。首选需要把小猿口算和Pycharm同时出现在屏幕上,需要打开Mumu模拟器的窗口置顶功能以方便同时能看到Pycharm和小猿口算
然后如下放置:
由于这个截图是截取的置顶位置的图片,参数什么的还得自己调,大家可以查看截取的num.py文件查看自己截图截到了哪个地方,自己修改一下mumu模拟器的位置或者代码中截图位置的参数,保证能截到一下num.png所示的两个数字信息就好了。
2.答题部分
既然能截取到图片,并识别出数字,那比较大于小于就So easy了,接下来就是画大于号小于号,我们直接通过
pyautogui.mouseDown(),
pyautogui.move
pyautogui.mouseUp()
来实现按下鼠标,鼠标移动画大于号或者小于号,松开鼠标的操作。逻辑还是挺简单的。不过这个答题只能保证质量,不能保证速度。
三、代码分享:
python
import math
import sys
import time
import cv2
import keyboard
import pyautogui
import pytesseract
from PIL import ImageGrab
# 鼠标移动相对位置,分为前后两段,用于画大于号或者小于号
# x1大于0,画大于,小于0画小于
def mouse_move(x1, y1):
pyautogui.mouseDown()
pyautogui.move(x1, y1, duration=0.1)
pyautogui.mouseUp()
while True:
# 按下空格键终止程序
if keyboard.is_pressed('space'):
print('游戏结束!')
sys.exit()
ImageGrab.grab(bbox=(100, 300, 450, 450)).save('./pngs/num.png')
# 改为自己的tesseract.exe路径
pytesseract.pytesseract.tesseract_cmd = r'E:\IDEs\Python\Tesseract-OCR\tesseract.exe'
# 设置生成的照片的路径
img = cv2.imread('./pngs/num.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(img, 150, 100, cv2.THRESH_BINARY)
result = pytesseract.image_to_string(thresh, config='--psm 6').split('?')
try:
result[0] = result[0].strip()
result[1] = result[1].strip()
if result[0] == 'O':
result[0] = 0
if result[1] == 'O':
result[1] = 0
num1 = math.floor(float(result[0]))
num2 = math.floor(float(result[1]))
# 设置画大于号小于号的初始位置,参数可调
pyautogui.moveTo(277, 700, duration=0.1)
if num1 > num2:
mouse_move(100,100)
print(f'{num1} > {num2}')
else:
mouse_move (-100,100)
print(f'{num1} < {num2}')
time.sleep(0.05)
except IndexError as e:
print('未捕获到内容!')
except ValueError as e:
print('未捕获到内容!')
补充:软件包下载
除了CV2和tesseract之外,其他的几个软件包直接鼠标碰到报错(提示找不到软件包)的地方,就会给出解决方法:下载软件包。是在不行自己pip install +软件包名也能下载
需要注意的是cv2是opencv里面的一部分,因此需要以下指令下载openCV
pip install opencv-python
OpenCV包还是挺大的,推荐使用国内镜像:
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
至于tesseract需要手动下载,访问如下地址:
Tesseract User Manual | tessdoc
滑到最低端选择download
跳转页面后点击这个UB开头的东西
跳转之后找到"set up"程序下载即可
下载安装之后,记得把代码里tesseract.exe的路径也跟着修改一下。