import requests,random,rsa,base64
import time, json,re,math
s = requests.Session()
def get_idx(i):
if i !='x' and i !='y':
return i
t = random.randint(0,16)
if 'x' == i:
n = t
else:
n = (3 & t) if 3 & t else 8
return hex(n).replace('0x','')
def guideRandom():
'''
:return:返回gid
'''
guide = [get_idx(i) for i in "xxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"]
return ''.join(guide).upper()
def make_time_timeStamp():
"""
:return:时间戳
"""
millis = int(round(time.time() * 1000))
return str(millis)
def baseN(num, b):
'''
进制转换
:param num:
:param b:
:return:
'''
return ((num == 0) and "0") or (baseN(num // b, b).lstrip("0") + "0123456789abcdefghijklmnopqrstuvwxyz"[num % b])
def get_callback(prefix):
'''
获取callback
:param prefix:
:return:
'''
ran_num = math.floor(2147483648 * random.random())
return prefix+baseN(ran_num, 36)
def get_token(gid,tt,callback):
'''
:param gid: jid参数
:param tt: 时间戳
:param callback: 返回的参数
:return: 返回token
'''
urls = 'https://tieba.baidu.com/'
headers = {
'Referer': 'http://tieba.baidu.com/f/index/forumclass',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36',
}
r = s.get(urls)
url = 'https://passport.baidu.com/v2/api/?getapi&tpl=tb&apiver=v3&tt='+tt+'&class=login&gid='+gid+'&loginversion=v4&logintype=dialogLogin&traceid=&callback='+callback
r = s.get(url)
token = re.findall('"token" : "(.*?)", "cookie"', r.text)[0]
return token
def get_public(token,tt,gid,callback):
'''
:param token:
:param tt:
:param gid:
:param callback:
:return: 返回public的公钥,还有traceid
'''
url = 'https://passport.baidu.com/v2/getpublickey?token='+token+'&tpl=tb&apiver=v3&tt='+tt+'&gid='+gid+'&loginversion=v4&traceid=38F24D01&callback='+callback
r = s.get(url)
if r.status_code == 200 and callback in r.text:
data = json.loads(re.search(r'.*?\((.*)\)', r.text).group(1).replace("'", '"'))
return data.get('pubkey'), data.get('key'),data.get('traceid')
def encript_password(password, pubkey):
'''
:param password: 加密前的密码
:param pubkey: rsa公钥
:return:返回密码
'''
pub = rsa.PublicKey.load_pkcs1_openssl_pem(pubkey.encode('utf-8'))
encript_passwd = rsa.encrypt(password.encode('utf-8'), pub)
print(base64.b64encode(encript_passwd).decode('utf-8'))
return base64.b64encode(encript_passwd).decode('utf-8')
def login(token,gid,username,password,rsakey,traceid,callback,tt):
data = {
'staticpage': 'https://tieba.baidu.com/tb/static-common/html/pass/v3Jump.html',
'charset': 'UTF-8',
'token': token,
'tpl': 'tb',
'subpro':'' ,
'apiver': 'v3',
'tt': tt,
'codestring':'' ,
'safeflg': 0,
'u': 'https://tieba.baidu.com/index.html',
'isPhone': '',
'detect': 1 ,
'gid': gid,
'quick_user': 0,
'logintype': 'dialogLogin',
'logLoginType': 'pc_loginDialog',
'idc': '',
'loginmerge': 'true',
'splogin': 'rate',
'username': username,
'password': password,
'mem_pass': 'on',
'rsakey': rsakey,
'crypttype': 12,
'ppui_logintime': 73459,
'countrycode': '',
'fp_uid': '',
'fp_info': '',
'loginversion': 'v4',
'dv': 'tk0.5928527079156561544428481110@nnp0anAEQgAm-USL-g2k4d5u~-nm~~2oXZPo~gAErWAEDpAEQgAm-USL-g2krWAlsfBkKf2kqg0rvnFZ6hE0yBHv5sMlr~MZyZJW0dEOvb7G~dAk4d5f~Xnm~~2vFhEKSGsHZBMZhEHvp-AvyBSM5DJKX1PLHgA3qw531ptp0JB53Kw2kHx5V~-Akr-5d-HsHXuHKv5MZysHZhBAEhBMW7ePfFDJD0APWScPK6wPR~W5EJgA3q~2krx5EQx2u~W5lrgAlrx2kAW5lsd2vFhEKSGsHZBMZhEHvp-AvyBSM5DJKX1PL0p5lqx2kAxnm~ZAEQdAG-HsHXuHKv5MZysHZhBAEhBMfh1Jf5fPf6KBk9x5d~w53sg5l4x5lJg0rvnFZ6hE0yBHv5sMlr~MZylSL6bNMFpBssNusyhe1kJhypgAG~d2k9fwpqSog~23HXA3QZA3J~5lK-5E9Z53rZ5kswA3Qwnkr-AEq_gp0ysNuFwJuAi2dywNL0V9GXV9LDKSGX3PWweNLXK7MQUNuFbPm-ZPOFD7ODU7Ls_GpSAm~~2krZnkrg5ErWAG~-5ks~2kK~Am~-5ks~2krw5kqgnk9~',
'traceid': traceid,
'callback': callback,
}
url = 'https://passport.baidu.com/v2/api/?login'
r = s.post(url,data=data)
print(r.cookies)
if __name__ == '__main__':
'''
已完成
tt
gid
token
'''
# get_sign()
# get_callback('bd__pcbs__')
username = 'xxxxx'
password = 'xxxxxx'
tt = make_time_timeStamp()
gid = guideRandom()
callback=get_callback('bd__pcbs__')
token = get_token(gid, tt,callback)
public_data=get_public(token,tt,gid,callback)
login(token, gid, username=username, password=password, rsakey=public_data[0], traceid=public_data[2], callback=callback, tt=tt)
# encript_password('123456',pubkey)