Python_模拟登陆新浪微博
2016-03-26 14:22
579 查看
模拟网页登陆
1、下载http抓包软件Fiddler,打开后可以抓取到所有经过80端口的数据包2、打开登陆新浪微博的界面,可以在Fiddler中看到相关的信息,查了一晚上的资料得知,新浪微博登陆主要靠3个请求
1)
这个请求用于获得几个用于加密的参数
2)
这个请求将加密的用户名和密码发送出去
3)
这个请求就是用于登陆的
3、分析第一个请求
其中最后一个是时间戳
返回值中的servertime,pubkey nonce,rsakv是我们需要的值,用于下一步的加密
4、分析第二个请求
其中su,sp分别是加密过后的用户名和密码。
查看sina登陆的js代码 可以看到加密的过程。
用户名的加密方式是通过BASE64计算得到
username_ = urllib.quote(username) username = base64.encodestring(username)[:-1]
密码是通过rsa加密
先创建一个rsa公钥,公钥的两个参数分别是登录第一步中的pubkey和js加密文件中的‘10001’。这两个值需要先从16进制转换成10进制,不过也可以写死在代码里。这里就把10001直接写死为65537。代码如下:
rsaPublickey = int(pubkey, 16) key = rsa.PublicKey(rsaPublickey, 65537) message = str(servertime) + '\t' + str(nonce) + '\n' + str(password) passwd = rsa.encrypt(message, key) passwd = binascii.b2a_hex(passwd)
这样就得到了加密后的用户名和密码,接下来就可以向新浪发出请求了,需要发送的报文信息为
postPara = { 'entry': 'weibo', 'gateway': '1', 'from': '', 'savestate': '7', 'userticket': '1', 'ssosimplelogin': '1', 'vsnf': '1', 'vsnval': '', 'su': encodedUserName, 'service': 'miniblog', 'servertime': serverTime, 'nonce': nonce, 'pwencode': 'rsa2', 'sp': encodedPassWord, 'encoding': 'UTF-8', 'prelt': '115', 'rsakv' : rsakv, 'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack', 'returntype': 'META' }
post之后分析得到的数据可以看出是是否登陆成功
location.replace("http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=0&reason=%B5%C7%C2%BC%C3%FB%BB%F2%C3%DC%C2%EB%B4%ED%CE%F3");
如果reason为0的话说明登陆成功了,否则登陆失败,4049说明需要验证码,4041是加密错了。
使用Cookie登陆
查看浏览器的cookie记录找到微博的cookie值,复制后一起post发送即可登陆微博,但是这个cookie好像只有一天的有效期。发送一条微博
下面就是发送一条微博的python,通过发送cookie的方式发送的def update(msg): url = 'http://weibo.com/aj/mblog/add?ajwvr=6&__rnd='+str(int(time.time()*1000)) body = {'location':'v6_content_home', 'appkey':'', 'style_type':'1', 'pic_id':'', 'text':msg, 'pdetail':'', 'rank':'0', 'rankid':'', 'moudle':'stissue', 'pub_source':'main_', 'pub_type':'dialog', '_t':'0', } body = urllib.urlencode(body) request = urllib2.Request(url, body) refer = 'http://www.weibo.com/u/'+uid+'/home?wvr=5' request.add_header('Referer',refer) request.add_header('Cookie',COOKIE) response = urllib2.urlopen(request) print response.read()
上面就是登陆微博并发送一条微博的过程,由于只学了一下午的python就直接开始写了所以肯定有些的不对的地方,很多http协议也不懂什么意思,等放假之后再学习一下吧
相关文章推荐
- ubuntu下升级python
- Windows下IPython的配置安装
- Python在线笔试琐碎
- python 输出冒号;引号嵌套问题
- 中文Windows下用Python修改MAC地址
- 练习5:python的格式化字符
- 【资源汇集.转】Python 学习资源
- 17. Letter Combinations of a Phone Number
- python从零安装
- python--函数每天熟悉一个
- Python and or ?A:B
- Python——sorted
- Json概述以及python对json的相关操作
- Python MySQLdb 使用utf-8 编码插入中文数据
- LeetCode 292. Nim Game
- Python学习笔记(一)——Python函数的定义和使用
- python 标准类型内建函数
- 共有11款Python 中文分词库开源软件
- Python——sys.argv
- Python图像处理库PIL中快速傅里叶变换FFT的实现(一)