上一篇通過夜神模擬器+Fiddler可以獲取到app調用接口地址,但是有些app風控策略簡直讓人崩潰。難以揣測的籤名和基於大數據的用戶行為分析,將接口訪問控制的死死的。對於大批量的數據訪問為了提高訪問速度需要直接調用接口來獲取數據。但是對於訪問不需要太頻繁的數據,是不是可以直接通過模擬APP的方式獲取,答案是肯定的。
現在隆重介紹一下mitmproxy:
mitmproxy是一個支持HTTP和HTTPS的抓包程序,有類似Fiddler、Charles的功能。除了命令行形式的控制臺,mitmproxy還有兩個關聯組件:mitmdump和mitmweb。
mitmdump:它是mitmproxy的命令行接口,利用它我們可以對接Python腳本,用Python實現監聽後的處理。
mitmweb:它是一個Web程序,通過它我們可以清楚觀察mitmproxy捕獲的請求。
使用mitmdump可以對接python腳本,然後就可以對攔截到的請求和返回數據做處理了。
這兒需要安裝Appium用來控制夜神模擬器對app進行操作。
1 安裝appium
從官網下載(http://appium.io/)直接安裝即可。
啟動界面如下:
通過appium控制夜神模擬器內的app時與直接操作手機app類似,但是可能連接時會報錯。
An unknown server-side error occurred while processing the command. Original error: Cannot verify the signature of '/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-uiautomator2-server/apks/appium-uiautomator2-server-v4.15.0.apk'. Original error: Could not find 'apksigner.jar' in ["/ApplicationsxAppPlayer.app/Contents/MacOS/platform-tools/apksigner.jar","/ApplicationsxAppPlayer.app/Contents/MacOS/emulator/apksigner.jar","/ApplicationsxAppPlayer.app/Contents/MacOS/cmdline-tools/latest/bin/apksigner.jar","/ApplicationsxAppPlayer.app/Contents/MacOS/tools/apksigner.jar","/ApplicationsxAppPlayer.app/Contents/MacOS/tools/bin/apksigner.jar","/ApplicationsxAppPlayer.app/Contents/MacOS/apksigner.jar"]. Do you have Android Build Tools installed at 『/ApplicationsxAppPlayer.app/Contents/MacOS'?
解決辦法:
在adb裡面找到錯誤描述的對應包,複製到夜神模擬器下的對應路徑下即可。
2 啟動mitmdump代理服務
對返回的數據進行處理
def response(flow:http.HTTPFlow): if '' in flow.request.url: pass text = flow.response.get_text() if text: pass對攔截到的請求進行自定義請求處理
def request(flow:http.HTTPFlow): if flow.request.host != '': passmitmdump -q -s mitmproxy_test.py - p 8866-q 屏蔽mitmdump默認的控制臺日誌,只顯示自己腳本中的日誌
-s 入口腳本文件
-p 代理服務埠號
3 啟動夜神模擬器
配置夜神模擬器代理為當前代理。
這樣當訪問app數據時就可以通過mitmdump攔截到數據,並且用python腳本對數據進行處理。
4 啟動python腳本
from appium import webdriverfrom time import sleep
FINGER_START_X = 300FINGER_START_Y = 1000
FINGER_SWIPE_X = 300FINGER_SWIPE_Y = 300
def collect(): jd_app_config = { "platformName": "Android", "deviceName": "test", "platformVersion": "7.1.2", "appPackage": "com.jingdong.app.mall", "appActivity": "main.MainActivity", "unicodeKeyboard": "True", "resetKeyboard": "True", "noReset": "True" }
driver =webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_capabilities = jd_app_config,keep_alive=True) sleep(5) try: bybt_close_btn = driver.find_element_by_xpath('//android.widget.ImageView[@content-desc="關閉頁面"]') if bybt_close_btn: bybt_close_btn.click() sleep(3) except Exception as e: print(repr(e)) virtual_search_btn = driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.RelativeLayout[3]/android.widget.ViewFlipper")
if virtual_search_btn: virtual_search_btn.click() sleep(3)
input_text_area = driver.find_element_by_id("com.jd.lib.search.feature:id/z8") if input_text_area: input_text_area.send_keys("紙巾") sleep(2) search_btn = driver.find_element_by_id("com.jingdong.app.mall:id/a9b") if search_btn: search_btn.click() sleep(15)
for i in range(348): driver.swipe(FINGER_START_X, FINGER_START_Y, FINGER_SWIPE_X, FINGER_SWIPE_Y) sleep(5)if __name__ == '__main__': collect()這樣腳本在執行時,就可以看到mitmdump控制臺的輸出了。