python逆向微信指數(shù)爬取實(shí)現(xiàn)步驟
微信指數(shù)爬取
Appium + mitmproxy + 網(wǎng)易mumu安卓模擬器實(shí)現(xiàn)微信指數(shù)小程序爬取
通過appium實(shí)現(xiàn)將指令傳輸給手機(jī)進(jìn)行相關(guān)的操作,mitmproxy運(yùn)行Python腳本過濾出相關(guān)的請(qǐng)求,安卓模擬器取代真機(jī)使項(xiàng)目可以更好的落地。
1.MAC系統(tǒng)Appium的環(huán)境搭建
1. homebrew的安裝
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2. 通過brew安裝node
brew install node
檢查node是否安裝成功
node -v
3. 安裝npm
sudo bash sudo curl -L https://npmjs.org/install.sh | sh
檢查npm是否安裝完成
npm -v
4. 安裝android-sdk-macosx
鏈接: android-sdk-macosx.
下載完成因sdk缺少對(duì)應(yīng)的platform-tools和build-tools 執(zhí)行命令在彈出窗口進(jìn)行勾選下載platform-tools和build-tools
5. 安裝jdk
去官網(wǎng)下載:下載地址為直接下載dmg去安裝
鏈接:JDK
6. 環(huán)境變量配置
可參考以下配置
cd ~
vi .bash_profile
JAVA_HOME=/Library/java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home CLASSPAHT=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar PATH=$JAVA_HOME/bin:$PATH: export JAVA_HOME export CLASSPATH export PATH export ANDROID_HOME=/Users/admin/Desktop/android-sdk-macosx export PATH=$PATH:$ANDROID_HOME/tools export PATH=$PATH:$ANDROID_HOME/platform-tools
source .bash_profile
7. 安裝appium-doctor
檢查已有的環(huán)境是否都已成功
npm install -g appium-doctor
安裝完成appium-doctor 在終端輸入appium-doctor命令自動(dòng)檢查appium所依賴的包是否有缺失
8. 安裝appium命令行版
npm install -g appium
appium -v 查看版本號(hào)
9. 安裝mitmproxy
(抓包,中間人代理工具、支持SSL)
brew install mitmproxy
具體用法自行研究 本文只是簡單的使用
10.安裝網(wǎng)易mumu安卓模擬器
官網(wǎng)直接下載 有Mac版的
2.微信指數(shù)小程序爬取
1.啟動(dòng)appium 在終端輸入
appium
2.啟動(dòng)網(wǎng)易mumu安卓模擬器并安裝微信
3. 查看adb連接的設(shè)備
adb devices
首次需要先連接到模擬器 網(wǎng)易mumu端口號(hào)為7555 終端輸入
adb connect 127.0.0.1:7555
4. 模擬器安裝mitmproxy證書
將該證書打開在鑰匙串中找到修改全部信任
然后在模擬器中安裝 打開模擬器的設(shè)置—安全—從SD卡安裝
打開內(nèi)部存儲(chǔ)空間—MuMu共享文件夾—將信任的證書拖進(jìn)去即可
5.通過抓包發(fā)現(xiàn)微信指數(shù)小程序生成search_key的接口
編寫Python腳本過濾出該請(qǐng)求并將該請(qǐng)求的響應(yīng)內(nèi)容(search_key)寫入Mongo庫
import json import time import sys from pymongo import MongoClient def response(flow): client = MongoClient("xx.xx.xx.xx",27017) db = client["Spider"] url = "https://search.weixin.qq.com/cgi-bin/searchweb/weapplogin" if flow.request.url.startswith(url): text = flow.response.text data = json.loads(text) search_key = data.get("data").get("search_key") with open("./search_key.txt",'w+') as f: f.write(search_key) ''' search_key 博主是入庫然后scrapy爬蟲從庫中讀search_key進(jìn)行請(qǐng)求 具體怎么用自己按情況即可 '''
使用mitmdump -s xxx.py 執(zhí)行Python腳本
mitmdump -s test.py
先手動(dòng)點(diǎn)擊進(jìn)入微信指數(shù)小程序觸發(fā)生成search_key的接口 此時(shí)mitmproxy運(yùn)行python程序按照代碼對(duì)該請(qǐng)求進(jìn)行過濾并將響應(yīng)中的search_key取出寫入到本地文件
到了這一步大家應(yīng)該已經(jīng)知道微信指數(shù)小程序的爬取方式了 在這里說下生成search_key接口的觸發(fā)規(guī)則:首次進(jìn)入微信指數(shù)小程序 2.三十分鐘search_key失效
6.編寫appium模擬點(diǎn)擊微信進(jìn)入微信指數(shù)小程序觸發(fā)search_key指令代碼
import time from appium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from pymongo import MongoClient PLATFORM='Android' deviceName='emulator-5554' # app_package和app_activity可以通過adb shell進(jìn)行獲取 app_package='com.tencent.mm' app_activity='.ui.LauncherUI' driver_server='http://127.0.0.1:4723/wd/hub' class Moments(): def __init__(self): self.desired_caps={ 'platformName':PLATFORM, 'deviceName':deviceName, 'appPackage':app_package, 'appActivity':app_activity, 'noReset': "True", } self.driver=webdriver.Remote(driver_server,self.desired_caps) self.wait=WebDriverWait(self.driver,300) def login(self): # 允許獲取xx yunxu1 = self.wait.until(EC.presence_of_element_located((By.ID,'com.android.packageinstaller:id/permission_allow_button'))) yunxu1.click() time.sleep(5) # 允許獲取xxx yunxu2 = self.wait.until(EC.presence_of_element_located((By.ID,'com.android.packageinstaller:id/permission_allow_button'))) yunxu2.click() time.sleep(5) # 登陸按鈕 login = self.wait.until(EC.presence_of_element_located((By.ID,'com.tencent.mm:id/d75'))) login.click() time.sleep(3) # 手機(jī)號(hào) phone = self.wait.until(EC.presence_of_element_located((By.ID,'com.tencent.mm:id/hz'))) phone.send_keys("xxxxxx") time.sleep(3) # 下一步 nextButton = self.wait.until(EC.presence_of_element_located((By.ID,'com.tencent.mm:id/alr'))) nextButton.click() time.sleep(2) # 密碼 passButton = self.wait.until(EC.presence_of_element_located((By.ID,"com.tencent.mm:id/hz"))) passButton.send_keys("xxxxx") time.sleep(2) # 登陸 login2 = self.wait.until(EC.presence_of_element_located((By.ID,'com.tencent.mm:id/alr'))) login2.click() time.sleep(6) # 不允許獲取通訊錄 notButton = self.wait.until(EC.presence_of_element_located((By.ID,"com.tencent.mm:id/an2"))) notButton.click() time.sleep(5) def test(self): ''' 登陸之后 依次點(diǎn)擊發(fā)現(xiàn) 小程序 微信指數(shù) 觸發(fā)接口 ''' time.sleep(10) self.driver.tap([(428,1214),(471,1251)],100) time.sleep(5) # 發(fā)現(xiàn)頁小程序的坐標(biāo) self.driver.tap([(85,787),(148,816)],100) time.sleep(5) self.driver.tap([(114,237),(206,269)],100) time.sleep(20) self.driver.tap([(644,42),(708,85)],100) def main(self): # 首次登陸 self.login() self.test() M=Moments() M.main()
鄭重聲明:首次登陸以后的每次操作只需要執(zhí)行test方法點(diǎn)擊到發(fā)現(xiàn)—小程序—微信指數(shù)即可,可以通過noReset:True設(shè)置每次不重新安裝app,所以不必每次都登陸賬號(hào)導(dǎo)致增加不必要的操作
通過uiautomatorviewer獲取appium頁面元素進(jìn)行定位
總結(jié):
通過appium將模擬點(diǎn)擊的指令操控模擬器進(jìn)行點(diǎn)擊進(jìn)入微信指數(shù)的小程序觸發(fā)search_key接口的生成,然后通過mitmdump -s xx.py程序進(jìn)行過濾出相應(yīng)請(qǐng)求將響應(yīng)中的search_key進(jìn)行持久化 爬取數(shù)據(jù)的時(shí)候還是使用scrapy (直接使用模擬器爬取不是好的方法)。方案可能不是最好的但是比直接破解微信登錄接口、js_code(生成search_key的必要參數(shù)) 要好很多了
以上就是python逆向微信指數(shù)爬取實(shí)現(xiàn)步驟的詳細(xì)內(nèi)容,更多關(guān)于python逆向微信指數(shù)爬取的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python包中__init__.py文件的作用與用法實(shí)例詳解
我們新建python包時(shí)常常會(huì)看到一個(gè)__init _.py文件,下面這篇文章主要給大家介紹了關(guān)于Python包中__init__.py文件的作用與用法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06python隨機(jī)數(shù)分布random均勻分布實(shí)例
今天小編就為大家分享一篇python隨機(jī)數(shù)分布random均勻分布實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11python使用opencv驅(qū)動(dòng)攝像頭的方法
今天小編就為大家分享一篇python使用opencv驅(qū)動(dòng)攝像頭的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08PyQt 實(shí)現(xiàn)使窗口中的元素跟隨窗口大小的變化而變化
今天小編就為大家分享一篇PyQt 實(shí)現(xiàn)使窗口中的元素跟隨窗口大小的變化而變化,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06Python中使用語句導(dǎo)入模塊或包的機(jī)制研究
這篇文章主要介紹了Python中使用語句導(dǎo)入模塊或包的機(jī)制研究,同時(shí)對(duì)比了幾種導(dǎo)入包或模塊的語句并簡要說明了這幾種方法之間的幾點(diǎn)優(yōu)劣,需要的朋友可以參考下2015-03-03使用Python實(shí)現(xiàn)一個(gè)蔡徐坤大戰(zhàn)籃球的小游戲(推薦)
這篇文章主要介紹了用Python實(shí)現(xiàn)一個(gè)蔡徐坤大戰(zhàn)籃球的小游戲,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12django將圖片上傳數(shù)據(jù)庫后在前端顯式的方法
今天小編就為大家分享一篇django將圖片上傳數(shù)據(jù)庫后在前端顯式的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05詳解Python之?dāng)?shù)據(jù)序列化(json、pickle、shelve)
本篇文章主要介紹了Python之?dāng)?shù)據(jù)序列化,本節(jié)要介紹的就是Python內(nèi)置的幾個(gè)用于進(jìn)行數(shù)據(jù)序列化的模塊,有興趣的可以了解一下。2017-03-03Python學(xué)習(xí)之Django的管理界面代碼示例
這篇文章主要介紹了Python學(xué)習(xí)之Django的管理界面代碼示例,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02