您的位置:首页 > 编程语言 > Python开发

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协议也不懂什么意思,等放假之后再学习一下吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: