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正则表达式match和search用法实例
Mar 26 Python
Python实现的HTTP并发测试完整示例
Apr 23 Python
理解Python中的With语句
Mar 18 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
Jun 27 Python
pandas实现选取特定索引的行
Apr 20 Python
Python Matplotlib 基于networkx画关系网络图
Jul 10 Python
Python time库基本使用方法分析
Dec 13 Python
Python编程快速上手——strip()函数的正则表达式实现方法分析
Feb 29 Python
快速创建python 虚拟环境
Nov 28 Python
Python实现给PDF添加水印的方法
Jan 25 Python
Python爬虫中urllib3与urllib的区别是什么
Jul 21 Python
利用Python实现模拟登录知乎
May 25 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从身份证号中获取一系列线索(星座、生肖、生日等)
2016/05/11 PHP
利用switch语句进行多选一判断的实例代码
2016/11/14 PHP
JQuery 确定css方框模型(盒模型Box Model)
2010/01/22 Javascript
javascript 函数调用的对象和方法
2010/07/01 Javascript
解决火狐浏览器下JS setTimeout函数不兼容失效不执行的方法
2012/11/14 Javascript
SuperSlide2实现图片滚动特效
2014/06/20 Javascript
js图片轮播效果实现代码
2020/04/18 Javascript
不得不分享的JavaScript常用方法函数集(下)
2015/12/25 Javascript
再谈JavaScript异步编程
2016/01/27 Javascript
初步使用bootstrap快速创建页面
2016/03/03 Javascript
JavaScript中绑定事件的三种方式及去除绑定
2016/11/05 Javascript
浅谈Angular2 模块懒加载的方法
2017/10/04 Javascript
vue将对象新增的属性添加到检测序列的方法
2018/02/24 Javascript
浅谈Vue2.0中v-for迭代语法的变化(key、index)
2018/03/06 Javascript
微信小程序tab切换可滑动切换导航栏跟随滚动实现代码
2019/09/04 Javascript
JavaScript实现简单进度条效果
2020/03/25 Javascript
vue-cli3 热更新配置操作
2020/09/18 Javascript
Python Tkinter简单布局实例教程
2014/09/03 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
2015/12/08 Python
Python判断值是否在list或set中的性能对比分析
2016/04/16 Python
Python实现比较扑克牌大小程序代码示例
2017/12/06 Python
Sanic框架Cookies操作示例
2018/07/17 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
2018/07/18 Python
pandas DataFrame索引行列的实现
2019/06/04 Python
Python判断变量是否是None写法代码实例
2020/10/09 Python
Blank NYC官网:夹克、牛仔裤等
2020/12/16 全球购物
.NET remoting中对象激活的两种方式
2015/06/08 面试题
承诺书怎么写
2014/03/26 职场文书
产品包装策划方案
2014/05/18 职场文书
新手上路标语
2014/06/20 职场文书
迟到检讨书2000字(精选篇)
2014/10/07 职场文书
大学军训的体会
2014/11/08 职场文书
应收账款管理制度
2015/08/06 职场文书
vue实现简单数据双向绑定
2021/04/28 Vue.js
python3操作redis实现List列表实例
2021/08/04 Python
TypeScript实用技巧 Nominal Typing名义类型详解
2022/09/23 Javascript