python接口自动化23-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

# 作者:上海-悠悠 QQ交流群:512200893

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>
    '''
    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_Anti_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_Anti_Forge_Token'] = ""
        tokenCode['X_Anti_Forge_Code'] = ""
    return tokenCode

模拟登陆

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

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

# 作者:上海-悠悠 QQ交流群:512200893

def login(s, gtoken, user, psw):
    '''
    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_Anti_Forge_Token'],
    "X-Anit-Forge-Code": gtoken['X_Anti_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):
    # 作者:上海-悠悠 QQ交流群:512200893
    # 对密码进行了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()

# 作者:上海-悠悠 QQ交流群:512200893

class LoginLgw():

    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")

原文地址:https://www.cnblogs.com/yoyoketang/p/9098096.html

时间: 2024-10-03 05:15:31

python接口自动化23-token参数关联登录(登录拉勾网)的相关文章

python接口自动化6-参数化关联

前言 接口中我们经常需要用到参数关联,比如,登录token,需要传给后面的参数使用,又比如要查看某个商品需要将商品的id传入下一个接口使用. 等等,所以我们必要学会 re 正则获取,或者返回json获取,个人认为 re 挺实用的. 一.禅道-操作关闭需求为实例 1.手工操作抓包,可以看到下图一个 uid 每次操作关闭需求都会不一样,即为动态参数.那我们怎样知道这个 uid 在哪里获取呢? 2.查看上一个接口中,不难发现其 uid 就在上一个接口中. 3.既然知道了 uid 在上一个接口中,那么我

python接口自动化10-token登录

前言 有些登录不是用cookie来验证的,是用token参数来判断是否登录. token传参有两种一种是放在请求头里,本质上是跟cookie是一样的,只是换个单词而已:另外一种是在url请求参数里,这种更直观. 一.登录返回token 1.如下图的这个登录,无cookies 2.但是登录成功后有返回token 二.请求头带token 1.登录成功后继续操作其它页面,发现post请求的请求头,都会带token参数 2.这种请求其实比cookie更简单,直接把登录后的token放到头部就行 三.to

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

前言 我们用自动化发帖之后,要想接着对这篇帖子操作,那就需要用参数关联了,发帖之后会有一个帖子的id,获取到这个id,继续操作传这个帖子id就可以了 一.删除草稿箱 1.我们前面讲过登录后保存草稿箱,那可以继续接着操作:删除刚才保存的草稿 2.用fiddler抓包,抓到删除帖子的请求,从抓包结果可以看出,传的json参数是postId 3.这个postId哪里来的呢?可以看上个请求url地址 4.也就是说保存草稿箱成功之后,重定向一个url地址,里面带有postId这个参数.那接下来我们提取出来

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

前言 有些登录的接口会有验证码:短信验证码,图形验证码等,这种登录的话验证码参数可以从后台获取的(或者查数据库最直接). 获取不到也没关系,可以通过添加cookie的方式绕过验证码. 一.抓登录cookie 1.登录后会生成一个已登录状态的cookie,那么只需要直接把这个值添加到cookies里面就可以了. 2.可以先手动登录一次,然后抓取这个cookie,这里就需要用抓包工具fiddler了 3.先打开博客园登录界面,手动输入账号和密码(勾选下次自动登录) 4.打开fiddler抓包工具,刷

python接口自动化8-参数化

前言 前面一篇实现了参数的关联,那种只是记流水账的完成功能,不便于维护,也没什么可读性,接下来这篇可以把每一个动作写成一个函数,这样更方便了. 参数化的思维只需记住一点:不要写死 一.登录函数 1.s参数是session的一个实例类,先放这里,方便写后面代码 2.登录函数传三个参数,s是需要调用前面的session类,所以必传,可以传个登录的url,然后payload是账号和密码 二.保存草稿 1.编辑内容的标题title和正文body_data参数化了,这样后面可以方便传不同值 2.这里返回了

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

前言 发送post的请求参考例子很简单,实际遇到的情况却是很复杂的,首先第一个post请求肯定是登录了,但登录是最难处理的.登录问题解决了,后面都简单了. 一.查看官方文档 1.学习一个新的模块,其实不用去百度什么的,直接用help函数就能查看相关注释和案例内容. >>import requests >>help(requests) 2.查看python发送get和post请求的案例 >>> import requests       >>> r

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

前言 有些post的请求参数是json格式的,这个前面第二篇post请求里面提到过,需要导入json模块处理. 一般常见的接口返回数据也是json格式的,我们在做判断时候,往往只需要提取其中几个关键的参数就行,这时候就需要json来解析返回的数据了. 一.json模块简介 1.Json简介:Json,全名 JavaScript Object Notation,是一种轻量级的数据交换格式,常用于http请求中 2.可以用help(json),查看对应的源码注释内容 Encoding basic P

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

前言 某屌丝男A鼓起勇气向女神B打电话表白,女神B是个心机婊觉得屌丝男A是好人,不想直接拒绝于是设置呼叫转移给闺蜜C了,最终屌丝男A和女神闺蜜C表白成功了,这种场景其实就是重定向了. 一.重定向 1. (Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置,从地址A跳转到地址B了. 2.重定向状态码: --301 redirect: 301 代表永久性转移(Permanently Moved) --302 redirect: 302 代表暂时性转移(Temporarily M

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

前言 上一篇模拟登录博客园,但这只是第一步,一般登录后,还会有其它的操作,如发帖,评论等,这时候如何保持会话呢? 一.session简介 1.查看帮助文档,贴了一部分,后面省略了 >>import requests>>help(requests.session()) class Session(SessionRedirectMixin) |  A Requests session. |   |  Provides cookie persistence, connection-poo

2020年第二期《python接口自动化+测试开发》课程,预售!

2020年第二期<python接口自动化+python测试开发>课程,12月15号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学,方便交流 本期上课时间:12月15号-3月29号,每周六.周日晚上20:30-22:30 报名费:报名费3000一人(周期3个月) 联系QQ:283340479 课表如下 课程主要涉及的内容: 1.fiddler抓包与接口测试(测试基础必备) 2.python+pytest框架实现接口自动化测试(pytest框架甩unittest几条街) 3.httpr