python 登录拉钩

首先模拟登录,思路很真要

1.首先我们要弄清楚服务器是如何处理我们的请求的,如何给我们返回数据的

首先我们观察我们提交的数据,提交请求的方式,如图所示明显我们的密码被服务器给加密了,同时要清楚一点,经过加密的数据的加密方式必定在某个文件中有方法被调用,于是我们可以找到

于是乎我们就可以得知加密方式是md5 加密方式很明显了

于是通过抓包我们发现在login.json 的请求头中有这样两个字段,通过分析它们是动态的我们不能直接加载请求头中直接去发送请求,分析可知

访问这个连接后我们在返回的string中可以通过该正则的方式取到值,在加到我们的请求头中进行请求,这样就可以登录成功了,

分析之后我们可以直接上代码了

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

import hashlib
import requests
import re

headers = {
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Pragma': 'no-cache',
    'Referer':'https://passport.lagou.com/login/login.html?ts=1517818358492&serviceId=lagou&service=https%253A%252F%252Fwww.lagou.com%252F&action=login&signature=6EB4BF8F73B5A73E6B327148B42529F1',
    'Upgrade-Insecure-Requests':'1',
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'
}

def deal_passwd(passwd):
    v = 'veenike'
    #次处放置伪代码
    passwd = 加密(passwd)
    passwd = 加密(v + passwd + v)
    return passwd

之后我们要得到的值

X-Anit-Forge-Code:54559207
X-Anit-Forge-Token:93e4d102-1843-42e4-a419-5efc1cb4bae6
def get_token():
    token = {}

    url = 'https://passport.lagou.com/grantServiceTicket/grant.html'

    request = session.get(url,headers=headers)

    html = request.content
    
    #通过正则来进行匹配得到我们需要的数据
    reg1 = ("window.X_Anti_Forge_Token = '[\s\S]{36}'")
    reg2 = ("window.X_Anti_Forge_Code = '[\d]{8}'")

    X_Anti_Forge_Token = re.findall(reg1, html)[0].split()[-1][1:-1]
    X_Anti_Forge_Code = re.findall(reg2, html)[0].split()[-1][1:-1]
    print X_Anti_Forge_Token,X_Anti_Forge_Code
    token['X-Anit-Forge-Token'] = X_Anti_Forge_Token
    token['X-Anit-Forge-Code'] = X_Anti_Forge_Code
    return token

最后我们可以处理自己的登录函数

def login(user, passwd, captchaData=None, token_code=None):
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Pragma': 'no-cache',
        'Referer': 'https://passport.lagou.com/login/login.html?ts=1517818358492&serviceId=lagou&service=https%253A%252F%252Fwww.lagou.com%252F&action=login&signature=6EB4BF8F73B5A73E6B327148B42529F1',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'
    }
    password = deal_passwd(passwd)
    postData = {
        'isValidate' : 'true',
        'password' : password,
        # 如需验证码,则添加上验证码
        'request_form_verifyCode' : (captchaData if captchaData!=None else ''),#一般没有出现验证码,所以关于处理验证码的部分没有考虑,我们可以尝试把验证码放置到本地进行手动输入,或者借助于第三方打码
        'submit' : '',
        'username' : user
    }

    login_url = 'https://passport.lagou.com/login/login.json'
    take_token = get_token()  #调用我们之前写好的方法,得到我们要的字段
    headers.update(take_token)#更新我们的请求头,加上我们去到的字段进行请求
    request = session.post(login_url,data=postData,headers=headers)
print request.content
#最后我们调用
login(user,passwd)
#此时已经登录成功,可以在返回的数据中看到自己的名字等,可以进行后续的操作
 

 

posted @ 2018-02-05 22:37  随风无义  阅读(429)  评论(0)    收藏  举报