python3.5+tesseract+adb實(shí)現(xiàn)西瓜視頻或頭腦王者輔助答題
最近的答題贏錢很火爆,我也參與了幾次,有些題目確實(shí)很難答,但是10秒鐘的時(shí)間根本不夠百度的,所以寫了個(gè)輔助掛,這樣可以出現(xiàn)題目時(shí)自動(dòng)百度,這個(gè)時(shí)間也就花掉2秒鐘,剩下的7、8秒鐘可以進(jìn)行分析和作答,提升了贏錢概率。
源碼可以見我的github:點(diǎn)擊鏈接
原理分析下:使用adb命令,抓取手機(jī)視頻播放的界面,然后通過(guò)python的截取和ocr,獲得到題目和答案, 然后百度得到結(jié)果。這個(gè)環(huán)境怎么搭建,有需要的童鞋可以聯(lián)系我,因?yàn)槭褂帽镜氐膐cr所以解析不花錢,也沒有使用的限制。
github上的代碼中
ocr_bw.py,這個(gè)是自動(dòng)根據(jù)題目去百度,然后打開瀏覽器,展示檢索結(jié)果
# -*- coding: utf-8 -*-
import pytesseract
import time
import webbrowser
import subprocess
from PIL import Image
def main():
"""
主函數(shù)
"""
op = yes_or_no('請(qǐng)確保手機(jī)打開了 ADB 并連接了電腦,'
'然后打開西瓜視頻后再用本程序,確定開始?')
if not op:
print('bye')
return
#核心遞歸
ocr_subject_parent()
# for root, sub_dirs, files in os.walk('E:/臨時(shí)接收的文件/知乎答題/百萬(wàn)/'):
# for file in files:
# print('發(fā)現(xiàn)圖片:' + file)
# img = Image.open('E:/臨時(shí)接收的文件/知乎答題/百萬(wàn)/'+file)
# ocr_subject(img)
def yes_or_no(prompt, true_value='y', false_value='n', default=True):
"""
檢查是否已經(jīng)為啟動(dòng)程序做好了準(zhǔn)備
"""
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 = '當(dāng)出現(xiàn)題目時(shí),請(qǐng)按下回車進(jìn)行識(shí)別 '
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結(jié)束
# 截取 距離上260 570結(jié)束
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("耗時(shí):" + 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,這個(gè)是根據(jù)題目+答案,去百度檢索,通過(guò)爬蟲抓取百度的收錄數(shù),然后在控制臺(tái)打印結(jié)果
__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():
"""
主函數(shù)
"""
op = yes_or_no('請(qǐng)確保手機(jī)打開了 ADB 并連接了電腦,'
'然后打開西瓜視頻后再用本程序,確定開始?')
if not op:
print('bye')
return
# 核心遞歸
ocr_subject_parent()
# for root, sub_dirs, files in os.walk('E:/臨時(shí)接收的文件/知乎答題/百萬(wàn)/'):
# for file in files:
# print('發(fā)現(xiàn)圖片:' + file)
# img = Image.open('E:/臨時(shí)接收的文件/知乎答題/百萬(wàn)/'+file)
# ocr_subject(img)
def yes_or_no(prompt, true_value='y', false_value='n', default=True):
"""
檢查是否已經(jīng)為啟動(dòng)程序做好了準(zhǔn)備
"""
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 = '當(dāng)出現(xiàn)題目時(shí),請(qǐng)按下回車進(jìn)行識(shí)別 \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結(jié)束
# 截取 距離上260 570結(jié)束
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("結(jié)束:" + 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('百度為您找到相關(guān)結(jié)果約'))
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()
由于很多題目是下列哪個(gè)不是,所以我更喜歡用第一個(gè)方式,基本上識(shí)別時(shí)間在0.5-0.6秒之間。

最后里面的ocr_zh.py是可以用來(lái)抓取頭腦王者的輔助。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python利用tkinter實(shí)現(xiàn)一個(gè)簡(jiǎn)易番茄鐘的示例代碼
番茄鐘是番茄工作法使用的一個(gè)時(shí)間表,即選擇一個(gè)待完成的任務(wù),將番茄時(shí)間設(shè)為25分鐘,專注工作,中途不允許做任何與該任務(wù)無(wú)關(guān)的事,直到番茄時(shí)鐘響起,然后在紙上畫一個(gè)X短暫休息一下。本文用tkinter實(shí)現(xiàn)一個(gè)簡(jiǎn)易番茄鐘,需要的可以參考一下2022-12-12
python 3.5下xadmin的使用及修復(fù)源碼bug
xadmin是基于Python和Django的管理框架,想要能夠熟練使用,學(xué)習(xí)Django是必須的。下面這篇文章主要給大家介紹了python 3.5下xadmin的使用和當(dāng)我們重寫了Django的User表后,Django就會(huì)出現(xiàn)bug問(wèn)題的解決方法,需要的朋友可以參考下。2017-05-05
利用Python進(jìn)行金融數(shù)據(jù)分析的全過(guò)程
金融數(shù)據(jù)分析在現(xiàn)代金融行業(yè)中扮演著至關(guān)重要的角色,通過(guò)使用Python編程語(yǔ)言,我們可以對(duì)大量金融數(shù)據(jù)進(jìn)行處理、分析和可視化,從而獲得有價(jià)值的洞察,本篇文章將介紹如何使用Python進(jìn)行金融數(shù)據(jù)分析,需要的朋友可以參考下2024-08-08
解決plt.imshow顯示cv2.imread讀取的圖像有色差發(fā)藍(lán)的四種方法問(wèn)題
本文主要介紹了解決plt.imshow顯示cv2.imread讀取的圖像有色差發(fā)藍(lán)的四種方法問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
Python讀寫文件模式和文件對(duì)象方法實(shí)例詳解
這篇文章主要介紹了Python讀寫文件模式和文件對(duì)象方法,結(jié)合實(shí)例形式詳細(xì)分析了Python文件操作常用技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2019-09-09
python基于celery實(shí)現(xiàn)異步任務(wù)周期任務(wù)定時(shí)任務(wù)
這篇文章主要介紹了python基于celery實(shí)現(xiàn)異步任務(wù)周期任務(wù)定時(shí)任務(wù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
詳解利用OpenCV提取圖像中的矩形區(qū)域(PPT屏幕等)
這篇文章主要介紹了詳解利用OpenCV提取圖像中的矩形區(qū)域(PPT屏幕等),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
Python基于pygame實(shí)現(xiàn)圖片代替鼠標(biāo)移動(dòng)效果
這篇文章主要介紹了Python基于pygame實(shí)現(xiàn)圖片代替鼠標(biāo)移動(dòng)效果,可實(shí)現(xiàn)將鼠標(biāo)箭頭轉(zhuǎn)換成圖形的功能,涉及pygame圖形操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11

