C++,python,热爱算法和机器学习
全部博文(1214)
分类: Python/Ruby
2014-02-07 12:30:58
这几天研究python(2.7)模拟新浪微博登陆,在网上找了一些资料并使用IE浏览器和httpwatch进行实践,总结出来新浪微博的登陆过程:2个get方法和1个post方法
第一个GET方法
首先当我们打开的时候就会从新浪服务器取得2个参数servertime和nonce,这两个参数提供给登陆微博使用,里面具体得到参数是通过http协议得到的。
得到的方法是 访问url:' + username + '&client=ssologin.js(v1.3.18),uersname是经过base64加密的结果即可通过解析json格式数据得到,其中username在打开时候被指定为undefine
第二个post方法
请求的消息都可以抄袭浏览器信息,需要自己填写的只有4个:su(加密的用户名),sp(加密密码),servertime,nonce,取得的结果正则一下得到location.replace里面的连接
第三个GET方法
访问上面的连接就可以得到cookie了
源码附上没有取得cookie的代码先记录一下
#coding=utf8
import urllib2
import urllib
import base64
import hashlib
import re
import sys
def encryptUserName(username):
"""
先将username进行urlcode转码,再进行base64编码,如果模拟登陆使用还需要进行一次urlcode转码
"""
username = urllib2.quote(username)
username = base64.encodestring(username)[:-1]
return username
def encryptPassword(pwd, servertime, nonce):
"""
将密码进行sha1算法加密,将加密结果再次进行sha1算法加密,将得到的结果和servertime和nonce拼接然后再进行sha1加密
"""
pwd1 = hashlib.sha1(pwd).hexdigest()
pwd2 = hashlib.sha1(pwd1).hexdigest()
pwd3_ = pwd2 + servertime + nonce
pwd3 = hashlib.sha1(pwd3_).hexdigest()
return pwd3
def getServerNonce(username):
"""
取得新浪的servertime和nonce利用url取得结果再对结果进行解析
url的拼写:' + username + '&client=ssologin.js(v1.3.18),uersname是经过base64加密的结果
取得的是json格式的数据,然后解析正则匹配取得servertime和nonce
"""
username = encryptUserName(username)
username = urllib2.quote(username)
url = '' + username + '&client=ssologin.js(v1.3.18)'
try:
data = urllib2.urlopen(url).read()
data = str(data)
time = re.findall(r'.*?servertime":(.*?),', data)[0]
nonce = re.findall(r'.*?nonce":"(.*?)".*?', data)[0]
return time,nonce
except:
s=sys.exc_info()
msg = (u"getPanelInfo Error %s happened on line %d" % (s[1],s[2].tb_lineno))
raise Exception,msg
def login(username, password):
"""
新浪登陆过程:
1.在打开时候会向服务器取得nonce和servertime,调用getServerNonce函数得到参数为undefine
2.然后利用nonce和servertime拼出post数据发送数据取得返回数据从里面提取到url
3.再次进行交互取得登陆cookie
"""
servertime=[]
nonce=[]
url = '(v1.4.2)'
try:
servertime,nonce = getServerNonce(username)
except Exception,ex:
raise Exception,ex
postdata = {
'encoding': 'UTF-8',
'entry': 'weibo',
'gateway': '1',
'nonce': '',
'from': '',
'prelt':'18',
'pwencode':'rsa2',
'returntype': 'META',
'savestate': '7',
'service': 'miniblog',
'ssosimplelogin': '1',
'url': '',
'userticket': '1',
'vsnf': '1',
'vsnval': '',
'su': '',
'servertime': '',
'nonce': '',
'sp': '',
}
postdata['servertime'] = servertime
postdata['nonce'] = nonce
postdata['su'] = encryptUserName(username)
postdata['sp'] = encryptPassword(password, servertime, nonce)
postdata = urllib.urlencode(postdata)
headers = {'User-Agent':'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)'}
req = urllib2.Request(
url=url,
data=postdata,
headers=headers
)
try:
result = urllib2.urlopen(req)
text = result.read()
text = str(text)
login_url = re.findall(r'.*?location.replace..(.*)..;', text)[0]
print login_url
urllib2.urlopen(login_url)
print u"登录成功!"
except:
print 'Login error!'
if __name__ == '__main__':
login('*', '*')