# coding:utf-8
"""
rsa加密算法一窍不通,没有对密码加密而是直接使用的Firefox中已加密的密码
因为用的是登陆时候的加密密码,所以rsakey等都要是登录时的值
"""
import requests
import re,os
from PIL import Image
import cookielib
import rsa,base64
agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0"
headers = {
"Host":"passport.baidu.com",
"User-Agent":agent,
"Referer":"https://www.baidu.com/"
}
session = requests.session()
session.cookies = cookielib.LWPCookieJar(filename='Baidu_cookies')
try:
session.cookies.load(ignore_discard=True)
except:
print "cookie未加载!"
def get_token():
url = "https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true"
session.get(url, headers=headers)
html = session.get(url,headers=headers).content
patt = re.compile(r"login_token='(.*?)';")
token =re.findall(patt,html)[0]
return token
def get_codestring(name,password):
url = "https://passport.baidu.com/v2/api/?login"
post_data1 = {
"staticpage": "https://www.baidu.com/cache/user/html/v3Jump.html",
"charset": "UTF-8",
"token": get_token(),
"tpl": "mn",
"subpro": "",
"apiver": "v3",
"tt": "1477293628520",#登录时的tt
"codestring": "",
"safeflg": "0",
"u": "https://www.baidu.com/",
"isPhone": "false",
"detect": "1",
"gid": "F869E08-5340-42BC-B189-058C960376E9",#登录时的gid
"quick_user": "0",
"logintype": "dialogLogin",
"logLoginType": "pc_loginDialog",
"idc": "",
"loginmerge": "true",
"splogin": "rate",
"username": name,
"password": password,
"mem_pass": "on",
"rsakey": "VlDcAx3iLF0Ktr6AJe1Db76JFJ0kf7RT",#登录时的rsakey
"crypttype": "12",
"ppui_logintime": "6055",#登录时的值
"countrycode": "",
"callback": "parent.bd__pcbs__je2d8f",#登录时的值
}
login_html = session.post(url,data=post_data1,headers=headers)
verifycode = re.findall(r'codeString=(.*?)&userName',login_html.text)[0]
#print verifycode
return verifycode
def get_verifycode(name,password,codestring):
img_url = "https://passport.baidu.com/cgi-bin/genimage?" + codestring
r = session.get(img_url,headers=headers).content
with open('Baidu_captcha.jpg','wb') as f:
f.write(r)
f.close()
try:
image = Image.open('Baidu_captcha.jpg')
image.show()
image.close()
except:
print "请到目录%s查看Baidu_captcha.jpg并输入"%os.path.abspath('Baidu_captcha.jpg')
verifycode = raw_input("请输入验证码:\n> ")
return verifycode
def islogin():
url = "http://i.baidu.com/"
html = session.get(url,headers=headers).text
#print html
pattern = re.compile(r'<a class="header-tu-img header-tool-user-nick" href="javascript:;" />(.*?)</a>',re.S)
item = re.findall(pattern,html)
for content in item:
return content.strip()
def login_Baidu(name,password,codestring):
post_url = "https://passport.baidu.com/v2/api/?login"
post_data = {
"staticpage": "https://www.baidu.com/cache/user/html/v3Jump.html",
"charset": "UTF-8",
"token": get_token(),
"tpl": "mn",
"subpro": "",
"apiver": "v3",
"tt": "1476934121419",#登录时的值
"codestring": codestring, # 验证码编号,动态
"safeflg": "0",
"u": "https://www.baidu.com/",
"isPhone": "false",
"detect": "1",
"gid": "6ABF1D6-2FFE-4D4F-BF10-F2A2153F26F9",#登录时的值
"quick_user": "0",
"logintype": "dialogLogin",
"logLoginType": "pc_loginDialog",
"idc": "",
"loginmerge": "true",
"splogin": "rate",
"username": name, # 加密了
"password": password, # 加密了
"verifycode": get_verifycode(name,password,codestring), # 验证码
"rsakey": "6rzx1Dkc3e6sNtDbcOlv4DxYQg4O1DG7",#登录时的值
"crypttype": "12",
"ppui_logintime": "74490",#登录时的值
"countrycode": "",
"callback": "parent.bd__pcbs__brxpoi",#登录时的值
}
login_page = session.post(post_url,data=post_data,headers=headers)
print login_page.status_code
if islogin():
print "模拟登录成功!"
session.cookies.save(ignore_discard=True, ignore_expires=True)
if __name__ == '__main__':
if islogin():
print "cookie登录成功!"
else:
name = raw_input("请输入账号:>")
password = raw_input("请输入密码:>")
codestring = get_codestring(name,password)
login_Baidu(name,password,codestring)#统一验证码编号,防止获取验证码的编号与post_data中的不一致
print islogin()
requests模拟登录百度
最新推荐文章于 2024-08-15 15:31:20 发布