python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
作者:zjy105 发布时间:2022-06-13 04:36:44
标签:python,西瓜视频,头脑王者,答题
最近的答题赢钱很火爆,我也参与了几次,有些题目确实很难答,但是10秒钟的时间根本不够百度的,所以写了个辅助挂,这样可以出现题目时自动百度,这个时间也就花掉2秒钟,剩下的7、8秒钟可以进行分析和作答,提升了赢钱概率。
源码可以见我的github:点击链接
原理分析下:使用adb命令,抓取手机视频播放的界面,然后通过python的截取和ocr,获得到题目和答案, 然后百度得到结果。这个环境怎么搭建,有需要的童鞋可以联系我,因为使用本地的ocr所以解析不花钱,也没有使用的限制。
github上的代码中
ocr_bw.py,这个是自动根据题目去百度,然后打开浏览器,展示检索结果
# -*- coding: utf-8 -*-
import pytesseract
import time
import webbrowser
import subprocess
from PIL import Image
def main():
"""
主函数
"""
op = yes_or_no('请确保手机打开了 ADB 并连接了电脑,'
'然后打开西瓜视频后再用本程序,确定开始?')
if not op:
print('bye')
return
#核心递归
ocr_subject_parent()
# for root, sub_dirs, files in os.walk('E:/临时接收的文件/知乎答题/百万/'):
# for file in files:
# print('发现图片:' + file)
# img = Image.open('E:/临时接收的文件/知乎答题/百万/'+file)
# ocr_subject(img)
def yes_or_no(prompt, true_value='y', false_value='n', default=True):
"""
检查是否已经为启动程序做好了准备
"""
default_value = true_value if default else false_value
prompt = '{} {}/{} [{}]: '.format(prompt, true_value,
false_value, default_value)
i = input(prompt)
if not i:
return default
while True:
if i == true_value:
return True
elif i == false_value:
return False
prompt = 'Please input {} or {}: '.format(true_value, false_value)
i = input(prompt)
def screenImg(true_value='', default=True):
prompt = '当出现题目时,请按下回车进行识别 '
i = input(prompt)
if not i:
return default
while True:
if i == true_value:
return True
else:
return False
i = input(prompt)
def ocr_subject(p):
# 截取 距离上530开始 940结束
# 截取 距离上260 570结束
p = cut_img(p)
pytesseract.pytesseract.tesseract_cmd = 'E:/Program Files (x86)/Tesseract-OCR/tesseract'
subject = pytesseract.image_to_string(p, lang='chi_sim')
subject = "".join(subject.split())
subject = subject.split('.')[1]
print(subject)
openPage(subject)
ocr_subject_parent()
def ocr_subject_parent():
result = screenImg()
if result:
start = time.time()
# screenshot.check_screenshot()
process = subprocess.Popen(
'adb shell screencap -p',
shell=True, stdout=subprocess.PIPE)
binary_screenshot = process.stdout.read()
binary_screenshot = binary_screenshot.replace(b'\r\n', b'\n')
f = open('autojump.png', 'wb')
f.write(binary_screenshot)
f.close()
# screenshot.pull_screenshot()
img = Image.open('autojump.png')
print("耗时:" + str(time.time() - start))
ocr_subject(img)
def openPage(subject):
url = 'https://www.baidu.com/s?wd={}'.format(
subject)
webbrowser.open(url)
webbrowser.get()
def cut_img(img):
region = img.crop((70, 260, 1025, 570))
#region.save("temp/cut_first.png")
return region
if __name__ == '__main__':
main()
ocr_bw2.py,这个是根据题目+答案,去百度检索,通过爬虫抓取百度的收录数,然后在控制台打印结果
__author__ = 'zjy'
# -*- coding:utf-8 -*-
import pytesseract
import time
import webbrowser
import subprocess
from PIL import Image
import urllib
import urllib.request
import threading
from urllib.parse import quote
def main():
"""
主函数
"""
op = yes_or_no('请确保手机打开了 ADB 并连接了电脑,'
'然后打开西瓜视频后再用本程序,确定开始?')
if not op:
print('bye')
return
# 核心递归
ocr_subject_parent()
# for root, sub_dirs, files in os.walk('E:/临时接收的文件/知乎答题/百万/'):
# for file in files:
# print('发现图片:' + file)
# img = Image.open('E:/临时接收的文件/知乎答题/百万/'+file)
# ocr_subject(img)
def yes_or_no(prompt, true_value='y', false_value='n', default=True):
"""
检查是否已经为启动程序做好了准备
"""
default_value = true_value if default else false_value
prompt = '{} {}/{} [{}]: '.format(prompt, true_value,
false_value, default_value)
i = input(prompt)
if not i:
return default
while True:
if i == true_value:
return True
elif i == false_value:
return False
prompt = 'Please input {} or {}: '.format(true_value, false_value)
i = input(prompt)
def screenImg(true_value='', default=True):
prompt = '当出现题目时,请按下回车进行识别 \n'
i = input(prompt)
if not i:
return default
while True:
if i == true_value:
return True
else:
return False
i = input(prompt)
def ocr_subject(p):
# 截取 距离上530开始 940结束
# 截取 距离上260 570结束
subImg = cut_img(p)
pytesseract.pytesseract.tesseract_cmd = 'E:/Program Files (x86)/Tesseract-OCR/tesseract'
subject = pytesseract.image_to_string(subImg, lang='chi_sim')
subject = "".join(subject.split())
subject = subject.split('.')[1].replace("\"", "")
print(subject)
ocr_answer(p, subject)
# openPage(subject)
# print("结束:" + str(time.time()))
ocr_subject_parent()
def getSearchNum(key):
key = quote(key)
# print(key)
url = 'http://www.baidu.com/s?wd={}'.format(key)
# print(url)
response = urllib.request.urlopen(url)
page = response.read().decode("utf-8")
i = int(page.index('百度为您找到相关结果约'))
start = i + 10
end = i + 25
page = page[start: end]
return page
def ocr_answer(p, subject):
list = cut_question(p)
pytesseract.pytesseract.tesseract_cmd = 'E:/Program Files (x86)/Tesseract-OCR/tesseract'
for p in list:
t = threading.Thread(target=ocr_answer_thread, args=(p, subject))
t.start()
def ocr_answer_thread(p, subject):
answer = pytesseract.image_to_string(p, lang='chi_sim')
answer = "".join(answer.split())
v = getSearchNum(subject + ' ' + answer)
print(answer + ' ' + v)
# print(time.time())
def ocr_subject_parent():
result = screenImg()
if result:
start = time.time()
# print("开始:" + str(start))
# screenshot.check_screenshot()
process = subprocess.Popen(
'adb shell screencap -p',
shell=True, stdout=subprocess.PIPE)
binary_screenshot = process.stdout.read()
binary_screenshot = binary_screenshot.replace(b'\r\n', b'\n')
f = open('autojump.png', 'wb')
f.write(binary_screenshot)
f.close()
# screenshot.pull_screenshot()
img = Image.open('autojump.png')
ocr_subject(img)
def openPage(subject):
url = 'https://www.baidu.com/s?wd={}'.format(
subject)
webbrowser.open(url)
webbrowser.get()
def cut_img(img):
region = img.crop((70, 260, 1025, 570))
# region.save("temp/cut_first.png")
return region
def cut_question(img):
list = []
question1 = img.crop((70, 590, 1025, 768))
question2 = img.crop((70, 769, 1025, 947))
question3 = img.crop((70, 948, 1025, 1130))
list.append(question1)
list.append(question2)
list.append(question3)
# question1.save("temp/cut_1.png")
# question2.save("temp/cut_2.png")
# question3.save("temp/cut_3.png")
return list
if __name__ == '__main__':
main()
由于很多题目是下列哪个不是,所以我更喜欢用第一个方式,基本上识别时间在0.5-0.6秒之间。
最后里面的ocr_zh.py是可以用来抓取头脑王者的辅助。
来源:http://blog.csdn.net/zjy105/article/details/79034520


猜你喜欢
- 一、简介Imageio是一个Python库,提供了一个简单的界面来读取和写入各种图像数据,包括动画图像,视频,体积数据和科学格式。它是跨平台
- 下面先看下python 使用值排序字典的方法In [8]: a={'x':11,'y':22,'c&
- 本文实例为大家分享了js实现本地持久化存储登录注册的具体代码,供大家参考,具体内容如下1.登录html文件<!DOCTYPE html
- 内容摘要:这篇文章的主旨是弄清楚如何根据实际需求实现一个联动菜单以及联动菜单的原理,实例是实现一个日期选择下拉菜单。首先来分析一下日期下拉菜
- 1、初识 errgroupWaitGroup 主要用于控制任务组下的并发子任务。它的具体做法就是,子任务 goroutine 执行前通过 A
- 快速+简单搭建环境。如果有问题,欢迎进群讨论留言。第一步:安装python解释器官网地址:https://www.python.org/自动
- 前言最近用 Vue 写项目的时候,用到 axios ,因为 axios 不能用 Vue.use() (详细介绍可以参考这篇文章),所以在每个
- html页面一般都会指定一个编码,如何获取到是处理html页面的第一步,因为错误的编码必然带来后面处理的问题。这里我用python的正则表达
- 什么是Lambda表达式“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得
- 基本思路是使用opencv来把随机生成的字符,和随机生成的线段,放到一个随机生成的图像中去。虽然没有加复杂的形态学处理,但是目前看起来效果还
- 一 程序预览本程序已经写了多年, 很久没用, 不过刚运行了下竟然还可以成功运行. 先来张运行结果图.二 最近的滴滴APP已经可以支持设置自动
- 本文实例讲述了Python简单实现两个任意字符串乘积的方法。分享给大家供大家参考,具体如下:题目:给定两个任意数字组成的字符串,求乘积,字符
- 1、$(function(){ $("#a").click(function(){ //adding your code
- 在本篇文章中,我们将介绍回归树及其基本数学原理,并从头开始使用Python实现一个完整的回归树模型。为了简单起见这里将使用递归来创建树节点,
- 前言本文介绍在 pandas 中如何读取数据行列的方法。数据由行和列组成,在数据库中,一般行被称作记录 (record),列被称作字段 (f
- 平时自己写了很多代码,但从没好好计算总共写了多少行,面试时被问起来,就傻了。。。闲来无事,写个python程序来统计下import os##
- 1. SyntaxTIMESTAMPDIFF(unit,begin,end); 根据单位返回时间差,对于传入的begi
- import sysfrom PyQt5 import QtWidgetsfrom PyQt5.QtWidgets import QMain
- matplotlib在widgets模块提供Cursor类用于支持十字光标的生成。另外官方还提供了自定义十字光标的实例。widgets模块C
- 下一步是将新创建的应用程序与项目相关联。为此,您需要编辑 myproj 文件夹中的 settings.py 文件,将字符串“myproj.m