python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题

作者:zjy105 时间:2022-06-13 04:36:44 

最近的答题赢钱很火爆,我也参与了几次,有些题目确实很难答,但是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秒之间。

python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题

最后里面的ocr_zh.py是可以用来抓取头脑王者的辅助。

来源:http://blog.csdn.net/zjy105/article/details/79034520

标签:python,西瓜视频,头脑王者,答题
0
投稿

猜你喜欢

  • Python3+Pycharm+PyQt5环境搭建步骤图文详解

    2023-12-17 06:55:01
  • Scrapy-redis爬虫分布式爬取的分析和实现

    2023-01-04 10:21:19
  • 论坛首页效果图设计

    2009-03-19 13:46:00
  • 打败 IE 的葵花宝典:CSS Bug Table

    2010-08-03 12:30:00
  • 教你轻松解决几种常见的SQL疑难问题

    2009-01-07 14:25:00
  • IE6下图片下方有空隙的解决方法

    2008-08-01 18:02:00
  • Python实现新版正方系统滑动验证码识别

    2022-11-08 09:14:32
  • python生成九宫格图片

    2022-09-09 04:46:34
  • python中单下划线(_)和双下划线(__)的特殊用法

    2022-08-09 22:23:22
  • python tkinter制作用户登录界面的简单实现

    2021-01-07 06:00:09
  • Python 字符串、列表、元组的截取与切片操作示例

    2021-12-10 09:47:34
  • 说说回车键触发表单提交的问题

    2009-02-03 13:25:00
  • Django 跨域请求处理的示例代码

    2022-05-27 17:08:46
  • mssql server 数据库附加不上解决办法分享

    2011-09-30 11:55:20
  • 先学会为自己做设计

    2008-06-01 16:32:00
  • python学生信息管理系统实现代码

    2023-10-31 06:18:10
  • 利用location.hash实现跨域iframe自适应高宽

    2009-08-02 20:31:00
  • Python网页解析利器BeautifulSoup安装使用介绍

    2021-06-12 05:00:00
  • 实现php删除链表中重复的结点

    2023-09-05 09:36:15
  • Django REST Swagger实现指定api参数

    2023-03-10 05:48:58
  • asp之家 网络编程 m.aspxhome.com