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

 更新时间:2018年01月17日 09:54:27   作者:zjy105  
这篇文章主要介绍了python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

最近的答题赢钱很火爆,我也参与了几次,有些题目确实很难答,但是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是可以用来抓取头脑王者的辅助。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Python利用tkinter实现一个简易番茄钟的示例代码

    Python利用tkinter实现一个简易番茄钟的示例代码

    番茄钟是番茄工作法使用的一个时间表,即选择一个待完成的任务,将番茄时间设为25分钟,专注工作,中途不允许做任何与该任务无关的事,直到番茄时钟响起,然后在纸上画一个X短暂休息一下。本文用tkinter实现一个简易番茄钟,需要的可以参考一下
    2022-12-12
  • python 3.5下xadmin的使用及修复源码bug

    python 3.5下xadmin的使用及修复源码bug

    xadmin是基于Python和Django的管理框架,想要能够熟练使用,学习Django是必须的。下面这篇文章主要给大家介绍了python 3.5下xadmin的使用和当我们重写了Django的User表后,Django就会出现bug问题的解决方法,需要的朋友可以参考下。
    2017-05-05
  • 利用Python进行金融数据分析的全过程

    利用Python进行金融数据分析的全过程

    金融数据分析在现代金融行业中扮演着至关重要的角色,通过使用Python编程语言,我们可以对大量金融数据进行处理、分析和可视化,从而获得有价值的洞察,本篇文章将介绍如何使用Python进行金融数据分析,需要的朋友可以参考下
    2024-08-08
  • Django框架中间件定义与使用方法案例分析

    Django框架中间件定义与使用方法案例分析

    这篇文章主要介绍了Django框架中间件定义与使用方法,结合具体案例形式分析了Django框架中间件相关定义、原理、使用方法及操作注意事项,需要的朋友可以参考下
    2019-11-11
  • 解决plt.imshow显示cv2.imread读取的图像有色差发蓝的四种方法问题

    解决plt.imshow显示cv2.imread读取的图像有色差发蓝的四种方法问题

    本文主要介绍了解决plt.imshow显示cv2.imread读取的图像有色差发蓝的四种方法问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Python读写文件模式和文件对象方法实例详解

    Python读写文件模式和文件对象方法实例详解

    这篇文章主要介绍了Python读写文件模式和文件对象方法,结合实例形式详细分析了Python文件操作常用技巧与相关注意事项,需要的朋友可以参考下
    2019-09-09
  • python3使用GUI统计代码量

    python3使用GUI统计代码量

    这篇文章主要为大家详细介绍了python3使用GUI统计代码量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • python基于celery实现异步任务周期任务定时任务

    python基于celery实现异步任务周期任务定时任务

    这篇文章主要介绍了python基于celery实现异步任务周期任务定时任务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)

    详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)

    这篇文章主要介绍了详解利用OpenCV提取图像中的矩形区域(PPT屏幕等),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-07-07
  • Python基于pygame实现图片代替鼠标移动效果

    Python基于pygame实现图片代替鼠标移动效果

    这篇文章主要介绍了Python基于pygame实现图片代替鼠标移动效果,可实现将鼠标箭头转换成图形的功能,涉及pygame图形操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11

最新评论