在b站做計網實驗 - 抓包/get/post


前言

這篇博文是一個小實驗,用python發送get/post請求,其中用到cookie登錄bilibili網站並修改個人信息。

 

抓包

對HTTP應用而言,用瀏覽器自帶的插件可以很方便做到抓包,比如chrome F12快捷鍵,network,preserve log。

Http協議請求/響應報文,以及各個字段,都能很直觀地觀察到。

 

模擬瀏覽器Get 請求

Tcp的通信,事實上是一個進程與另一個進程通過網絡進行的通信。服務器接收到網絡傳來的信息后,很難判斷對方進程是來自終端腳本,還是瀏覽器。

python的urllib2庫可以很輕松地模擬一個get/post請求的發送。

#coding=utf-8
import json
import urllib2,urllib


def web_get():
    req = urllib2.Request('http://www.bilibili.com')
    html = urllib2.urlopen(req)
    fileHandle = open('main.html', 'w')
    fileHandle.write(html.read())
    fileHandle.close()

if __name__ == '__main__':
    web_get()

 

上述代碼主要用到以下函數urllib2的函數:

 

urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]]) 

 

向http://www.bilibili.com發送請求,然后把內容寫到main.html, 文件打開是這樣的:

<!DOCTYPE html><html lang=zh-Hans><head><meta charset=utf-8><title>嗶哩嗶哩 (゜-゜)つロ 干杯~-bilibili</title><meta name=description content=bilibili是國內知名的視頻彈幕網站,這里有最及時的動漫新番,最棒的ACG氛圍,最有創意的Up主。大家可以在這里找到許多歡樂。><meta name=keywords content=B站,彈幕,字幕,AMV,MAD,MTV,ANIME,動漫,動漫音樂,游戲,游戲解說,ACG,galgame,動畫,番組,新番,初音,洛天依,vocaloid><meta name=renderer content=webkit><meta http-equiv=X-UA-Compatible content="IE=edge"><link rel=dns-prefetch href=//s1.hdslb.com><link rel=dns-prefetch href=//i0.hdslb.com><link rel=dns-prefetch href=//i1.hdslb.com><link rel=dns-prefetch href=//i2.hdslb.com><link rel=dns-prefetch href=//static.hdslb.com><link rel="shortcut icon" href=//static.hdslb.com/images/favicon.ico><link rel=search type=application/opensearchdescription+xml href=//static.hdslb.com/opensearch.xml title=嗶哩嗶哩><link href=//s1.hdslb.com/bfs/static/phoenix/home/static/css/main.4299bdb2455910aaf27f1d0f3ab3fc5c.css rel=stylesheet></head><body><div class="z-top-container has-banner"></div><div id=home-app><app></app></div><div class="footer bili-footer"></div><script type=text/javascript>if(!+"\v1"){
        document.body.innerHTML = "<div style='background: #00a1d6; text-align: center; padding: 10px 0; color: #fff;'>為了保護你的賬號安全,bilibili已不支持IE8及以下版本瀏覽器訪問,建議你升級到IE最新版本瀏覽器,或使用Chrome等其他瀏覽器。</div>"
      }</script><script type=text/javascript src=//static.hdslb.com/js/jquery.min.js></script><script type=text/javascript src=//static.hdslb.com/common/js/nav.js></script><script type=text/javascript src=//static.hdslb.com/common/js/footer.js></script><script type=text/javascript src=//s1.hdslb.com/bfs/cm/st/bundle.js></script><script type=text/javascript>$(function(){
        //日志上報
        window.config = { sample : 1, errorTracker : false , resourceTracker: false , scrollTracker: true,   msgObjects : ''}
        var jq = document.createElement('script');
        jq.src = "//s1.hdslb.com/bfs/static/log/report/reporter.js";
        document.getElementsByTagName('body')[0].appendChild(jq);
      })</script><!-- built files will be auto injected --><script type=text/javascript src=//s1.hdslb.com/bfs/static/phoenix/home/static/js/main.93ebc77ff35d09ded440.js></script></body></html>

 

從中可以看出,b站的主頁首先發來一個短的html, 里面有一段小的提醒文字和一段js腳本。如果js腳本判斷到瀏覽器版本過低,影響排版,就不會繼續加載后面的內容,而一開始的提醒文字被留下。一個簡潔高效的提醒,對吧?

 

模擬瀏覽器Post 請求

 

要模擬瀏覽器對一個網站發出post請求,步驟如下:

1. 獲取接收表單的URL,在這個例子里,是https://account.bilibili.com/site/UpdateSetting。一般來說,這個得到對應的頁面提交一次,然后用開發者工具找到這個請求的目標地址。

2. 實現登錄,獲取cookie。在這個例子里面,因為B站本身有驗證碼,只好比較挫地手動登錄之后,抓包拿到自己的cookie填進去。

3. 按照表單要求填寫data,注意服務器會檢查,所以每一個字段最好都按照抓包回來的樣式填好。

4. 填寫其他頭部的字段,同樣是抄之前抓到的包,模擬自己是瀏覽器。

 

#coding=utf-8
import json
import urllib2,urllib

def changeinfo(cookie):
    posturl = "https://account.bilibili.com/site/UpdateSetting"
    data = {'birthday':'2001-01-02','city':'0','datingtype':'0','marital':'0','province':'0','sex':'','sign':'this is anthor test sign', 'uname':'Ckins'}
    req = urllib2.Request(posturl)
    req.add_header('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8')
    req.add_header('X-Requested-With','XMLHttpRequest')
    req.add_header('User-Agent','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36')
    req.add_header('Cookie',cookie)
    req.add_header('Referer', 'https://account.bilibili.com/site/setting')
    data = urllib.urlencode(data)
    response = urllib2.urlopen(req,data)
    jsonText = response.read()
    text = json.loads(jsonText)
    print text
    if text['status'] == True:
        print 'change success'
    else:
        print 'change failed'
    exit()

if __name__ == '__main__':
    #config of username and password
    cookies = ''
    changeinfo(cookies)

上述代碼主要還是用到以下函數urllib2的函數:

urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]]) 

當有data傳入的時候,該函數的請求會由Get 改為 Post。

 

進一步的實驗:

1. 對一些簡單網站模擬用戶操作(搶課腳本,搶票腳本)。

2. 入門Python爬蟲。

 

一些思考

1. 用戶在瀏覽器上的行為非常容易模擬。從開發者的角度,后端拿到的表單一定要再次核對,檢查是否合法。

2. cookie的泄露很有可能會使用戶的身份被盜用,保護cookie的機制值得去學習。

3. 一年前學計網的時候,理論課教材是《計算機網絡自頂向下方法》,實驗課是wireshark,還有思科的交換機。考了不錯的分數,但一年不怎么用,現在像全還給老師一樣。如果當時就能這樣動手實踐,感覺遺忘曲線會長久許多。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM