python 淘宝系列(二):处理验证码的模拟登陆

处理步骤

  1. 打开登录主页面,获得相应的cookie

  2. 发送post数据包,获得响应

  3. 根据响应返回的state查看登录是否成功,若未成功,可以根据返回的message信息查找对应的解决方法。

关键点

  1.  验证码对应的地址

    采用IE的F12开发者工具,截获淘宝登录数据,从中分析验证码下载地址,截获数据如下,主要是需要下面的两个POST包,第一个POST方法是询问是否需要验证码验证,第二个POST方法是发送登录所需要的数据包。144801_2yVQ_811744.jpg

查看第一个POST方法详细信息,可以查看详细的请求参数,这里不显示了,响应如下:

       150213_U25G_811744.jpg

接着肯定要获取验证码,那么我们查看紧接着POST方法的第一个GET方法信息,看到响应如下:

       150244_mhbd_811744.jpg

看到的确收到了验证码图片,地址如上所示,切换到DOM资源管理器,查看源网页HTML码如下:

       151050_wXG7_811744.jpg

      至此,验证码地址已经找到了。

2.  提取验证码地址

      要注意的是,验证码地址是动态生成的,每次访问登录界面,会获得不同的验证码,那么我们需要获取对应的验证码地址。

      打开一个登陆界面,就会获得一个cookie,验证码地址也包含在其中,因此,在程序中,我们只需要打开一次登录界面,从中提取出验证码地址即可。

完整代码

# -*- coding: utf-8 -*-

import urllib
import urllib2
import cookielib
import re
#登录地址
tbLoginUrl = "https://login.taobao.com/member/login.jhtml"
checkCodeUrl = ''
#post请求头部
headers = {
    'x-requestted-with': 'XMLHttpRequest',
    'Accept-Language': 'zh-cn',
    'Accept-Encoding': 'gzip, deflate',
    'ContentType': 'application/x-www-form-urlencoded; chartset=UTF-8',
    'Host':    'login.taobao.com',
    'DNT': 1,
    'Cache-Control': 'no-cache',
    'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1',  
    'Referer' : 'https://login.taobao.com/member/login.jhtml?redirectURL=http%3A%2F%2Fwww.taobao.com%2F',
    'Connection' : 'Keep-Alive'
}
#用户名,密码
username = "your username"
password = raw_input("Please input your password of taobao: ")
#请求数据包
postData = {   
    'TPL_username':username, 
    'TPL_password':password, 
    "need_check_code" : "false",
    "loginsite": 0,
    "newlogin":1,
    'TPL_redirect_url':'',
    'from':'tbTop',  
    'fc':"default",   
    'style':'default',  
    'css_style':'', 
    'tid':'',
    'support':'000001', 
    'CtrlVersion':'1,0,0,7',  
    'loginType':3, 
    'minititle':'', 
    'minipara' :'', 
    "umto":"NAN",
    'pstrong':2,
    'llnick':'', 
    'sign':'',
    'need_sign':'',  
    "isIgnore":'',
    "full_redirect":'',
    'popid':'',
    'callback':'1',  
    'guf':'', 
    'not_duplite_str':'',  
    'need_user_id':'', 
    'poy':'', 
    'gvfdcname':10,
    'from_encoding':'',
    "sub":'',
    "allp":'',      
    'action':'Authenticator',   
    'event_submit_do_login':'anything',        
    'longLogin':0               
}
#登录主函数
def loginToTaobao():
    #cookie 自动处理器
    global checkCodeUrl
    cookiejar = cookielib.LWPCookieJar()#LWPCookieJar提供可读写操作的cookie文件,存储cookie对象
    cookieSupport= urllib2.HTTPCookieProcessor(cookiejar)
    opener = urllib2.build_opener(cookieSupport, urllib2.HTTPHandler)
    urllib2.install_opener(opener)
    #打开登陆页面
    taobao = urllib2.urlopen(tbLoginUrl)
    resp = taobao.read().decode("gbk")
    #提取验证码地址
    pattern = r'img id="J_StandardCode_m" src="https://s.tbcdn.cn/apps/login/static/img/blank.gif" data-src="(\S*)"'
    checkCodeUrlList = re.findall(pattern, resp)
    checkCodeUrl = checkCodeUrlList[0]
    print "checkCodeUrl:", checkCodeUrl
    #此时直接发送post数据包登录
    sendPostData(tbLoginUrl, postData, headers)
    if checkCodeUrl != "":
         getCheckCode(checkCodeUrl)
    sendPostData(tbLoginUrl, postData, headers)
    
def sendPostData(url, data, header):
    print "+"*20+"sendPostData"+"+"*20
    data = urllib.urlencode(data)      
    request = urllib2.Request(url, data, header)
    response = urllib2.urlopen(request)
    #url = response.geturl()
    text = response.read().decode("gbk")
    info = response.info()
    status = response.getcode()
    response.close()
    print status
    print info
    print "Response:", text
    result = handleResponseText(text)
    if result["state"]:
        print "successfully login in!"
    else:
        print "failed to login in, error message: ",result["message"]

def handleResponseText(text):
    """处理登录返回结果"""
    global checkCodeUrl
    
    print "+"*20+"handleResponseText"+"+"*20  
    text = text.replace(',', ' ')   
    responseData = {"state": False,
                    "message" : "",
                    "code" : ""}
    
    m1 = re.match(r'\{?"state":(\w*)\ ', text)
    if m1 is not None:
        s = m1.group(1)
        if s == "true":
            responseData["state"] = True
        else:
            m2 = re.search(r'"message":"(\S*)"( |})', text)
            if m2 is not None:
                msg = m2.group(1)
                responseData["message"] = msg.decode("utf-8")   
            else:
                print "failed to get the error message"
            m3 = re.match(r'.+\"code":(\w*)\ ', text)
            if m3 is not None:
                code = m3.group(1)
                responseData["code"] = code
#                 if code == "1000":                 
#                     getCheckCode(checkCodeUrl)
            else:
                print "failed to get the error code"
    return responseData

def getCheckCode(url):
    print "+"*20+"getCheckCode"+"+"*20
    response = urllib2.urlopen(url)
    status = response.getcode()
    picData = response.read()
    
    path = "C:\\Users\\Echo\\Desktop\\checkcode.jepg"
    if status == 200:
        localPic = open(path, "wb")
        localPic.write(picData)
        localPic.close() 
        print "请到%s,打开验证码图片"%path  
        checkCode = raw_input("请输入验证码:")
        print checkCode, type(checkCode)
        postData["TPL_checkcode"] = checkCode
        postData["need_check_code"] = "true"
    else:
        print "failed to get Check Code, status: ",status

if __name__ == "__main__":   
    loginToTaobao()

运行结果:

172103_MdZz_811744.jpg

可见,成功的拿到了token,模拟登录成功!       




转载于:https://my.oschina.net/u/811744/blog/192087

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值