python接口自动化24-token关联登录

前言

登录网站的时候,经常会遇到传token参数,token关联并不难,难的是找出服务器第一次返回token的值所在的位置,取出来后就可以动态关联了

登录拉勾网

1.先找到登录首页https://passport.lagou.com/login/login.html, 输入账号和密码登录,抓包看详情

2.再重新登录一次抓包看的时候,头部有两个参数是动态的,token和code值每次都会不一样,只能用一次

X-Anit-Forge-Token: 45aa69d8-4afa-4235-8957-9dde7af1903e X-Anit-Forge-Code: 20765316

找到token生成的位置

1.打开登录首页https://passport.lagou.com/login/login.html,直接按F5刷新(只做刷新动作,不输入账号和密码),然后从返回的页面找到token生成的位置

看注释内容:

</script>    <!-- 页面样式 -->    <!-- 动态token,防御伪造请求,重复提交 -->    <script>    window.X_Anti_Forge_Token = '286fd3ae-ef82-4019-89c4-9408947a0e26';    window.X_Anti_Forge_Code = '74603111'; </script>

前端的代码,注释内容暴露了token位置,嘿嘿!

2.接下来从返回的html里面解析出token和code两个参数的值

# coding:utf-8 import requests import re from bs4 import BeautifulSoup def getTokenCode(s):    '''        要从登录页面提取token,code, 然后在头信息里面添加        <!-- 页面样式 --><!-- 动态token,防御伪造请求,重复提交 -->        <script type="text/javascript">            window.X_Anti_Forge_Token = 'dde4db4a-888e-47ca-8277-0c6da6a8fc19';            window.X_Anti_Forge_Code = '61142241';        </script>
   # 作者:上海- 悠悠 QQ群:588402570            '''
       url = 'https://passport.lagou.com/login/login.html'    h = {         "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",        }    # 更新session的headers    s.headers.update(h)    data = s.get(url, verify=False)    soup = BeautifulSoup(data.content, "html.parser", from_encoding='utf-8')    tokenCode = {}    try:        t = soup.find_all('script')[1].get_text()        print(t)        tokenCode['X-Anit-Forge-Token'] = re.findall(r"Token = '(.+?)'", t)[0]        tokenCode['X_Anti_Forge_Code'] = re.findall(r"Code = '(.+?)'", t)[0]    except:        print("获取token和code失败")        tokenCode['X-Anit-Forge-Token'] = ""        tokenCode['X_Anti_Forge_Code'] = ""    return tokenCode

模拟登陆

1.登陆的时候这里密码参数虽然加密了,但是是固定的加密方式,所以直接复制抓包的加密后字符串就行了

# coding:utf-8 import requests import re from bs4 import BeautifulSoup def login(s, gtoken, user, psw):    '''
   # 作者:上海- 悠悠 QQ群:588402570    function:登录拉勾网网站    :param s:  传s = requests.session()    :param gtoken: 上一函数getTokenCode返回的tokenCode    :param user: 账号    :param psw: 密码    :return: 返回json    '''    url2 = 'https://passport.lagou.com/login/login.json'    h2 = {    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",    "X-Requested-With": "XMLHttpRequest",    "X-Anit-Forge-Token": gtoken['X-Anit-Forge-Token'],    "X-Anit-Forge-Code": gtoken['X-Anit-Forge-Code'],    "Referer": "https://passport.lagou.com/login/login.html",    }    # 更新s的头部    s.headers.update(h2)    body = {            "isValidate":'true',            "username": user,            "password": psw,            "request_form_verifyCode": "",            "submit": ""            }    r2 = s.post(url2 , data=body, verify=False)    print(r2.text)    return r2.json()

密码加密

1.这里密码是md5加密的(百度看了其它大神的博客,才知道的)

# coding:utf-8 import requests import re from bs4 import BeautifulSoup import hashlib

def encryptPwd(passwd):    # 对密码进行了md5双重加密    passwd = hashlib.md5(passwd.encode('utf-8')).hexdigest()    # veennike 这个值是在js文件找到的一个写死的值    passwd = 'veenike'+passwd+'veenike'    passwd = hashlib.md5(passwd.encode('utf-8')).hexdigest()    return passwd if __name__ == "__main__":   # 测试密码123456   print(encryptPwd("123456"))

输出结果:

2.跟抓包的数据对比,发现是一样的,说明加密成功

参考代码:

# coding:utf-8 import requests import re from bs4 import BeautifulSoup import urllib3 import hashlib urllib3.disable_warnings() class LoginLgw():    # 作者:上海- 悠悠 QQ群:588402570

def __init__(self, s):        self.s = s    def getTokenCode(self):        '''            要从登录页面提取token,code, 然后在头信息里面添加            <!-- 页面样式 --><!-- 动态token,防御伪造请求,重复提交 -->            <script type="text/javascript">                window.X_Anti_Forge_Token = 'dde4db4a-888e-47ca-8277-0c6da6a8fc19';                window.X_Anti_Forge_Code = '61142241';            </script>        '''        url = 'https://passport.lagou.com/login/login.html'        h = {             "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",            }        # 更新session的headers        self.s.headers.update(h)        data = self.s.get(url, verify=False)        soup = BeautifulSoup(data.content, "html.parser", from_encoding='utf-8')        tokenCode = {}        try:            t = soup.find_all('script')[1].get_text()            print(t)            tokenCode['X_Anti_Forge_Token'] = re.findall(r"Token = '(.+?)'", t)[0]            tokenCode['X_Anti_Forge_Code'] = re.findall(r"Code = '(.+?)'", t)[0]            return tokenCode        except:            print("获取token和code失败")            tokenCode['X_Anti_Forge_Token'] = ""            tokenCode['X_Anti_Forge_Code'] = ""            return tokenCode    def encryptPwd(self,passwd):        # 对密码进行了md5双重加密        passwd = hashlib.md5(passwd.encode('utf-8')).hexdigest()        # veennike 这个值是在js文件找到的一个写死的值        passwd = 'veenike'+passwd+'veenike'        passwd = hashlib.md5(passwd.encode('utf-8')).hexdigest()        return passwd    def login(self, user, psw):        '''        function:登录拉勾网网站        :param user: 账号        :param psw: 密码        :return: 返回json        '''        gtoken = self.getTokenCode()        print(gtoken)        print(gtoken['X_Anti_Forge_Token'])        print(gtoken['X_Anti_Forge_Code'])        url2 = 'https://passport.lagou.com/login/login.json'        h2 = {        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",        "X-Requested-With": "XMLHttpRequest",        "X-Anit-Forge-Token": gtoken['X_Anti_Forge_Token'],        "X-Anit-Forge-Code": gtoken['X_Anti_Forge_Code'],        "Referer": "https://passport.lagou.com/login/login.html",        }        # 更新s的头部        self.s.headers.update(h2)        passwd = self.encryptPwd(psw)        body = {                "isValidate":'true',                "username": user,                "password": passwd,                "request_form_verifyCode": "",                "submit": ""                }        r2 = self.s.post(url2 , data=body, verify=False)        try:            print(r2.text)            return r2.json        except:            print("登录异常信息:%s" % r2.text)            return None if __name__ == "__main__":    s = requests.session()    lgw = LoginLgw(s)    lgw.login("15221000000", "123456")
   # 作者:上海- 悠悠 QQ群:588402570

(0)

相关推荐

  • 获取用户信息脚本

    #! /bin/bashread -p "请输入要查询的用户名:" Aecho "------------------------------"n=`cat / ...

  • python接口自动化4-绕过验证码登录(cookie)

    前言 有些登录的接口会有验证码:短信验证码,图形验证码等,这种登录的话验证码参数可以从后台获取的(或者查数据库最直接). 获取不到也没关系,可以通过添加cookie的方式绕过验证码. 一.抓登录coo ...

  • python接口自动化7-参数关联

    前言 我们用自动化发帖之后,要想接着对这篇帖子操作,那就需要用参数关联了,发帖之后会有一个帖子的id,获取到这个id,继续操作传这个帖子id就可以了 一.删除草稿箱 1.我们前面讲过登录后保存草稿箱, ...

  • python接口自动化10-token登录

    前言 有些登录不是用cookie来验证的,是用token参数来判断是否登录. token传参有两种一种是放在请求头里,本质上是跟cookie是一样的,只是换个单词而已(王老吉换成加多宝而已):另外一种 ...

  • python接口自动化25-全局变量token项目设计

    获取token 在做接口自动化的时候,经常会遇到多个用例需要用同一个参数token,并且这些测试用例跨.py脚本了. 一般token只需要获取一次就行了,然后其它使用unittest框架的测试用例全部 ...

  • python接口自动化1-发送get请求

    前言 requests模块,也就是老污龟,为啥叫它老污龟呢,因为这个官网上的logo就是这只污龟,接下来后面的自动化都离不开它. 一.环境安装 1.用pip安装requests模块 >>p ...

  • python接口自动化2-发送post请求

    前言 发送post的请求参考例子很简单,实际遇到的情况却是很复杂的,首先第一个post请求肯定是登录了,但登录是最难处理的.登录问题解决了,后面都简单了. 一.查看官方文档 1.学习一个新的模块,其实 ...

  • python接口自动化3-自动发帖(session)

    前言 上一篇模拟登录博客园,但这只是第一步,一般登录后,还会有其它的操作,如发帖,评论等,这时候如何保持会话呢? 一.session简介 1.查看帮助文档,贴了一部分,后面省略了 >>im ...

  • python接口自动化5-Json数据处理

    前言 有些post的请求参数是json格式的,这个前面第二篇post请求里面提到过,需要导入json模块处理. 一般常见的接口返回数据也是json格式的,我们在做判断时候,往往只需要提取其中几个关键的 ...

  • python接口自动化6-重定向(Location)

    前言 某屌丝男A鼓起勇气向女神B打电话表白,女神B是个心机婊觉得屌丝男A是好人,不想直接拒绝于是设置呼叫转移给闺蜜C了,最终屌丝男A和女神闺蜜C表白成功了,这种场景其实就是重定向了. 一.重定向 1. ...