微博登陆步骤
1. "su"的加密算法,su是username經(jīng)過(guò)BASE64計(jì)算得來(lái)的:
def get_encodename(name):
# name must be string
username_quote = quote_plus(str(name))
username_base64 = base64.b64encode(username_quote.encode("utf-8"))
return username_base64.decode("utf-8")
2.獲取sp的值,就是密碼rsa的加密值
1.首先訪問(wèn)http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=上面的su字符串=&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)&_=時(shí)間戳,獲取json字符串
def get_server_data(su,session,proxy):
pre_url = "http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su="
pre_url = pre_url + su + "&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)&_="
prelogin_url = pre_url + str(int(time.time() * 1000))
pre_data_res = session.get(prelogin_url, headers=headers, proxies=proxy)
sever_data = ast.literal_eval(pre_data_res.content.decode("utf-8").replace("sinaSSOController.preloginCallBack", ''))
return sever_data
2.獲取url的post數(shù)據(jù)的一部分內(nèi)容
{"retcode":0,"servertime":1526866235,"pcid":"gz-5a7050e9c71bbf284bca688fd7bd24ec57e1","nonce":"WPGNDA","pubkey":"EB2A38568661887FA1w3062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv":"1330428213","is_openlock":0,"lm":1,"smsurl":"https://login.sina.com.cn/sso/msglogin?entry=weibo&mobile=18810668312&s=5a68912sabf7e2d399ab4f878dc7","showpin":0,"exectime":27}
"showpin":表示是否需要驗(yàn)證碼,1需要,0不需要
這一步為了獲取下面幾個(gè)參數(shù)的值
servertime = server_data["servertime"]
nonce = server_data['nonce']
rsakv = server_data["rsakv"]
pubkey = server_data["pubkey"]
然后進(jìn)行rsa解密,導(dǎo)入rsa模塊
def get_password(password, servertime, nonce, pubkey):
rsa_publickey = int(pubkey, 16)
key = rsa.PublicKey(rsa_publickey, 65537) #創(chuàng)建公鑰
message = str(servertime) + ' ' + str(nonce) + '
' + str(password) #創(chuàng)建公鑰
message = message.encode("utf-8")
passwd = rsa.encrypt(message, key) #加密
passwd = binascii.b2a_hex(passwd) #將加密信息轉(zhuǎn)換為16進(jìn)制。
return passwd
最后我們就可以構(gòu)造post數(shù)據(jù)進(jìn)行請(qǐng)求了
def login_no_pincode(name, password, session, server_data, proxy):
post_url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)'
servertime = server_data["servertime"]
nonce = server_data['nonce']
rsakv = server_data["rsakv"]
pubkey = server_data["pubkey"]
sp = get_password(password, servertime, nonce, pubkey)
data = {
'encoding': 'UTF-8',
'entry': 'weibo',
'from': '',
'gateway': '1',
'nonce': nonce,
'pagerefer': "",
'prelt': 67,
'pwencode': 'rsa2',
"returntype": "META",
'rsakv': rsakv,
'savestate': '7',
'servertime': servertime,
'service': 'miniblog',
'sp': sp,
'sr': '1920*1080',
'su': get_encodename(name),
'useticket': '1',
'vsnf': '1',
'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack'
}
return None, '', session
總結(jié)
- 上一篇: python连接中控考勤机分析数据
- 下一篇: apache下IE6对js的bug处理