App爬蟲(chóng)神器mitmproxy和mitmdump的使用

摘要:?mitmproxy是一個(gè)支持HTTP和HTTPS的抓包程序,有類(lèi)似Fiddler蚪缀、Charles的功能砰蠢,只不過(guò)它是一個(gè)控制臺(tái)的形式操作磅网。 mitmproxy還有兩個(gè)關(guān)聯(lián)組件。一個(gè)是mitmdump竹捉,它是mitmproxy的命令行接口芜辕,利用它我們可以對(duì)接Python腳本,用Python實(shí)現(xiàn)監(jiān)聽(tīng)后的處理块差。

mitmproxy是一個(gè)支持HTTP和HTTPS的抓包程序侵续,有類(lèi)似Fiddler、Charles的功能憨闰,只不過(guò)它是一個(gè)控制臺(tái)的形式操作状蜗。

mitmproxy還有兩個(gè)關(guān)聯(lián)組件。一個(gè)是mitmdump鹉动,它是mitmproxy的命令行接口轧坎,利用它我們可以對(duì)接Python腳本,用Python實(shí)現(xiàn)監(jiān)聽(tīng)后的處理训裆。另一個(gè)是mitmweb眶根,它是一個(gè)Web程序,通過(guò)它我們可以清楚觀(guān)察mitmproxy捕獲的請(qǐng)求边琉。

下面我們來(lái)了解它們的用法。

一记劝、準(zhǔn)備工作

請(qǐng)確保已經(jīng)正確安裝好了mitmproxy变姨,并且手機(jī)和PC處于同一個(gè)局域網(wǎng)下,同時(shí)配置好了mitmproxy的CA證書(shū)厌丑。

二定欧、mitmproxy的功能

?mitmproxy有如下幾項(xiàng)功能。

1? 攔截HTTP和HTTPS請(qǐng)求和響應(yīng)怒竿。

2? 保存HTTP會(huì)話(huà)并進(jìn)行分析砍鸠。

3? 模擬客戶(hù)端發(fā)起請(qǐng)求,模擬服務(wù)端返回響應(yīng)耕驰。

4? 利用反向代理將流量轉(zhuǎn)發(fā)給指定的服務(wù)器爷辱。

5? 支持Mac和Linux上的透明代理。

6? 利用Python對(duì)HTTP請(qǐng)求和響應(yīng)進(jìn)行實(shí)時(shí)處理朦肘。

三饭弓、抓包原理

和Charles一樣,mitmproxy運(yùn)行于自己的PC上媒抠,mitmproxy會(huì)在PC的8080端口運(yùn)行弟断,然后開(kāi)啟一個(gè)代理服務(wù),這個(gè)服務(wù)實(shí)際上是一個(gè)HTTP/HTTPS的代理趴生。

手機(jī)和PC在同一個(gè)局域網(wǎng)內(nèi)阀趴,設(shè)置代理為mitmproxy的代理地址昏翰,這樣手機(jī)在訪(fǎng)問(wèn)互聯(lián)網(wǎng)的時(shí)候流量數(shù)據(jù)包就會(huì)流經(jīng)mitmproxy,mitmproxy再去轉(zhuǎn)發(fā)這些數(shù)據(jù)包到真實(shí)的服務(wù)器刘急,服務(wù)器返回?cái)?shù)據(jù)包時(shí)再由mitmproxy轉(zhuǎn)發(fā)回手機(jī)矩父,這樣mitmproxy就相當(dāng)于起了中間人的作用,抓取到所有Request和Response排霉,另外這個(gè)過(guò)程還可以對(duì)接mitmdump窍株,抓取到的Request和Response的具體內(nèi)容都可以直接用Python來(lái)處理,比如得到Response之后我們可以直接進(jìn)行解析攻柠,然后存入數(shù)據(jù)庫(kù)球订,這樣就完成了數(shù)據(jù)的解析和存儲(chǔ)過(guò)程。

四瑰钮、設(shè)置代理

首先冒滩,我們需要運(yùn)行mitmproxy,命令如下所示:

啟動(dòng)mitmproxy的命令如下:

mitmproxy

之后會(huì)在8080端口上運(yùn)行一個(gè)代理服務(wù)浪谴,如下圖所示开睡。

右下角會(huì)出現(xiàn)當(dāng)前正在監(jiān)聽(tīng)的端口。

或者啟動(dòng)mitmdump苟耻,它也會(huì)監(jiān)聽(tīng)8080端口篇恒,命令如下所示:

mitmdump

運(yùn)行結(jié)果如下圖所示。

將手機(jī)和PC連接在同一局域網(wǎng)下凶杖,設(shè)置代理為當(dāng)前代理胁艰。首先看看PC的當(dāng)前局域網(wǎng)IP。

Windows上的命令如下所示:

ipconfig

Linux和Mac上的命令如下所示:

ifconfig

輸出結(jié)果如下圖所示智蝠。

一般類(lèi)似10.*.*.*或172.16.*.*或192.168.1.*這樣的IP就是當(dāng)前PC的局域網(wǎng)IP腾么,例如此圖中PC的IP為192.168.1.28,手機(jī)代理設(shè)置類(lèi)似如下圖所示杈湾。

這樣我們就配置好了mitmproxy的的代理解虱。

五、mitmproxy的使用

確保mitmproxy正常運(yùn)行漆撞,并且手機(jī)和PC處于同一個(gè)局域網(wǎng)內(nèi)殴泰,設(shè)置了mitmproxy的代理,具體的配置方法可以參考官方文檔叫挟。

運(yùn)行mitmproxy艰匙,命令如下所示:

mitmproxy

設(shè)置成功之后,我們只需要在手機(jī)瀏覽器上訪(fǎng)問(wèn)任意的網(wǎng)頁(yè)或?yàn)g覽任意的App即可抹恳。例如在手機(jī)上打開(kāi)百度员凝,mitmproxy頁(yè)面便會(huì)呈現(xiàn)出手機(jī)上的所有請(qǐng)求,如下圖所示奋献。

這就相當(dāng)于之前我們?cè)跒g覽器開(kāi)發(fā)者工具監(jiān)聽(tīng)到的瀏覽器請(qǐng)求健霹,在這里我們借助于mitmproxy完成旺上。Charles完全也可以做到。

這里是剛才手機(jī)打開(kāi)百度頁(yè)面時(shí)的所有請(qǐng)求列表糖埋,左下角顯示的2/38代表一共發(fā)生了38個(gè)請(qǐng)求宣吱,當(dāng)前箭頭所指的是第二個(gè)請(qǐng)求。

每個(gè)請(qǐng)求開(kāi)頭都有一個(gè)GET或POST瞳别,這是各個(gè)請(qǐng)求的請(qǐng)求方式征候。緊接的是請(qǐng)求的URL。第二行開(kāi)頭的數(shù)字就是請(qǐng)求對(duì)應(yīng)的響應(yīng)狀態(tài)碼祟敛,后面是響應(yīng)內(nèi)容的類(lèi)型疤坝,如text/html代表網(wǎng)頁(yè)文檔、image/gif代表圖片馆铁。再往后是響應(yīng)體的大小和響應(yīng)的時(shí)間跑揉。

當(dāng)前呈現(xiàn)了所有請(qǐng)求和響應(yīng)的概覽,我們可以通過(guò)這個(gè)頁(yè)面觀(guān)察到所有的請(qǐng)求埠巨。

如果想查看某個(gè)請(qǐng)求的詳情历谍,我們可以敲擊回車(chē),進(jìn)入請(qǐng)求的詳情頁(yè)面辣垒,如下圖所示望侈。

可以看到Headers的詳細(xì)信息,如Host乍构、Cookies甜无、User-Agent等。

最上方是一個(gè)Request哥遮、Response、Detail的列表陵究,當(dāng)前處在Request這個(gè)選項(xiàng)上眠饮。這時(shí)我們?cè)冱c(diǎn)擊TAB鍵,即可查看這個(gè)請(qǐng)求對(duì)應(yīng)的響應(yīng)詳情铜邮,如下圖所示仪召。

最上面是響應(yīng)頭的信息,下拉之后我們可以看到響應(yīng)體的信息松蒜。針對(duì)當(dāng)前請(qǐng)求扔茅,響應(yīng)體就是網(wǎng)頁(yè)的源代碼。

這時(shí)再敲擊TAB鍵秸苗,切換到最后一個(gè)選項(xiàng)卡Detail召娜,即可看到當(dāng)前請(qǐng)求的詳細(xì)信息,如服務(wù)器的IP和端口惊楼、HTTP協(xié)議版本玖瘸、客戶(hù)端的IP和端口等秸讹,如下圖所示。

mitmproxy還提供了命令行式的編輯功能雅倒,我們可以在此頁(yè)面中重新編輯請(qǐng)求璃诀。敲擊e鍵即可進(jìn)入編輯功能,這時(shí)它會(huì)詢(xún)問(wèn)你要編輯哪部分內(nèi)容蔑匣,如Cookies劣欢、Query、URL等裁良,每個(gè)選項(xiàng)的第一個(gè)字母會(huì)高亮顯示凿将。敲擊要編輯內(nèi)容名稱(chēng)的首字母即可進(jìn)入該內(nèi)容的編輯頁(yè)面,如敲擊m即可編輯請(qǐng)求的方式趴久,敲擊q即可修改GET請(qǐng)求參數(shù)Query丸相。

這時(shí)我們敲擊q,進(jìn)入到編輯Query的頁(yè)面彼棍。由于沒(méi)有任何參數(shù)灭忠,我們可以敲擊a來(lái)增加一行,然后就可以輸入?yún)?shù)對(duì)應(yīng)的Key和Value座硕,如下圖所示弛作。

這里我們輸入Key為wd,Value為NBA华匾。

然后再敲擊esc鍵和q鍵映琳,返回之前的頁(yè)面,再敲擊e和p鍵修改Path蜘拉。和上面一樣萨西,敲擊a增加Path的內(nèi)容,這時(shí)我們將Path修改為s旭旭,如下圖所示谎脯。

再敲擊esc和q鍵返回,這時(shí)我們可以看到最上面的請(qǐng)求鏈接變成了:https://www.baidu.com/s?wd=NBA持寄。訪(fǎng)問(wèn)這個(gè)頁(yè)面源梭,可以看到百度搜索NBA關(guān)鍵詞的搜索結(jié)果,如下圖所示稍味。

敲擊a保存修改废麻,敲擊r重新發(fā)起修改后的請(qǐng)求,即可看到上方請(qǐng)求方式前面多了一個(gè)回旋箭頭模庐,這說(shuō)明重新執(zhí)行了修改后的請(qǐng)求烛愧。這時(shí)我們?cè)儆^(guān)察響應(yīng)體內(nèi)容,即可看到搜索NBA的頁(yè)面結(jié)果的源代碼,如下圖所示屑彻。

以上內(nèi)容便是mitmproxy的簡(jiǎn)單用法验庙。利用mitmproxy,我們可以觀(guān)察到手機(jī)上的所有請(qǐng)求社牲,還可以對(duì)請(qǐng)求進(jìn)行修改并重新發(fā)起粪薛。

Fiddler、Charles也有這個(gè)功能搏恤,而且它們的圖形界面操作更加方便违寿。那么mitmproxy的優(yōu)勢(shì)何在?

mitmproxy的強(qiáng)大之處體現(xiàn)在它的另一個(gè)工具mitmdump熟空,有了它我們可以直接對(duì)接Python對(duì)請(qǐng)求進(jìn)行處理藤巢。下面我們來(lái)看看mitmdump的用法。

六息罗、mitmdump的使用

mitmdump是mitmproxy的命令行接口掂咒,同時(shí)還可以對(duì)接Python對(duì)請(qǐng)求進(jìn)行處理,這是相比Fiddler迈喉、Charles等工具更加方便的地方绍刮。有了它我們可以不用手動(dòng)截獲和分析HTTP請(qǐng)求和響應(yīng),只需寫(xiě)好請(qǐng)求和響應(yīng)的處理邏輯即可挨摸。它還可以實(shí)現(xiàn)數(shù)據(jù)的解析孩革、存儲(chǔ)等工作,這些過(guò)程都可以通過(guò)Python實(shí)現(xiàn)得运。

1. 實(shí)例引入

我們可以使用命令啟動(dòng)mitmproxy膝蜈,并把截獲的數(shù)據(jù)保存到文件中,命令如下所示:

mitmdump? -w? outfile

其中outfile的名稱(chēng)任意熔掺,截獲的數(shù)據(jù)都會(huì)被保存到此文件中饱搏。

還可以指定一個(gè)腳本來(lái)處理截獲的數(shù)據(jù),使用-s參數(shù)即可:

mitmdump? -s? ?script.py

這里指定了當(dāng)前處理腳本為script.py置逻,它需要放置在當(dāng)前命令執(zhí)行的目錄下窍帝。

我們可以在腳本里寫(xiě)入如下的代碼:

def? ?request(flow):

?????flow.request.headers['User-Agent'] ='MitmProxy'

????print(flow.request.headers)

我們定義了一個(gè)request()方法,參數(shù)為flow诽偷,它其實(shí)是一個(gè)HTTPFlow對(duì)象,通過(guò)request屬性即可獲取到當(dāng)前請(qǐng)求對(duì)象疯坤。然后打印輸出了請(qǐng)求的請(qǐng)求頭报慕,將請(qǐng)求頭的User-Agent修改成了MitmProxy。

運(yùn)行之后我們?cè)谑謾C(jī)端訪(fǎng)問(wèn)http://httpbin.org/get压怠,可以看到如下情況發(fā)生眠冈。

手機(jī)端的頁(yè)面顯示如下圖所示。

PC端控制臺(tái)輸出如下圖所示。

手機(jī)端返回結(jié)果的Headers實(shí)際上就是請(qǐng)求的Headers蜗顽,User-Agent被修改成了mitmproxy布卡。PC端控制臺(tái)輸出了修改后的Headers內(nèi)容,其User-Agent的內(nèi)容正是mitmproxy雇盖。

所以忿等,通過(guò)這三行代碼我們就可以完成對(duì)請(qǐng)求的改寫(xiě)。print()方法輸出結(jié)果可以呈現(xiàn)在PC端控制臺(tái)上崔挖,可以方便地進(jìn)行調(diào)試贸街。

2. 日志輸出

mitmdump提供了專(zhuān)門(mén)的日志輸出功能,可以設(shè)定不同級(jí)別以不同顏色輸出結(jié)果狸相。我們把腳本修改成如下內(nèi)容:

from? mitmproxy? import? ctx

def? request(flow):?

????flow.request.headers['User-Agent'] ='MitmProxy'

????ctx.log.info(str(flow.request.headers))

????ctx.log.warn(str(flow.request.headers))

????ctx.log.error(str(flow.request.headers))

這里調(diào)用了ctx模塊薛匪,它有一個(gè)log功能,調(diào)用不同的輸出方法就可以輸出不同顏色的結(jié)果脓鹃,以方便我們做調(diào)試逸尖。例如,info()方法輸出的內(nèi)容是白色的瘸右,warn()方法輸出的內(nèi)容是黃色的娇跟,error()方法輸出的內(nèi)容是紅色的。運(yùn)行結(jié)果如下圖所示尊浓。

不同的顏色對(duì)應(yīng)不同級(jí)別的輸出逞频,我們可以將不同的結(jié)果合理劃分級(jí)別輸出,以更直觀(guān)方便地查看調(diào)試信息栋齿。

3. Request

最開(kāi)始我們實(shí)現(xiàn)了request()方法并且對(duì)Headers進(jìn)行了修改苗胀。下面我們來(lái)看看Request還有哪些常用的功能。我們先用一個(gè)實(shí)例來(lái)感受一下瓦堵。

我們修改腳本基协,然后在手機(jī)上打開(kāi)百度,即可看到PC端控制臺(tái)輸出了一系列的請(qǐng)求菇用,在這里我們找到第一個(gè)請(qǐng)求澜驮。控制臺(tái)打印輸出了Request的一些常見(jiàn)屬性惋鸥,如URL杂穷、Headers、Cookies卦绣、Host耐量、Method、Scheme等滤港。輸出結(jié)果如下圖所示廊蜒。

結(jié)果中分別輸出了請(qǐng)求鏈接、請(qǐng)求頭、請(qǐng)求Cookies山叮、請(qǐng)求Host著榴、請(qǐng)求方法、請(qǐng)求端口屁倔、請(qǐng)求協(xié)議這些內(nèi)容脑又。

同時(shí)我們還可以對(duì)任意屬性進(jìn)行修改,就像最初修改Headers一樣汰现,直接賦值即可挂谍。例如,這里將請(qǐng)求的URL修改一下瞎饲,腳本修改如下所示:

def? request(flow):

?????url ='https://httpbin.org/get'

? ? ? ?flow.request.url=url

手機(jī)端得到如下結(jié)果口叙,如下圖所示。

比較有意思的是嗅战,瀏覽器最上方還是呈現(xiàn)百度的URL妄田,但是頁(yè)面已經(jīng)變成了httpbin.org的頁(yè)面了。另外驮捍,Cookies明顯還是百度的Cookies疟呐。我們只是用簡(jiǎn)單的腳本就成功把請(qǐng)求修改為其他的站點(diǎn)。通過(guò)這種方式修改和偽造請(qǐng)求就變得輕而易舉东且。

通過(guò)這個(gè)實(shí)例我們知道启具,有時(shí)候URL雖然是正確的,但是內(nèi)容并非是正確的珊泳。我們需要進(jìn)一步提高自己的安全防范意識(shí)鲁冯。

Request還有很多屬性,在此不再一一列舉色查。更多屬性可以參考:http://docs.mitmproxy.org/en/latest/scripting/api.html薯演。

只要我們了解了基本用法,會(huì)很容易地獲取和修改Reqeust的任意內(nèi)容秧了,比如可以用修改Cookies跨扮、添加代理等方式來(lái)規(guī)避反爬。

4. Response

對(duì)于爬蟲(chóng)來(lái)說(shuō)验毡,我們更加關(guān)心的其實(shí)是Response的內(nèi)容衡创,因?yàn)镽esponse Body才是爬取的結(jié)果。對(duì)于Response來(lái)說(shuō)晶通,mitmdump也提供了對(duì)應(yīng)的處理接口钧汹,就是response()方法。下面我們用一個(gè)實(shí)例感受一下录择。

from mitmproxy import ctx

def response(flow):?

????response =flow.response?

????info=ctx.log.info

????info(str(response.status_code))

????info(str(response.headers))

????info(str(response.cookies))

????info(str(response.text))

將腳本修改為如上內(nèi)容,然后手機(jī)訪(fǎng)問(wèn):http://httpbin.org/get。

這里打印輸出了Response的status_code隘竭、headers塘秦、cookies、text這幾個(gè)屬性动看,其中最主要的text屬性就是網(wǎng)頁(yè)的源代碼尊剔。

PC端控制臺(tái)輸出如下圖所示。

控制臺(tái)輸出了Response的狀態(tài)碼菱皆、響應(yīng)頭须误、Cookies、響應(yīng)體這幾部分內(nèi)容仇轻。

我們可以通過(guò)response()方法獲取每個(gè)請(qǐng)求的響應(yīng)內(nèi)容京痢。接下來(lái)再進(jìn)行響應(yīng)的信息提取和存儲(chǔ),我們就可以成功完成爬取了篷店。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末祭椰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子疲陕,更是在濱河造成了極大的恐慌方淤,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹄殃,死亡現(xiàn)場(chǎng)離奇詭異携茂,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)诅岩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)讳苦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人按厘,你說(shuō)我怎么就攤上這事医吊。” “怎么了逮京?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵卿堂,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我懒棉,道長(zhǎng)草描,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任策严,我火速辦了婚禮穗慕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘妻导。我一直安慰自己逛绵,他們只是感情好怀各,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著术浪,像睡著了一般瓢对。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胰苏,一...
    開(kāi)封第一講書(shū)人閱讀 51,231評(píng)論 1 299
  • 那天硕蛹,我揣著相機(jī)與錄音,去河邊找鬼硕并。 笑死法焰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的倔毙。 我是一名探鬼主播埃仪,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼普监!你這毒婦竟也來(lái)了贵试?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凯正,失蹤者是張志新(化名)和其女友劉穎毙玻,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體廊散,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桑滩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了允睹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片运准。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖缭受,靈堂內(nèi)的尸體忽然破棺而出胁澳,到底是詐尸還是另有隱情,我是刑警寧澤米者,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布韭畸,位于F島的核電站,受9級(jí)特大地震影響蔓搞,放射性物質(zhì)發(fā)生泄漏胰丁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一喂分、第九天 我趴在偏房一處隱蔽的房頂上張望锦庸。 院中可真熱鬧,春花似錦蒲祈、人聲如沸甘萧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)幔嗦。三九已至酿愧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邀泉,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工钝鸽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汇恤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓拔恰,卻偏偏與公主長(zhǎng)得像因谎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子颜懊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容