• web自动化-绕过登录


    两个方法:

    1、常用的方法: 第一种方法是登录后查看网站的 cookie,请求 url 的时候把 cookie 带上(缺点是:cookie有时间限制。优点:简单,方便)

    2、添加cookies的方式:思路是:先对比登录前和登录后的cookies区别,查看登录后cookies里那些值是多出来的,然后通过添加cookies的方式,将值添加进去;这样就可以达到跳过登录的效果。(缺点:逻辑性比较复杂,代码量多。优点:可以保证每次cookies都是有效的)

     具体操作步骤:

      1、通过抓包工具,分享登录前与登录后的cookies信息

      

      2、通过不同的方式,需要添加到cookies里的值(重点:怎么去动态获取这些值)

    class DictJson:
        @staticmethod
        def case_ins_dict_json(username, password):
            # CaseInsensitiveDict 也是一种字典抽象类。转字典
            # 获取时间
            h_data = UserLogin().pc_user_login(username=username, password=password)[0]
            headers_data = dict(h_data)
            set_cookie = headers_data['Set-Cookie']
            c = set_cookie.split(';')[2]
            expires = c.split('=')[1]
            ans_time = int(time.mktime(time.strptime(expires, '%a, %d-%b-%Y %H:%M:%S %Z')))
    
            # 获取user_ticket
            c_data = UserLogin().pc_user_login(username=username, password=password)[1]
            a = dict(c_data)['cookies']
            user_ticket = a.split('"')[11]
            return ans_time, user_ticket
    

      

    CaseInsensitiveDict:

    可知,CaseInsensitiveDict是从MutableMapping派生的,即其父类是MutableMapping,中文名叫“可变映射”,那么这个MutableMapping到底是何方神圣?

    从Python3的官方文档中可以找到它,具体在 8.4. collections.abc — Abstract Base Classes for Containers中可以找到它的定义

    | ABC | Inherits from | Abstract Methods | Mixin Methods | | -------------- | ------------- | -------------------------------------------------------- | ------------------------------------------------------------ | | MutableMapping | Mapping | getitem, setitem, delitem, iter, len | Inherited Mapping methods and pop, popitem, clear, update, and setdefault |

    我们可以简单的认为,这是一个字典抽象类,你只要自己实现了其中的getitem, setitem, delitem, iter, len方法即可实现一个自己的字典,而CaseInsensitiveDict正是基于此构造了自己的数据结构。

    split():   Python split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串 ---------https://www.runoob.com/python/att-string-split.html

    time.strptime() : Python time strptime() 函数根据指定的格式把一个时间字符串解析为时间元组。------------------https://www.runoob.com/python/att-time-strptime.html

      3、将获取到的值,添加到cookies里

    class GetLogin:
        def __init__(self, driver):
            self.dr = driver
            # 读取url
    
        def cookie_login(self, url, username, password):
            """带cookie登录绕过验证码"""
            # 获取user_ticket
            user_ticket = DictJson().case_ins_dict_json(username=username, password=password)[1]
            # 获取时间戳
            expiry_time = DictJson().case_ins_dict_json(username=username, password=password)[0]
            time.sleep(2)
            # 打开浏览器
            GetBrowser(driver=self.dr).open_browser(url=url)
    
            # 添加cookie
            c_ticket = {
                'domain': '.veryeast.cn',
                'expiry': expiry_time,
                'httpOnly': False,
                'path': '/',
                'secure': False,
                'name': 'ticket',
                'value': user_ticket
            }
            c_name = {
                'domain': '.veryeast.cn',
                'expiry': expiry_time,
                'httpOnly': False,
                'path': '/',
                'secure': False,
                'name': 'username',
                'value': username
            }
            c_user_type = {
                'domain': '.veryeast.cn',
                'expiry': expiry_time,
                'httpOnly': False,
                'path': '/',
                'secure': False,
                'name': 'user_type',
                'value': '2'
            }
    
            GetBrowser(driver=self.dr).add_cookies(cookie=c_ticket)
            GetBrowser(driver=self.dr).add_cookies(cookie=c_name)
            GetBrowser(driver=self.dr).add_cookies(cookie=c_user_type)
    
            # 等待3S
            time.sleep(3)
            # 刷新页面
            GetBrowser(driver=self.dr).refresh_browser()

      4、刷新页面,即可实现登录

      

  • 相关阅读:
    python加载csv数据
    Android项目依赖库管理方式简介
    Android PhotoView基本功能实现
    Android ListView的header footer设置visibility gone不起作用
    [干货][EMIT]千行代码实现代理式AOP+属性的自动装配
    Emit实现DataRow转化成强类型的T
    有关docker新版的icc、iptables的一个巨坑
    Mac神器Iterm2的Shell Integration的用法和注意事项
    生成ssl证书文件
    python3 module中__init__.py的需要注意的地方
  • 原文地址:https://www.cnblogs.com/zack-dong/p/13159934.html
Copyright © 2020-2023  润新知