环境: Win7 64位
Python版本:python 2.7.13
代码:
#!/user/bin/python
# -*- coding: utf8 -*-
import requests, time, re
import sys
import urllib
reload(sys)
sys.setdefaultencoding("utf-8")
content = 'E:\\python练习程序\\模拟百度登录\\验证码\\';
content = content.decode('utf-8').encode('gbk');
def saveHtml(Ahtml, AfileNmae):
fh = open(content + AfileNmae, 'w');
fh.write(Ahtml);
fh.close();
class getId():
def __init__(self, name, password):
# 访问主页,获取cookie
self.name = name
self.password = password
#print self.name
#print self.password
self.s = requests.Session()
self.s.get('http://pan.baidu.com',verify=False)
self.s.get('https://passport.baidu.com/v2/api/?login',verify=False)
# 获取token 值
self.cook = self.s.get("https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true" ,verify=False)
saveHtml(self.cook.text, 'cookies.txt')
self.data = self.cook.text;
self.token = re.findall(r"bdPass.api.params.login_token='(.*?)'", self.data)[0]
# 构造包的头部
self.headers = {
'Host': 'passport.baidu.com',
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.3; .NET4.0C; .NET4.0E)',
'Accept': 'application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*',
'Accept-Language': 'zh-CN',
'Accept-Encoding': 'gzip, deflate',
'Referer': 'http://pan.baidu.com/',
#'X-Forwarded-For': '112.224.21.186',
'Content-Type': 'application/x-www-form-urlencoded'
}
self.s.get("https://passport.baidu.com/v2/api/?login", headers=self.headers, verify=False)
self.tt = str(int(time.time()*1000))
#print self.tt
# 第一次post数据
self.payload = {
'staticpage': 'https://www.baidu.com/cache/user/html/v3Jump.html',
'charset': 'utf-8',
'token': self.token,
'tpl': 'mn',
'apiver': 'v3',
'codestring': '',
'safeflg': '0',
'u': 'http://pan.baidu.com/',
'isPhone': 'false',
'gid': 'DD95D36-DBD5-41BB-ADAC-D6D3A8A9D593',
'quick_user': '0',
'loginmerge': 'true',
'splogin': 'rate',
'logintype': 'dialogLogin',
'logLoginType': 'pc_loginDialog',
'username': self.name,
'password': self.password,
'verifycode': '',
'mem_pass': 'on',
'ppui_logintime': '20403',
'callback': 'parent.bd__pcbs__m457iz'
}
# 第一次post,获取验证码地址
self.login = self.s.post("https://passport.baidu.com/v2/api/?login", data=self.payload, headers=self.headers, verify=False)
#print self.login.text
self.get_code = re.findall(r'codeString=(.*?)&userName', self.login.text)[0]
print self.get_code
if (self.get_code != ''):
# 获取验证码
self.code = self.s.get("https://passport.baidu.com/cgi-bin/genimage", params=self.get_code, stream=True, verify=False)
self.path = "code.jpg" # 验证码保存路径
#print (content + self.path)
if self.code.status_code == 200:
with open(content + self.path, 'wb') as f:
for chunk in self.code.iter_content():
f.write(chunk)
verifycode = raw_input("Input Vcode:")
self.tt = str(int(time.time()*1000))
self.payload = {
'staticpage': 'https://www.baidu.com/cache/user/html/v3Jump.html',
'charset': 'utf-8',
'token': self.token,
'tpl': 'mn',
'apiver': 'v3',
'tt': self.tt,
'gid': 'DD95D36-DBD5-41BB-ADAC-D6D3A8A9D593',
'codestring': self.get_code,
'safeflg': '0',
'u': 'http://pan.baidu.com/',
'isPhone': 'false',
'quick_user': '0',
'loginmerge': 'true',
'logintype': 'dialogLogin',
'logLoginType': 'pc_loginDialog',
'username': self.name,
'password': self.password,
'verifycode': verifycode,
# 'mem_pass':'on',
'ppui_logintime': '20403',
'callback': 'parent.bd__pcbs__m457iz'
}
b = urllib.quote(verifycode)
print b
print self.token
print self.get_code
self.params = {
'token': self.token,
'tpl': 'mn',
'apiver': 'v3',
'verifycode': b,
'codestring': self.get_code,
'callback': 'parent.bd__pcbs__ob5sb9'
}
self.code = self.s.get("https://passport.baidu.com/v2/?checkvcode", params=self.params, headers=self.headers, verify=False)
#saveHtml(self.code.text, '111.txt')
print self.code.text
def GetResult(self, verifycode):
# 输入验证码
# verifycode = ''
# while not verifycode:
# verifycode = raw_input("Input Vcode:")
self.verifycode = verifycode
# print self.verifycode
# 构造post数据
print self.get_code;
print self.verifycode;
self.tt = str(int(time.time()*1000))
print self.tt
self.payload = {
'staticpage': 'https://www.baidu.com/cache/user/html/v3Jump.html',
'charset': 'utf-8',
'token': self.token,
'tpl': 'mn',
'apiver': 'v3',
'tt': self.tt,
'gid': 'DD95D36-DBD5-41BB-ADAC-D6D3A8A9D593',
'codestring': self.get_code,
'safeflg': '0',
'u': 'http://pan.baidu.com/',
'isPhone': 'false',
'quick_user': '0',
'loginmerge': 'true',
'logintype': 'dialogLogin',
'logLoginType': 'pc_loginDialog',
'username': self.name,
'password': self.password,
'verifycode': self.verifycode,
# 'mem_pass':'on',
'ppui_logintime': '20403',
'callback': 'parent.bd__pcbs__m457iz'
}
self.login2 = self.s.post("https://passport.baidu.com/v2/api/?login", data=self.payload, headers=self.headers) #, verify=False
saveHtml(self.login2.text, 'err.txt')
#self.login3 = self.s.post("https://passport.baidu.com/v2/?checkvcode", data=self.payload, headers=self.headers, verify=False);
#saveHtml(self.login3.text, '3.txt')
# 判断是否登录成功,判断cookie中是否含有'BDUSS'
print self.s.cookies
if 'BDUSS' in self.s.cookies:
print "LOGIN SUCCESS"
#self.getQuota()
return 0
else:
self.error_no = re.search("err_no=(?P<err_no>\d+?)&", self.login2.text)
err_no = int(self.error_no.group("err_no"))
print "error_no = : %d" % err_no
print "failed"
return err_no
def getCode(self):
return self.get_code
if __name__ == '__main__':
# 构造一个会话,用来跨请求保存cookie
# 此处输入自己的账号名和密码
baiduId = getId('百度用户名', '密码')
处理方式是先把验证码保存到本地,然后手动进行输入,再向服务器发送数据登录。