在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':'','datingtype':'','marital':'','province':'','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,还有思科的交换机。考了不错的分数,但一年不怎么用,现在像全还给老师一样。如果当时就能这样动手实践,感觉遗忘曲线会长久许多。
在b站做计网实验 - 抓包/get/post的更多相关文章
- jmeter旅程第一站:Jmeter抓包浏览器或者抓取手机app的包
学习jmeter?从实际出发,我也是一个初学者,会优先考虑先用来做一些简单的抓包.接口测试,在实践的过程中学习jmeter用途.那么接下来,这篇文章我会以jmeter抓包开启我的jmeter旅程. 这 ...
- Android利用Fiddler进行网络数据抓包,手机抓包工具汇总
Fiddler抓包工具 Fiddler抓包工具很好用的,它可以干嘛用呢,举个简单例子,当你浏览网页时,网页中有段视频非常好,但网站又不提供下载,用迅雷下载你又找不到下载地址,这个时候,Fiddler抓 ...
- Android利用Fiddler进行网络数据抓包,手机抓包工具汇总,使用mono运行filddler
Fiddler抓包工具 Fiddler抓包工具很好用的,它可以干嘛用呢,举个简单例子,当你浏览网页时,网页中有段视频非常好,但网站又不提供下载,用迅雷下载你又找不到下载地址,这个时候,Fiddler抓 ...
- https 真的安全吗,可以抓包吗,如何防止抓包吗
Android_interview github 地址 大家好,我是程序员徐公,加上实习,有五年中大厂经验.自荐一下,可以关注我的微信公众号程序员徐公 公众号程序员徐公回复黑马,获取 Android ...
- Fiddler抓包工具-全网最全教程,没有之一
初识Fiddler fiddler,译为骗子 是位于客户端.服务器端的HTTP代理,是Web调试的利器. 是c#编写的程序 Fiddler主要功能: 监控http.https流量 查看.分析请求内容细 ...
- Android 联网监控抓包工具的制作(tcpdump的使用)
最近做一个Android联网抓包的工具 自己在网上搜索了好久 发现还是没有头绪 于是考虑在linux层上下功夫 于是采用linux的tcpdump来实现了抓包的功能 用简单的话来定义tcpdump,就 ...
- 随身Wifi+win7 搭建http代理 域名劫持 抓包 内容篡改实验环境
需求来源: 1.平板或手机是个封闭系统无法给wifi设置代理 2.需要利用filllder进行抓包,内容篡改等实验 拥有硬件资源:PC机器 + 小米随身wifi 方案1: NtBind Dns + N ...
- 【计网】图解HTTP常见知识点总结
目录 目录 目录 初识TCP/IP TCP/IP协议族4层模型 初识HTTP 请求和响应 HTTP报文 HTTP状态码 HTTP报文首部 其他的首部字段 确保WEB安全的HTTPS HTTPS工作原理 ...
- C站投稿189网盘视频源(UP主篇)
C站投稿189网盘视频源(UP主篇) 现在C站(吐槽弹幕网)的视频来源基本靠的都是189网盘,比如番剧区的每个视频基本来源于此,不像AB两站,拥有自己的资源服务器,为啥呢?没钱啊.都是外来的视频.本站 ...
随机推荐
- 近期测试BUG总结
前些日子上线了新版的app,在上线后发现了几个重大的bug,在此总结,在以后的测试工作中需要额外的关注. 需求流程bug 页面刷新bug 标签栏刷新bug 第一个bug出现的原因是产品需求与运营实际操 ...
- java连接oracle的几种方式
jdbc连接(驱动包ojdbc6.jar)String driver = "oracle.jdbc.OracleDriver"; //驱动标识符 String url = &quo ...
- BZOJ 1617 [Usaco2008 Mar]River Crossing渡河问题:dp
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1617 题意: Farmer John以及他的N(1 <= N <= 2,500 ...
- v-for指令用法二
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- Derived 派生类
#include "stdafx.h"#include "iostream" using namespace std; class Base1{public: ...
- Java标准输入
Java: import java.util.*; public class Main{ public static void main(String args[]){ Scanner cin = n ...
- BZOJ_1004_[HNOI2008]Cards_burnside+DP
BZOJ_1004_[HNOI2008]Cards_burnside+DP Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问 ...
- groovy语言和grails框架
Groovy 是一种动态语言,它在 JVM 上运行,并且与 Java 语言无缝集成. Groovy 可以大大减少 Java 代码的数量.在 Groovy 中,不再需要为字段编写 getter 和 se ...
- 利用openssl进行base64的编码与解码
openssl可以直接使用命令对文件件进行base64的编码与解码,利用openssl提供的API同样可以做到这一点. 废话不多说,直接上代码了.需要注意的是通过base64编码后的字符每64个字节都 ...
- OTL之Oracle开发总结《转》
OTL之Oracle开发总结---转 关 于OTL,网上介绍的也不少,但看来看去也只是官方的那些文档.OTL很好用,结合官方提供的一些例子,多多尝试才能领悟.经过一个月左右的项目开发,对 OTL也 ...