衝頂大會、百萬英雄等答題遊戲助手(Python腳本)

改進版在此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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章