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


Posted in Python onJanuary 17, 2018

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

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

Python 相关文章推荐
python通过装饰器检查函数参数数据类型的方法
Mar 13 Python
Python的Django框架使用入门指引
Apr 15 Python
python自动zip压缩目录的方法
Jun 28 Python
举例讲解Linux系统下Python调用系统Shell的方法
Nov 07 Python
Python数据分析之真实IP请求Pandas详解
Nov 18 Python
安装Python的教程-Windows
Jul 22 Python
Numpy array数据的增、删、改、查实例
Jun 04 Python
解决python tkinter界面卡死的问题
Jul 17 Python
Python Pillow.Image 图像保存和参数选择方式
Jan 09 Python
通过代码实例了解Python3编程技巧
Oct 13 Python
python使用re模块爬取豆瓣Top250电影
Oct 20 Python
Python实现淘宝秒杀功能的示例代码
Jan 19 Python
python+matplotlib绘制3D条形图实例代码
Jan 17 #Python
《Python学习手册》学习总结
Jan 17 #Python
浅谈Python对内存的使用(深浅拷贝)
Jan 17 #Python
Python分支结构(switch)操作简介
Jan 17 #Python
python2 与python3的print区别小结
Jan 16 #Python
python正则中最短匹配实现代码
Jan 16 #Python
Python程序员面试题 你必须提前准备!
Jan 16 #Python
You might like
php网上商城购物车设计代码分享
2012/02/15 PHP
PHP数据库链接类(PDO+Access)实例分享
2013/12/05 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
javascript 面向对象编程 聊聊对象的事
2009/09/17 Javascript
JavaScript 高效运行代码分析
2010/03/18 Javascript
jquery打开直接跳到网页最下面、最低端实现代码
2013/04/22 Javascript
javascript使用location.search的示例
2013/11/05 Javascript
JavaScript中的Web worker多线程API研究
2014/12/06 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
2015/12/15 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
2016/12/01 Javascript
详解Vue 实例中的生命周期钩子
2017/03/21 Javascript
Vuex之理解state的用法实例
2017/04/19 Javascript
基于BootStrap的前端分页带省略号和上下页效果
2017/05/18 Javascript
对于input 框限定输入值为浮点型的js代码
2017/09/25 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
JavaScript用document.write()输出换行的示例代码
2020/11/26 Javascript
[30:55]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第二场 11.18
2020/11/18 DOTA
使用Python paramiko模块利用多线程实现ssh并发执行操作
2019/12/05 Python
python numpy库linspace相同间隔采样的实现
2020/02/25 Python
Python实现Wordcloud生成词云图的示例
2020/03/30 Python
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
Mamaearth官方网站:印度母婴护理产品公司
2019/10/06 全球购物
美国小蜜蜂Burt’s Bees德国官网:天然唇部、皮肤和身体护理产品
2020/06/14 全球购物
应届毕业生个人自荐信范文
2013/11/30 职场文书
八年级数学教学反思
2014/01/31 职场文书
商场主管竞聘书
2014/03/31 职场文书
应届生求职信范文
2014/05/26 职场文书
公司离职证明标准格式
2014/11/18 职场文书
行政人事专员岗位职责
2015/04/07 职场文书
2015年财务人员工作总结
2015/04/10 职场文书
2015年教师教学工作总结
2015/04/28 职场文书
刑事附带民事上诉状
2015/05/23 职场文书
2016年党员读书月活动总结
2016/04/06 职场文书
Ajax实现异步加载数据
2021/11/17 Javascript
Python中 range | np.arange | np.linspace三者的区别
2022/03/22 Python
Windows7下FTP搭建图文教程
2022/08/05 Servers