环境: 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('百度用户名', '密码') 
处理方式是先把验证码保存到本地,然后手动进行输入,再向服务器发送数据登录。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐