Python爬取應用「英語流利說」的配音視訊資料(第一次這麼粉一個人)

尼古拉斯_趙四發表於2018-03-05

一、故事起源

程式猿有時候很痛苦,遇到問題解決不了就睡不著,也找不到人傾訴,只能通過失眠來解脫,那天長夜漫漫,我卻無心睡眠,就拿起手機繼續刷朋友圈,發現了睡前故事這個資訊:


就手賤點進去一看,媽呀頓時酥了,只能用無限迴圈表達我的心情。其實這部動畫我沒看過,不知道原始的配音是什麼樣的,但是就這個配音真的太讚了,英語太好聽了,其實吧我是非常崇拜英語口語流利的人!好了就這樣在無限迴圈下呼呼的進入睡眠了,第二天醒來我在想這東西我得珍藏呀,有的人說直接收藏連結在微信中唄?其實這種方式不靠譜,因為假如有一天這個配音app倒閉了資料丟失,或者作者把作品刪除了,我該怎麼辦?所以就直接把視訊弄下來儲存本地珍藏才是正解。


二、資料協議分析

好了前面的故事說完了,下面進入正題吧,本文的重點是如何把這個app中某個作者的配音作品都爬取到本地,首先我們知道這個app叫做「英語流利說」不多說了,直接下載安裝,然後通過搜尋中找到我粉的這個作者,然後進入他的專輯:


然後發現有很多作品呀,所以就點進去檢視:


然後點選配音作品檢視詳細資訊:


不過在我的意料之中,這個視訊是不支援下載的,因為這個app關心版權問題。那麼問題就是我們怎麼爬取這個視訊儲存到本地呢?這個其實以前我寫過一篇文章:Python爬取今日頭條視訊;大家都知道突破口就是抓包。不多說了直接連線Fiddler進行抓包,可惜的是遇到這個錯誤:


說來巧了,我之前做應用因為我們伺服器用了自己家的證照所以我在除錯程式就出現這個問題,連提示資訊都一樣,所以看到這問題我很敏感直接斷定這個app的伺服器用了自家的證照,所以我們連線Fiddler抓包就提示錯誤,這裡的原因大致是這樣的:Fiddler抓包https的時候我們都知道需要安裝Fiddler自己的證照,這個證照肯定沒有去認證過也就是Android手機系統中不認這個證照的。而這個app的伺服器肯定購買了認證的證照,Android手機系統中內建了一些根證照,就是為了驗證後續的證照。這個app的證照是被這些根證照認證過了。我們在使用系統預設的網路請求其實都是需要認證證照的,而有的app用到了https請求,但是我們還可以用Fiddler抓包成功,那是因為這些app的伺服器肯定沒有購買證照,所以客戶端就新增程式碼信任所有的證照,所以這麼看https的安全性就沒有任何意義了。那麼有的同學好奇為什麼這些app要這麼幹呢?因為我曾經在一家公司做東西的時候就遇到這樣的問題,就是從購買證照到伺服器部署成功這個過程有很多艱難過程的。有的公司開始沒有用https,最後遷移用到https,整個過程很費勁的。所以很多公司沒辦法就先曲線救國讓客戶端先信任所有的證照。


上面說了關於為什麼我們連線Fiddler,也安裝了Fiddler證照還是沒有抓取到這個app的資料:


所以大家以後要是遇到這類問題一定要第一想到這個原因,一看443埠就是https,你安裝證照了卻還抓不到包那麼很有可能就是證照問題,既然現在知道問題了,我們該怎麼解決這類問題呢?其實這個問題解決方案有兩個:

第一、使用Xposed攔截系統的證照校驗功能,這個網上有大神給出了hook模組程式碼,可以去github上搜JustTrustMe專案程式碼即可,就一個簡單類,匯入Xposed中自己編譯即可。

第二、反編譯app,找到網路請求模組,因為系統預設是校驗證照的,所以我們需要修改smali讓其信任所有證照,一般通過連線或者全域性搜HttpClient等類資訊定位到地方,然後修改smali程式碼即可,信任所有證照的程式碼網上也有。

通過這兩種方式可以看到,第一種方式最簡單,第二種方式需要反編譯修改smali程式碼還是有點麻煩,但是第一種操作的前置條件很多,第二種修改之後可以給很多人用。不過本文肯定用第一種,原因很簡單因為我們的目的是能夠成功抓包看資料,而不是二次打包使用。所以不解釋直接下載JustTrustMe模組程式碼編譯:


程式碼這裡就不分析了,就是hook系統的關鍵類修改值即可:


然後安裝模組執行即可,然後就可以愉快的抓包了,我們首先通過搜尋作者資訊:


發現請求引數中有一個query欄位就是攜帶搜尋作者名的值,搜尋有結果會返回作者資訊,其中id值最關鍵,是用於後面獲取作者的作品資訊:


這裡應用沒有把作者id作為引數傳遞上去,而是拼接到url中,請求成功之後可以發現所有的作品都有了,依然是作品中的id值關鍵,後續用於請求作品資訊:


這樣就可以看到視訊原始地址了,所以到這裡我們就分析完了,來總結一下流程吧:

第一步:我們通過搜尋介面:/api/v1/topics/search/allquery=xxxx... 獲取作者資訊,拿到id值。

第二步:用第一步獲取到的作者id通過介面:/api/v1/users/[作者id值]/video_works?pageSize=20...拼接url獲取作者所有作品資訊,儲存所有作品的id值。

第三步:用第二步的所有作品id值,通過介面:/api/v1/video_works/[作品id]?appVer=...拼接url獲取作品的詳細資訊,拿到視訊的原始地址。進行下載即可。

下面就可以用Python進行爬資料即可,需要注意的是這裡都是https請求,需要用urllib2庫以及設定信任所有證照,不然會報錯的,程式碼也是分三步進行:

第一步:通過搜尋作者名獲取作者的id值



第二步:用第一步獲取的作者id值,獲取作者的所有視訊id值資訊



第三步:通過第二步的所有作品id值,獲取對應每個視訊的原始地址資訊



第四步:解析出視訊原始地址,直接下載視訊即可



好了,程式碼很簡單的,下面直接執行python即可:


執行完了之後,可以檢視本地儲存視訊:


好了,就這樣我們成功的把作者的所有作品都爬到本地了,這下就可以珍藏了。只要以後失眠了就翻出來看看就好了。我不追星,這個作者是我第一次這麼粉的人,因為他的英語口語太好聽了。不得不讚,不過我還是要矜持,不能太花痴哈哈哈。


嚴重宣告

本文的意圖只有一個就是通過分析app抓包技術來滿足自己的心願,如果有人利用本文知識和技術進行非法操作進行牟利,帶來的任何法律責任都將由操作者本人承擔,和本文作者無任何關係,最終還是希望大家能夠秉著學習的心態閱讀此文。鑑於安全問題,樣本和Python原始碼都去編碼美麗小密圈自取!微信掃一下進入小密圈:



總結

本文主要因為我的一個目的去分析了一個app的資料請求然後用Python爬取資料儲存本地的過程,本文的重點在於一些app伺服器做了證照校驗工作,所以即使你安裝了Fiddler證照也是抓不到他的https請求,所以這時候我們需要安裝Xposed的JustTrustMe模組,攔截系統證照信任就可以愉快的抓取到資料包了。如果有感興趣的同學可以擴充套件把這個功能做到手機端也是可以的,藉助上面的三個介面,輸入作者名就獲取作品列表,然後可以播放和下載視訊。

《Android應用安全防護和逆向分析》

點選立即購買:京東  天貓 

更多內容:點選這裡

關注微信公眾號,最新技術乾貨實時推送

編碼美麗技術圈
微信掃一掃進入我的"技術圈"世界
掃一掃加小編微信
新增時請註明:“編碼美麗”非常感謝!

相關文章