改進版在此:http://blog.csdn.net/lsjweiyi/article/details/79203722
事先說明:這只是幫助你百度題目,並沒有直接給你答案什麼的,作用應該是能幫助你找到3 5 到題的答案而已,剩下一些題目還得靠自己,談不上作弊。其次,這個腳本依賴網絡比較多,畢竟要調用百度的api。當然還有瀏覽器的啓動速度,畢竟答題就那麼10秒。
然而,此時的這些答題遊戲的獎金已經只有幾塊錢了,當初讓我有想法的時候還是幾十幾百的,現在這樣做,價值不高了。
思路:利用軟件對手機截屏 ,並實時保存到電腦上,軟件會自動創建一個文件夾(Pictures,原來是不存在的,當然這裏你需要修改圖片存儲的路徑),然後腳本檢測到這個文件夾創建成功了,就表示截屏了,下來就進行識別。識別利用百度的在線ocr(不是賣廣告,說實在的,儘管沒開源,好歹給我這種業餘愛好者一個解決方案,關鍵每天有免費次數,識別速度也快,還有更好的,請不吝賜教),然後把識別的文字百度並在瀏覽器打開。
關於百度的AI平臺:ocr地址:http://ai.baidu.com/tech/ocr/general。具體怎麼用自己看看文檔吧(說的一般吧),腳本里需要一些key,我就提一下怎麼獲得這裏的key,在上面的網址找到登錄,然後找到圖片裏的位置:
然後創建應用,然後摸索吧,就會有那些key了。
關於手機連接電腦的軟件我就隨便找了個叫totalControl的,好不好我不知道,我就隨便找的,反正目的就是能把手機實時截屏並上傳,手機屏幕分辨率適用1920*1080,可以換別的軟件,不過不要忘了根據實際修改相關的地方。
貼代碼,Python版本2.7.13,有一些庫需要安裝,自己去安裝吧,win32的庫,地址:http://download.csdn.net/download/xgin1/9392606
# _*_ coding:UTF-8 _*_
import win32con
import ctypes
import ctypes.wintypes
import threading
import time
import os
from PIL import Image
from aip import AipOcr#百度的api,百度官網有教程
import base64
import shutil
import string
import urllib
import urllib2
#熱鍵功能,獨立的一個線程
class Hotkey(threading.Thread): #創建一個Thread.threading的擴展類
def run(self):
global EXIT #定義全局變量,這個可以在不同線程間共用
user32 = ctypes.windll.user32 #加載user32.dll
try:
if not user32.RegisterHotKey(None, ID, 0, HOTKEY): # 註冊快捷鍵F10並判斷是否成功,該熱鍵用於結束程序,且最好這麼結束,否則影響下一次註冊熱鍵。
print "Unable to register id", ID # 返回一個錯誤信息
#以下爲檢測熱鍵是否被按下,並在最後釋放快捷鍵
msg = ctypes.wintypes.MSG()
while True:
if user32.GetMessageA(ctypes.byref(msg), None, 0, 0) != 0:
if msg.message == win32con.WM_HOTKEY:
if msg.wParam == ID:
EXIT=True
return
user32.TranslateMessage(ctypes.byref(msg))
user32.DispatchMessageA(ctypes.byref(msg))
finally:
user32.UnregisterHotKey(None, ID)#必須得釋放熱鍵,否則下次就會註冊失敗,所以當程序異常退出,沒有釋放熱鍵,
#那麼下次很可能就沒辦法註冊成功了,這時可以換一個熱鍵測試
class Ans():
def main(self):
im_name=os.listdir(path)#獲取圖片名
self.cut()#對圖片進行裁剪
f=open('im.jpg','rb')#二進制方式打開圖文件
image=f.read()#這裏好像必須命名爲image,百度的api限定,有點不能理解,有待考察
#im=base64.b64encode(f.read()) #讀取文件內容,轉換爲base64編碼
#這裏是每個百度雲賬號獨立的一些ID,你需要自己去弄你自己的
APP_ID='你的ID'
API_KEY='你的KEY'
SECRET_KEY='你的SECRET_KEY'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)#這個就是百度的api,可以獲取一個相當於實例對象的東西,可以調用函數
information=client.basicGeneral(image)#ocr函數,打印出來是json格式的
STR=''#存儲識別出來的文字
for i in range(0,information['words_result_num']):#根據格式得出來的循環
STR+=information['words_result'][i]['words'].encode('utf-8')
#下面幾行是對得到的字符串做一些處理,去掉一些符號,因爲百度搜索限制38個字以內,個人覺得這裏寫的很醜,無奈沒找到好的方法
STR=STR[1:len(STR)]
STR=STR.translate(None,string.punctuation)
STR=STR.replace('“','')
STR=STR.replace('”','')
STR=STR.replace('《','')
STR=STR.replace('》','')
self.find(STR)#調用百度搜索,並保存到本地,再用默認瀏覽器打開
print STR
f.close()#關閉文件,不然後面刪除不掉
shutil.rmtree(path)#刪除之前獲得的圖片文件以及這個文件夾,以便下次判斷是否已經截屏
#打開圖片並裁剪
def cut(self):
im_name=os.listdir(path)#獲取圖片名,因爲截屏靠的外部軟件,沒辦法修改截屏圖片的名字
im=Image.open(path+'\\'+im_name[0])
box1=(93,380,970,1200)#這個是把選項也截進來
box2=(93,380,970,630)#這個是不把選項截下來
crop_im=im.crop(box1)#裁剪函數
im.close()
crop_im.save('im.jpg')#保存本地,有不保存就直接用二進制打開的方式嗎??求教
#調用百度搜索,並保存到本地,再用默認瀏覽器打開,參考百度的資料,具體哪篇忘記了,,如有問題請聯繫我。。
def find(self,STR):
url = "http://www.baidu.com/s"
search = [('w',STR)]
getString = url + "?" + urllib.urlencode(search)
req = urllib2.Request(getString)
fd = urllib2.urlopen(req)
baiduResponse=fd.read()
fobj=open("baidu.html",'w')
fobj.write(baiduResponse)
os.startfile('baidu.html')#這個函數就很剛好的解決了大問題,可以用瀏覽器打開網頁,不然就得手點了
fobj.close()
if __name__ == '__main__':
HOTKEY=win32con.VK_F6 #結束程序的快捷鍵F6,自行根據需要修改,一定要手動關閉程序,否則下次這個快捷鍵就用不了了
path="E:\Python\cddh\Pictures"#存儲圖片的路徑,Pictures是軟件自動創建的,所以修改路徑時最後都要添加這個
EXIT = False #用來傳遞退出的參數
ID=106 #註冊熱鍵的唯一id,用來區分熱鍵
ans=Ans()#創建實例
hotkey = Hotkey()
hotkey.start()#啓動線程
while(True):
if os.path.exists(path):#檢測是否截屏了,截屏了就會生成Pictures文件夾
if os.listdir(path):#這裏再做檢測是因爲文件夾創建完不代表圖片就創建完成了,不信試試
time.sleep(0.1)#刪掉測試一下就知道爲什麼要加了。。反正我這裏測試是要加的
ans.main()
elif EXIT==True: #退出程序
break