微信小程序頭腦風暴2答題輔助


今天來做一個好玩的,這個腳本做出來需要一點腦洞,hh~

當然,當你可以用adb控制手機的時候,不止能干這么些,還有更多有意思的,這就需要更大的腦洞了,比如自動薅羊毛~

思路:

  1. 利用adb截手機實時圖
  2. 利用python圖像處理庫PIL處理圖片將問題和答案的那一塊截出來
  3. 利用百度識圖,將圖片轉為中文字符串
  4. 利用百度搜索,搜索已轉為中文字符串的問題
  5. 統計百度返回網頁源碼中對應答案出現的次數,出現次數最多的則視為正確答案
  6. 繼續利用adb模擬點擊手機中答案位置

什么是adb?

adb即 Android Debug Bridge,我們一般簡稱為adb,它是一個非常強大的命令行工具,通過這個工具你能夠利用電腦與你的android設備進行交互。

adb下載:百度網盤獲取:鏈接:https://pan.baidu.com/s/1tElgryyIuKRJ3h1PPSgGLw 密碼:reop

記得將解壓后的工具包添加到系統變量上,這樣方便你用python腳本調用它。

可以參考這篇博文:常用的adb命令

 

 

一、將手機與電腦連接上

這一步首先需要手機開啟開發者模式,因為各個手機打開的方式不一樣,請根據自己機型自行百度。

 

然后是將手機用usb線連接電腦,在cmd下輸入adb devices

 

若有如下圖的返回則手機和電腦連接成功:

 

 

 

二、按上面的思路來打碼

1、 利用adb截手機實時圖

2、利用python圖像處理庫PIL處理圖片將問題和答案的那一塊截出來

這兩步放在一個函數里就行了

這里先說一說下面一些(left, upper, right, lower)坐標是怎么確定的

首先,從微信進入頭腦王者2,開始一場比賽

將比賽的有題目圖截下來,截到圖片的一般大小都是(1920*1080),比如下圖:

 

然后以實際尺寸打開這張圖片,再用截圖工具量一下所需位置的寬高(當你截圖時,一般截圖工具會顯示將要截的像素大小),或者你有更好的方法就另說。比如下兩圖是我獲取問題的位置(左,上,右,下)的思路,其他位置也是這樣獲取:

 

 

然后就確定這些坐標了~

 adb截手機實時圖代碼:

import os
import random
import requests
import subprocess

from PIL import Image
from aip import AipOcr
from io import BytesIO

def get_screenshot():
    process=subprocess.Popen('adb shell screencap -p',shell=True,stdout=subprocess.PIPE)
    #相對於在cmd下執行了adb shell screencap -p,將會去截手機屏幕圖
    screenshot=process.stdout.read()
    #讀取截到的數據
    screenshot=screenshot.replace(b'\r\n', b'\n')
    #adb直接截的圖在有點的問題,以二進制替換一下字符就可以了。
    img_fb=BytesIO()
    #BytesIO操作二進制數據,因為圖片是二進制文件
    img_fb.write(screenshot)
    #寫入內存
    img=Image.open(img_fb)
    #在內存打開圖片
    title_img=img.crop((200,420,890,790))
    #裁剪原圖,對應(left, upper, right, lower)剪出來的是問題那部分圖片
    answers_img=img.crop((80,960,1000,1720))
    #裁剪原圖,剪出來的是答案那部分圖片

    new_img=Image.new('RGBA',(920,1140))
    #新建一張圖片,用來保存上面剪問題和答案部分,就是去掉了玩家頭像之類的那些雜質
    new_img.paste(title_img,(0,0,690,370))
    #問題粘貼到新建的大圖
    new_img.paste(answers_img,(0,380,920,1140))
    #答案粘貼到新建的大圖,過濾了不必要的元素

    new_img_fb=BytesIO()
    new_img.save(new_img_fb,'png')
    #保存圖片
    with open('test.png','wb') as f:
        f.write(new_img_fb.getvalue())
    return new_img_fb  #返回新生成的圖片

 

3、利用百度識圖,將圖片轉為中文字符串

到百度雲注冊個賬號:直達

到控制台-產品服務-人工智能-文字識別創建一個文字識別的應用如下,這種普通的文字識別每月有5w次的免費次數(開通這個應用免費,不用實名認證),我感覺沒什么特殊的要求的話這已經綽綽有余了。

 

創建之后要找到這個位置,待會要用到里面的key:

 

對,還要pip安裝百度雲的python sdk

pip install baidu-aip

詳情可到這里看看:文檔直達

具體的利用:

def get_word_by_image(img):
    APPID = ''
    APIKey = ''
    SecretKey = ''  #這三個都在賬號里面,上面有提到
    client = AipOcr(APPID, APIKey, SecretKey)  #創建鏈接
    res=client.basicGeneral(img)  #將圖片傳過去
    return res  #識圖結果

 

4、利用百度搜索,搜索已轉為中文字符串的問題

5、統計百度返回網頁源碼中對應答案出現的次數,出現次數最多的則視為正確答案

這兩個也在一個函數里~

寫個簡單的爬蟲邏輯就行了,如下:

def baidu(question,answer):
    url='https://www.baidu.com/s'
    headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
    data={
        'wd':question
    }
    res=requests.get(url=url,params=data,headers=headers)
    res.encoding=res.apparent_encoding
    html=res.text
    for i in range(len(answer)):
        answer[i]=(html.count(answer[i]),answer[i],i)  #循環4次,將答案在百度返回源碼中出現的次數統計出來
    answer.sort(reverse=True)  #按降序排序答案,以出現在源碼中次數最高的為答案
    return answer

 

6、繼續利用adb模擬點擊手機中答案位置

def click(point):
    cmd='adb shell input swipe %s %s %s %s %s'%(
        point[0],
        point[1],
        point[0]+random.randint(0,3),  #swipe實際上是拖動手機,這里加randint(0,3)是為了模擬長按手機
        point[1]+random.randint(0,3),
        200  #上面4個為坐標,這個200為持續點擊的時間ms為它的單位
    )
    os.system(cmd)

三、利用以上函數

config={  #配置
    '頭腦王者':{
        'title':(200,420,890,790), #用來記錄標題的位置
        'answers':(80,960,1000,1720),
        'point':[
            (316,993,723,1078),
            (316,1174,723,1292),
            (316,1366,723,1469),
            (316,1570,723,1657),#四個答案的位置
        ]
    }
}


def run():
    print('准備答題')
    while True:
        input('請按回車鍵開始答題:')
        img=get_screenshot()
        info=get_word_by_image(img.getvalue())
        if info['words_result_num']<5:
            continue
        answers=[x['words'] for x in info['words_result'][-4:]]  #提取返回的對應題目答案的中文字符串,這個與百度雲返回的數據結構有關,不必深究,會用就行
        question=''.join([x['words'] for x in info['words_result'][:-4]])  #提取返回的問題的中文字符串
        res=baidu(question,answers)
        print(question)
        print(res)
        print(config['頭腦王者']['point'][res[0][2]])
        click(config['頭腦王者']['point'][res[0][2]])  #模擬點擊

 四、總結

因為腳本有多次圖像處理及連接網絡的要求,所以效率會有點慢的其實。

而且也不一定對,因為是靠百度的答案,若你有題庫就能快很多了。

 

 

The end~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM