也許有人覺得抓手機的數據包都費勁,還搞什么自動化,而且肯定不簡單。但我要告訴你的是,這一切都被一個叫Airtest的自動化測試軟件給搞定了,你只需要把它一直運行著,你的手機上的所有操作,就都交給它了,直接就是點點點。
這里我們需要連接手機,由于小編有模擬器,為了不影響小編玩手機,所以我決定用Airtest模擬器來連接手機,打開模擬器,選擇關于平板電腦,如圖:
連擊多次版本號,直到出現開發者選項功能,然后打開開發者選項下的USB調試,如圖:
這樣我們就開啟了USB調試,下面我們Airtest來遠程連接我們的模擬器,如圖:
這里有一個知識需要向大家說明的就是,我們連接的遠程端口號不是隨便弄的,而是根據模擬器的不同而使用的不同的端口號,模擬器和端口號一一對應關系如下:
這樣選擇好我們的主機地址和端口號后就可以進行連接了,然后我們點擊connect就可以直接連接了,如圖:
由于我們是使用模擬器連接,所以圖上第一項最好選上,不然模擬器即使連接上了也是沒有畫面的。如果還是沒有畫面,那可能是因為屏幕捕捉程序“yosemite.apk”沒有下載到模擬器中,在Airtest中找出來,直接拖動到模擬器中,再次連接模擬器,打開一看,如圖:
成功連接上了。下面就上面三個選項跟大家簡單描述下:
use javacap:#解決IDE中手機畫面黑屏的問題
use ADB orientation :#解決IDE中屏幕旋轉的問題
use ADB touch:#解決IDE中屏幕無法點擊的問題
這里我們不光可以和模擬器建立連接,還可以和我們已打開或者未打開的應用進行連接操作,我們可以點擊選定窗口,選擇指定的應用程序,這樣程序就會被加載到Airtest中去了,這里我打開了360瀏覽器,如圖:
可以看到被加載進去了,我們可以在里面瀏覽了,但是此時我們的桌面上的瀏覽器卻不翼而飛,這就是因為Airtest正在使用我們的瀏覽器,當我們點擊斷開當前設備就可以關閉掉這個設備,此時便可以重新看到瀏覽器又回到了我們的桌面了,如圖:
雖然模擬器很方便,但是畢竟很麻煩,而且萬一你的電腦配置不行的話,那么模擬器可能開不了幾個應用就爆了,所以這里我們也要使用手機來連接Airtest,手機相比其它的連接方式略顯復雜,下面請看我表演。
首先我們需要將數據線插入電腦的USB接口,然后還是打開開發者選項和USB調試;只不過手機可不像模擬器,除了以上選項要設置之外,我們還需要設置默認USB配置,并把它設為MIDI,默認USB配置就在USB調試的下方,如圖:
然后選擇MIDI,如圖:
這樣手機端的開發者選項設置算是全部完結了,但是這樣還是遠遠不夠的,你還需要一大堆操作,是的,沒錯,一大堆,這款IDE最大的毛病就在這,正是驗證了一句話,安裝兩小時,編程兩分鐘,哈哈哈哈。
因為小編手機是Vivo的,所以小編在網上下了一個Vivo的驅動程序包,如果你的手機跟小編不是一個版本,那么請看下面:
三星: http://www.samsung.com/cn/support/downloads
華為: http://consumer.huawei.com/minisite/HiSuite_cn/
小米: http://bigota.d.miui.com/tools/xiaomi_usb_driver.rar
Vivo: http://zs.vivo.com.cn/download.php
魅族:http://care.meizu.com/
一加:http://service.oneplus.cn/
華碩: http://www.asus.com.cn/support/
聯想: http://www.lenovocare.com.cn/default.aspx
LG: http://www.lg.com/us/support/software-firmware-drivers
索尼: https://developer.sony.com/develop/drivers/
摩托羅拉: https://mobilesupport.lenovo.com/us/en/solution/MS88481
HTC: http://www.htc.com/us/software/htc-sync-manager/
谷歌: https://developer.android.com/studio/run/win-usb.html
黑莓: https://swdownloads.blackberry.com/Downloads/entry.do?code=4EE0932F46276313B51570F46266A608
戴爾: http://www.dell.com/support/home/us/en/04/Products?app=drivers&lwp=rt
宏基: https://www.acer.com/ac/en/US/content/drivers
如果上面還是沒有,那么你可能需要一款兼容所有設備的驅動軟件,驅動人生或者驅動精靈,隨意挑選一個即可。
如果我們在Airtest中要輸入文字的話,使用手機自帶的輸入法是沒辦法輸入的,必須使用我們前面提到的“yosemite”輸入法,這里在我們安裝好手機的驅動后會自動下載到你的手機的,你只需要安裝即可。如圖:
然后我們再設置系統默認輸入法為這個輸入法即可,如圖:
雖然設置好了后我們可以輸入文字了,但是有時候的話可能鼠標點擊的不是很準確,那么這個時候,我們還需要設置模擬位置,同樣在開發者選項中,如圖:
這樣設置好后,回到我們的Airtest主界面,我們就可以看到已經出現了設備的名稱和狀態了,如圖:
還是如模擬器一樣,點擊Connect 勾選Use Javacap,這時設備就已經成功連接上了,如圖:
這里我們無需準備數據線也可以連接上我們的安卓機,只要你三個步驟完成好了,就簡單了。我們首先需要知道安卓真機的IP地址,可在這里查看,如圖:
然后我們使用這個IP地址在Airtest中建立連接,如圖:
注意這里的端口號是5555,如果你寫其它的端口的話也可以運行,但是它是無法監聽TCP/IP信息的,如果你想指定多個這樣的端口,命令提示符輸入如下命令即可:
adb tcpip 666#開啟666端口
這里有個前提,就是手機必須和我們IDE所處在同一個Wifi網絡環境下才行,否則是訪問不到的。
這里我們雙擊腳本編輯窗,設置一個編輯器的腳本文件,如下:
設置完畢后返回即可看到如下畫面:
然后我們就可以在這里面連接安卓機了,具體代碼如下:
connect_device('Android://127.0.0.1:5037/手機IP地址:5555')#前面是本機號和端口后面就是你手機的IP地址了
請大家注意,這里同樣需要安卓機子和IDE處在同一個WiFi網絡環境下哦。
今天我們講的是這款自動化工具的安裝和界面功能的剖析,這個工具整體上來說,用法比較簡單,就是安裝坑太多,新手小白可能要花一些時間才能整明白,在此特與大家分享,愿大家學習之路更加平坦順暢。下次我們再來講講IDE的妙用。
在日常開發中,經常需要根據設備的類型來做不同的適配或邏輯處理。特別是在移動端開發中,判斷用戶使用的設備類型是手機還是平板電腦是非常常見的需求。本文將介紹使用 JavaScript 判斷設備類型的方法,并提供相應的代碼示例。
User-Agent 是瀏覽器在發送 HTTP 請求時,會在請求頭中附帶的一個字符串,其中包含了有關瀏覽器和操作系統的信息。我們可以通過解析 User-Agent 字符串來判斷設備類型。
// 獲取 User-Agent 字符串
const userAgent=window.navigator.userAgent;
// 判斷是否是手機
const isMobile=/Mobile/i.test(userAgent);
// 判斷是否是平板電腦
const isTablet=/Tablet/i.test(userAgent);
上述代碼首先通過 window.navigator.userAgent 獲取到當前瀏覽器的 User-Agent 字符串。然后通過正則表達式匹配判斷是否是手機或平板電腦。
另一種判斷設備類型的方法是根據屏幕寬度進行判斷。通常,手機的屏幕寬度比較窄,而平板電腦的屏幕寬度較寬。
// 獲取屏幕寬度
const screenWidth=window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
// 判斷是否是手機
const isMobile=screenWidth < 768;
// 判斷是否是平板電腦
const isTablet=screenWidth >=768 && screenWidth < 1024;
上述代碼中,我們通過 window.innerWidth、document.documentElement.clientWidth 和document.body.clientWidth 來獲取到屏幕寬度,然后根據寬度范圍判斷設備類型。
下面是一個完整的示例代碼,演示了如何根據設備類型來顯示不同的提示信息:
// 獲取 User-Agent 字符串
const userAgent=window.navigator.userAgent;
// 獲取屏幕寬度
const screenWidth=window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
// 判斷是否是手機
const isMobile=/Mobile/i.test(userAgent) || screenWidth < 768;
// 判斷是否是平板電腦
const isTablet=/Tablet/i.test(userAgent) || (screenWidth >=768 && screenWidth < 1024);
if (isMobile) {
console.log("您正在使用手機訪問");
} else if (isTablet) {
console.log("您正在使用平板電腦訪問");
} else {
console.log("您正在使用桌面電腦訪問");
以上代碼中,在判斷設備類型后,通過控制臺打印不同的提示信息。
本文介紹了兩種常見的判斷設備類型的方法,并提供了相應的代碼示例。通過這些方法,我們可以根據設備類型來進行不同的適配或邏輯處理,提升用戶的體驗。在實際開發中,可以根據具體需求選擇合適的方法來判斷設備類型。
如若轉載,請注明出處:開源字節 https://sourcebyte.vip/article/348.html
近在搞 App 爬蟲,不過萬事入門難,我得自己研究研究 Mitmproxy 雖然不知道到底是不是那么強啦,就是得要會用,所以我就親自入坑,并把自己的一下觀點比較記錄下來,畢竟好記性不然爛筆頭嘛。
mitmproxy 是一個支持 HTTP 和 HTTPS 的抓包程序,有類似 Fiddler、Charles 的功能,只不過它是一個控制臺的形式操作。
mitmproxy 還有兩個關聯組件。一個是 mitmdump ,它是 mitmproxy 的命令行接口,利用它我們可以對接Python 腳本,用Python實現監聽后的處理。另一個是 mitmweb,它是一個 Web 程序,通過它我們可以清楚觀察 mitmproxy 捕獲的請求。
接下來我將給同學們講解 Mitmproxy 抓包工具的安裝及介紹,之前我分享了 Fiddler 抓包工具的安裝以及簡單操作,通過 Fiddler 抓包工具我們可以抓取 Web 端和 App 端的數據。今天給大家介紹另一款強大的抓包工具同樣可以抓取 Web 端和 App 端的數據,并且可以和 Python 語言融合在一起,通過爬蟲來抓取數據—— Mitmproxy 。
Mitmproxy 其實就是用來做中間人攻擊的,那什么是中間人工具呢?
圖一
其實,上面這張圖(圖一)和我們上節課講的 Fiddler 那張圖很像,我們的 Mitmproxy 就和 Fiddler 一樣,在上圖的 Man in the Middle 位置一樣,在中間做一些截取和查看,用于中間人代理其實和正常的一樣,會將我們客戶端發起的請求截取,然后轉發給我們的服務器(不過是多了一個中間人,這個中間人可以修該或者不修改你發起請求的數據),服務器收到請求之后會收到響應,同樣我們的 Mitmproxy 會截獲這個響應,最后再轉發給我們的 Client 。所以總結下來就是以下三點:
Mitmproxy 不同于 Fiddler 之類的抓包工具,不僅可以截獲數據并且可以幫助開發者查看分析等操作,更可以自定義腳本來進行二次開發,舉個例子來講:利用 Fiddler 可以過濾出瀏覽器對某個特定 URL 的請求,并且查看和分析數據,但是,實現不了高度的定制化需求。例如:截獲對該瀏覽器的請求,將返回數據為空并將真實的返回數據存到某一個數據庫中或者出現異常的時候發出郵件通知。
上面所說的功能 Fiddler 實現不了,但對于 Mitmproxy 來說,可以使用載入自定義的 Python 腳本來實現,Mitmproxy 并不會對無辜的人發起攻擊,由于我們的 Mitmproxy 工作在 HTTP 中,而當前通過 HTTPS 的普及,使客戶端擁有檢測規避中間人的能力,所以要讓我們 Mitmproxy 正常工作的話必須讓我們客戶端或者 App 信任 Mitmproxy 的 SSL 證書或者忽略證書異常。
其實和 Fiddler 差不多,Fiddler 也是安裝了一個自己的證書使的客戶端信任,所以 Mitmproxy 一樣也是要讓瀏覽器或者 App 信任該證書,讓 Mitmproxy 在中間充當一個中間人的角色——達到截獲請求或者響應。
這個不是在做黑產,而是在做我們的開發測試。
在正式安裝之前,我們先來看看 Mitmproxy 需要一個怎樣的安裝環境。
首先,我們需要打開我們的命令行工具 CMD ,直接在命令行命令輸入以下命令:
回車就可以安裝了,如果以上安裝不了出現問題,建議先給自己的 pip 換源一下:Windows pip 換源,但是如果出現報錯,咱們繼續往下看 。
如果出現以下類似的報錯信息(圖二)我們有兩種解決方法,第一種安裝 Microsoft Visual c++ Build Tools,來一勞永逸的解決,方法如下:
圖二
上圖(圖二)出現的報錯信息,最重要的是:error:Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual c++ Build Tools":landinghub.visualstudio.com/visual-cpp-build-tools
記住!認真看報錯信息,按你具體提示是鏈接去瀏覽器訪問。當然有可能鏈接會訪問失敗出現 404 之類的。
那如果不行,同學們可以直接下載完成之后,我來進行安裝,安裝也非常的方便,直接運行安裝程序即可。這里我簡單的把安裝截圖演示出來(圖三):
圖三
出現下圖(圖四)就已經正在安裝了:
圖四
安裝時間看具體電腦,會比較久一些。通過一段時間等待,就安裝成功了,需要你重啟計算機,重啟之后再次運行以下命令即可:
此方法如果不能解決還需要用方法解決,請同學們靈活選擇。
點擊下面鏈接下載文件,放到桌面(當然,你也看放到其他位置,放到桌面主要為了小白方便,比如我這里演示的時候,.whl 文件放在我的電腦桌面上,我的文件路徑:C:\Users\clela\Desktop,接下來我們在命令行輸入以下內容:
如果沒有報錯,則安裝成功。如果其他問題可以自行百度或者底欄留言即可。
那我們該如何驗證呢?我們可以查看一下 mitmproxy 的版本,我們在命令行輸入:
但是結果報錯了 ,我們來看看報錯內容:
我們來簡單翻譯一下:錯誤:mitmproxy控制臺接口不支持在Windows。您可以運行mitmdump或mitmweb代替。,那這個時候又同學會說:那我們不是白安裝了嗎?裝了半天,還解決 Bug 結果:mitmproxy 不能用,怎么辦?
但是,我們可以看見上面報錯提示:您可以運行mitmdump或mitmweb代替 所以也就是說 mitmproxy 有兩個組件,一個是 mitmdump 另一個是 mitmweb 也就是這三個我們用哪個都可以。
一般我們抓包用的是:mitmproxy ,在與 Python 交互的時候用哪一個呢?——我們用的是 mitmdump 而在 Windows 里面我們用 mitmweb ,在 Linux 里面使用 mitmproxy 。在 Linux 與 Windows 里面都是用 mitmdump 與 Python 交互。
那接下來我們來看一下 mitmdump 的版本號,命令如下:
輸出結果如下:
由上面的結果可知,我們的 Mitmproxy 版本:5.1.1 基于我的 Python 版本:3.7.6 等信息,表明我們 Mitmproxy 安裝成功的,而我們的安裝平臺是:Windows-10-10.0.18362-SP0 (也就是 Windows 10)。
上面我們在 Windows 平臺上安裝了 Mitmproxy 接下來我們來看看如何在 Linux 上安裝。
在 Linux 里面也是基于 Python 安裝的,我們也使用如下命令:
這里使用 pip3 的原因是,Linux 自帶 Python2 所以這里是為了區分也是為了使用 Python3 所以使用。
這里我們也是可以查看 mitmproxy 版本號,這回就不會出現 Windows 里面報錯的信息了,命令如下:
上面給大家講解了 Mitmproxy 在 Windows 、Linux 平臺的安裝,如果你對安裝有任何問題歡迎留言!
接下來,我們來看看 Mitmproxy 有哪幾項功能,如下:
和 Charles 一樣,Mitmproxy 運行于自己的 PC 上,mitmproxy 會在 PC 的 8080 端口運行,然后開啟一個代理服務,這個服務實際上是一個 HTTP/HTTPS 的代理。
手機和 PC 在同一個局域網內,設置代理為 mitmproxy 的代理地址,這樣手機在訪問互聯網的時候流量數據包就會流經 mitmproxy,mitmproxy 再去轉發這些數據包到真實的服務器,服務器返回數據包時再由 mitmproxy 轉發回手機,這樣 mitmproxy 就相當于起了中間人的作用,抓取到所有 Reques t和 Response,另外這個過程還可以對接 mitmdump,抓取到的 Request 和 Response 的具體內容都可以直接用 Python 來處理,比如得到Response 之后我們可以直接進行解析,然后存入數據庫,這樣就完成了數據的解析和存儲過程。
首先,我們需要運行 mitmproxy,命令如下所示:
啟動 mitmproxy 的命令如下:
之后會在8080端口上運行一個代理服務,如下圖所示。
右下角會出現當前正在監聽的端口。
或者啟動 mitmdump,它也會監聽 8080 端口,命令如下所示:
運行結果如下圖所示。
將手機和 PC 連接在同一局域網下,設置代理為當前代理。首先看看PC的當前局域網IP。
Windows 上的命令如下所示:
Linux 和 Mac 上的命令如下所示:
輸出結果如下圖所示。
Linux/Mac:
Windows:
一般類似 10.*.*.*或 172.16.*.* 或 192.168.1.* 這樣的 IP 就是當前 PC 的局域網 IP,例如此圖中 (Linux)PC 的 IP 為192.168.220.130,手機代理設置類似如下圖所示。
這樣我們就配置好了mitmproxy的的代理。
確保 mitmproxy 正常運行,并且手機和 PC 處于同一個局域網內,設置了 mitmproxy 的代理,具體的配置方法可以參考官方文檔。
運行 mitmproxy,命令如下所示:
設置成功之后,我們只需要在手機瀏覽器上訪問任意的網頁或瀏覽任意的 App 即可。
不過還要安裝證書才可以使用,操作方法啟動 mitmproxy 之后,在手機上也設置代理之后,打開瀏覽器輸入:mitm.it 下載手機平臺的證書并安裝。
例如在手機上打開頁面便會呈現出手機上的所有請求,如下圖所示。
這就相當于之前我們在瀏覽器開發者工具監聽到的瀏覽器請求,在這里我們借助于mitmproxy完成。Charles完全也可以做到。
這里是剛才手機打開百度頁面時的所有請求列表,左下角顯示的 1/36 代表一共發生了 36 個請求,當前箭頭所指的是第一個請求。
每個請求開頭都有一個 GET 或 POST,這是各個請求的請求方式。緊接的是請求的 URL。第二行開頭的數字就是請求對應的響應狀態碼,后面是響應內容的類型,如 text/html 代表網頁文檔、image/gif 代表圖片。再往后是響應體的大小和響應的時間。
當前呈現了所有請求和響應的概覽,我們可以通過這個頁面觀察到所有的請求。
如果想查看某個請求的詳情,我們可以敲擊回車,進入請求的詳情頁面,如下圖所示。
可以看到 Headers 的詳細信息,如 Host、Cookies、User-Agent 等。
最上方是一個Request、Response、Detail的列表,當前處在Request這個選項上。這時我們再點擊TAB鍵,即可查看這個請求對應的響應詳情,如下圖所示。
最上面是響應頭的信息,下拉之后我們可以看到響應體的信息。針對當前請求,響應體就是網頁的源代碼。
這時再敲擊TAB鍵,切換到最后一個選項卡 Detail,即可看到當前請求的詳細信息,如服務器的IP和端口、HTTP協議版本、客戶端的IP和端口等,如下圖所示。
mitmproxy 還提供了命令行式的編輯功能,我們可以在此頁面中重新編輯請求。
敲擊 e 鍵即可進入編輯功能,這時它會詢問你要編輯哪部分內容,如 Cookies、Query、URL 等,每個選項的第一個字母(或數字)會高亮顯示。
敲擊要編輯內容名稱的首字母(或數字)即可進入該內容的編輯頁面,如敲擊 5 即可編輯請求的方式,敲擊 6 即可修改 GET 請求參數 Query 。
這時我們敲擊 6,進入到編輯 Query 的頁面。我們可以看到已經有一些參數了,我們可以敲擊 a 來增加一行,然后就可以輸入參數對應的 Key 和 Value,如下圖所示。
這里我們輸入 Key 為 wd,Value 為aiyc.top。
然后再敲擊 esc 鍵和 q 鍵,返回之前的頁面,再敲擊 e 和 4 鍵修改 Path 。和上面一樣,敲擊 a 增加 Path 的內容,這時我們將 Path 修改為 aiyuechuang,如下圖所示。
再敲擊 esc 和 q 鍵返回,我們就再修改一下請求,也是敲擊 e 和 5 修改 method,這個時候會出現如下結果,操作如下動圖:
敲擊 a 保存修改,敲擊 r 重新發起修改后的請求,即可看到上方請求方式前面多了一個回旋箭頭,這說明重新執行了修改后的請求。這時我們再觀察響應體內容,即可看到請求失敗,因為我的博客是不存在這個請求鏈接的,如下圖所示。
以上內容便是 mitmproxy 的簡單用法。利用 mitmproxy ,我們可以觀察到手機上的所有請求,還可以對請求進行修改并重新發起。
接下來,我們對編輯操作進行簡單的小結:
e進入 Part,a增加一行
主界面操作快捷鍵:
?幫助文檔,q返回/退出程序,b保存 response body,f輸入過濾條件,k上,j下,h左,l右,space翻頁,enter進入接口詳情,z清屏,e編輯,r重新請求
過濾請求,和上面的操作類似,只不過接下來的操作,是按鍵 f 開始,輸入 f 之后你會看見如下位置會有相對應的顯示:
接下來,我們就可以過濾請求了,這個地方我們來篩選請求結果不是 200 的(也就是得到請求不是 200 的結果),我們需要添加的命令為:!(~c 200) 也就是如下命令:
詳細的呢,我們來下面來講:
Many commands in the mitmproxy tool make use of filter expressions. Filter expressions consist of the following operators:
mitmproxy 工具中的許多命令都使用了過濾表達式。過濾器表達式由以下操作符組成:
注意: 這里把英文寫出來不是為了炫技,而是希望看見這篇的小伙伴也順便學習一下英文,英文真的很重要!
~aMatch asset in response: CSS, Javascript, Flash, images.匹配響應中的:CSS、JavaScript、Flash、Images。
~b regexBody使用正則表達式,匹配響應體 Body
~bq regexRequest body請求體~bs regexResponse body響應體
~c intHTTP response code匹配 HTTP 狀態碼~d regexDomain域名(可以理解成 url,但不準確)
~dst regexMatch destination address匹配目的地址
~eMatch error匹配錯誤
~h regexHeader匹配頭部
~hq regexRequest header匹配請求頭
~hs regexResponse header匹配響應頭
~httpMatch HTTP flows匹配 HTTP 流
~m regexMethod匹配模式(方法)
~markedMatch marked flows匹配標記流
~qMatch request with no response匹配請求無響應
~sMatch response匹配響應
~src regexMatch source address匹配源地址
~t regexContent-type header內容類型的頭
~tcpMatch TCP flows與 TCP 流
~tq regexRequest Content-Type header請求的 content - type 頭
~ts regexResponse Content-Type header響應的 content - type 頭
~u regexURLURL
~websocketMatch WebSocket flows匹配 WebSocket 流量
!unary not not
&and and
|or or
(...)grouping 分組
Fiddler、Charles 也有這個功能,而且它們的圖形界面操作更加方便。那么 mitmproxy 的優勢何在?mitmproxy 的強大之處體現在它的另一個工具 mitmdump,有了它我們可以直接對接 Python 對請求進行處理。代碼可以關注本賬號私信獲取哦!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。