python3.5+tesseract+adb實(shí)現(xiàn)西瓜視頻或頭腦王者輔助答題
最近的答題贏錢(qián)很火爆,我也參與了幾次,有些題目確實(shí)很難答,但是10秒鐘的時(shí)間根本不夠百度的,所以寫(xiě)了個(gè)輔助掛,這樣可以出現(xiàn)題目時(shí)自動(dòng)百度,這個(gè)時(shí)間也就花掉2秒鐘,剩下的7、8秒鐘可以進(jìn)行分析和作答,提升了贏錢(qián)概率。
源碼可以見(jiàn)我的github:點(diǎn)擊鏈接
原理分析下:使用adb命令,抓取手機(jī)視頻播放的界面,然后通過(guò)python的截取和ocr,獲得到題目和答案, 然后百度得到結(jié)果。這個(gè)環(huán)境怎么搭建,有需要的童鞋可以聯(lián)系我,因?yàn)槭褂帽镜氐膐cr所以解析不花錢(qián),也沒(méi)有使用的限制。
github上的代碼中
ocr_bw.py,這個(gè)是自動(dòng)根據(jù)題目去百度,然后打開(kāi)瀏覽器,展示檢索結(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ī)打開(kāi)了 ADB 并連接了電腦,'
'然后打開(kāi)西瓜視頻后再用本程序,確定開(kāi)始?')
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開(kāi)始 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ò)爬蟲(chóng)抓取百度的收錄數(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ī)打開(kāi)了 ADB 并連接了電腦,'
'然后打開(kāi)西瓜視頻后再用本程序,確定開(kāi)始?')
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開(kāi)始 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("開(kāi)始:" + 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í)有所幫助,也希望大家多多支持腳本之家。
- python OpenCV實(shí)現(xiàn)答題卡識(shí)別判卷
- python實(shí)現(xiàn)百萬(wàn)答題自動(dòng)百度搜索答案
- python實(shí)現(xiàn)用戶答題功能
- 答題輔助python代碼實(shí)現(xiàn)
- 從0到1使用python開(kāi)發(fā)一個(gè)半自動(dòng)答題小程序的實(shí)現(xiàn)
- Python沖頂大會(huì) 快來(lái)答題!
- Python答題卡識(shí)別并給出分?jǐn)?shù)的實(shí)現(xiàn)代碼
- python利用opencv如何實(shí)現(xiàn)答題卡自動(dòng)判卷
相關(guān)文章
使用Nginx+uWsgi實(shí)現(xiàn)Python的Django框架站點(diǎn)動(dòng)靜分離
這篇文章主要介紹了使用Nginx+uWsgi實(shí)現(xiàn)Python的Django框架站點(diǎn)動(dòng)靜分離的部署實(shí)例,即靜態(tài)由Nginx處理而Python頁(yè)面由Django自帶的HTTP服務(wù)器處理,需要的朋友可以參考下2016-03-03
在OpenCV里實(shí)現(xiàn)條碼區(qū)域識(shí)別的方法示例
這篇文章主要介紹了在OpenCV里實(shí)現(xiàn)條碼區(qū)域識(shí)別的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Python中print函數(shù)簡(jiǎn)單使用總結(jié)
在本篇文章里小編給大家整理的是關(guān)于Python中怎么使用print函數(shù)的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們可以學(xué)習(xí)下。2019-08-08
跟老齊學(xué)Python之關(guān)于類的初步認(rèn)識(shí)
這篇文章主要介紹了Python中關(guān)于類的一些術(shù)語(yǔ)解釋,雖然有些枯燥,但是要了解類的話,這些內(nèi)容是必須的2014-10-10
python實(shí)現(xiàn)在每個(gè)獨(dú)立進(jìn)程中運(yùn)行一個(gè)函數(shù)的方法
這篇文章主要介紹了python實(shí)現(xiàn)在每個(gè)獨(dú)立進(jìn)程中運(yùn)行一個(gè)函數(shù)的方法,涉及Python操作進(jìn)程的相關(guān)技巧,需要的朋友可以參考下2015-04-04
使用Python的Twisted框架實(shí)現(xiàn)一個(gè)簡(jiǎn)單的服務(wù)器
這篇文章主要介紹了使用Python的Twisted框架實(shí)現(xiàn)一個(gè)簡(jiǎn)單的服務(wù)器,翻譯自Twisted的文檔,需要的朋友可以參考下2015-04-04
python詞云庫(kù)wordCloud使用方法詳解(解決中文亂碼)
這篇文章主要介紹了python詞云庫(kù)wordCloud使用方法詳解(解決中文亂碼),需要的朋友可以參考下2020-02-02
Python使用騰訊云API實(shí)現(xiàn)短信驗(yàn)證碼功能
使用Python與騰訊云接口對(duì)接,實(shí)現(xiàn)短信驗(yàn)證碼功能變得非常簡(jiǎn)單,只需要幾行代碼就能夠輕松實(shí)現(xiàn)短信的發(fā)送,無(wú)須關(guān)心復(fù)雜的短信協(xié)議和底層實(shí)現(xiàn),讀者可以根據(jù)自己的實(shí)際需求,靈活使用騰訊云短信SDK提供的API來(lái)實(shí)現(xiàn)更豐富的短信功能2024-01-01

