• 在b站做计网实验


    前言

    这篇博文是一个小实验,用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,还有思科的交换机。考了不错的分数,但一年不怎么用,现在像全还给老师一样。如果当时就能这样动手实践,感觉遗忘曲线会长久许多。

  • 相关阅读:
    位记录——Windows 7已安装Sublime Text 3、cynwin、SublimeClang
    尺度空间(Scale space)理论
    D3DXMatrixMultiply 函数
    素数推断算法(高效率)
    去除win7 64位系统桌面图标小箭头
    Bag标签之中的一个行代码实行中文分词实例1
    7个最好的免费杀毒软件下载
    利用Excel批量高速发送电子邮件
    Hibernate Criterion
    IOS新手教程(二)-控制流
  • 原文地址:https://www.cnblogs.com/kinsang/p/7020033.html
Copyright © 2020-2023  润新知