Selenium:实现设置cookie免登录(QQ邮箱为例)

本文介绍了如何在Python环境下,利用Selenium 4.0库实现QQ邮箱的免登录功能。首先,需要手动登录并使用EditThisCookie插件获取Cookie。然后,将获取的Cookie通过Selenium的add_cookie()方法添加到浏览器中。在操作过程中可能会遇到NameError和AssertionError,错误原因分别是Cookie中的false和true未转换为Python的False和True,以及SameSite属性值不正确。解决方案分别是对Cookie字符串进行替换和修改SameSite属性值。
部署运行你感兴趣的模型镜像

使用环境

  • Python:3.9.1
  • Selenium:4.0
  • Chrome:94.0.4606.61
  • Windows 10

操作步骤

  1. 获取账号cookie

    1. 手动打开页面登录后,再通过谷歌插件EditThisCookie来快速获取

    2. EditThisCookie官网:https://www.editthiscookie.com/

    3. EditThisCookie下载:https://download.youkuaiyun.com/download/qq_21238607/33237729
      在这里插入图片描述

  2. 通过add_cookie()方法添加cookie代码示例

    import time
    from selenium import webdriver
    
    
    url = 'https://mail.qq.com/'
    
    # 粘贴通过EditThisCookie获取的页面cookie信息
    cookies = "粘贴复制的网站cookie"	# cookie结构:[{},{},{},{},...]
    
    driver = webdriver.Chrome()
    driver.get(url)
    time.sleep(3)
    
    # 通过add_cookie方法添加cookie
    for cookie in cookies:
        driver.add_cookie(cookie)
    
    time.sleep(3)
    driver.refresh()    # 刷新页面验证是否登录成功
    

常见问题

  1. 问题报错:NameError: name ‘false’ is not defined

    问题原因:通过EditThisCookie复制的Cookie内false、true均为小写,使用Python的话,需要修改为:False、True即可

    解决办法:全量替换为:False、True即可

    # 示例:出错cookie
    {
        "domain": ".qq.com",
        "hostOnly": false,
        "httpOnly": false,
        "name": "video_bucketid",
        "path": "/",
        # "sameSite": "unspecified",
        "secure": false,
        "session": true,
        "storeId": "0",
        "value": "4",
        "id": 49
    }
    
    # 修改False、True即可
    {
        "domain": ".qq.com",
        "hostOnly": False,
        "httpOnly": False,
        "name": "video_bucketid",
        "path": "/",
        # "sameSite": "unspecified",
        "secure": False,
        "session": True,
        "storeId": "0",
        "value": "4",
        "id": 49
    }
    
  2. 问题报错:assert cookie_dict[‘sameSite’] in [‘Strict’, ‘Lax’, ‘None’] AssertionError
    问题原因:Cookie 的SameSite属性用来限制第三方 Cookie,从而减少安全风险,它可以这只三个值:‘Strict’, ‘Lax’, ‘None’,早期的Selenium版本也是不支持Cookie添加SameSite属性,如果添加,则会直接抛出异常,言归正传,我们可以通过查看复制的Cookie看出,QQ邮箱得到Cookie内的SameSite值为:unspecified,所以才会导致断言失败。

    解决办法:1. 注释cookie内全部SameSite属性 2. 修改Cookie内全部SameSite属性值为:‘Strict’, ‘Lax’, 'None’即可

    # 示例cookie
    {
        "domain": ".qq.com",
        "hostOnly": False,
        "httpOnly": False,
        "name": "video_bucketid",
        "path": "/",
        "sameSite": "unspecified",	# 注释该行,或修改值为:‘Strict', 'Lax', 'None'
        "secure": False,
        "session": True,
        "storeId": "0",
        "value": "4",
        "id": 49
    }
    
    # add_cookie源码
    def add_cookie(self, cookie_dict) -> None:
        """
            Adds a cookie to your current session.
    
            :Args:
             - cookie_dict: A dictionary object, with required keys - "name" and "value";
                optional keys - "path", "domain", "secure", "expiry", "sameSite"
    
            Usage:
                driver.add_cookie({'name' : 'foo', 'value' : 'bar'})
                driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/'})
                driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/', 'secure':True})
                driver.add_cookie({'name': 'foo', 'value': 'bar', 'sameSite': 'Strict'})
    
            """
        if 'sameSite' in cookie_dict:
            assert cookie_dict['sameSite'] in ['Strict', 'Lax', 'None']
            self.execute(Command.ADD_COOKIE, {'cookie': cookie_dict})
            else:
                self.execute(Command.ADD_COOKIE, {'cookie': cookie_dict})
    

参考链接

  • Cookie 的 SameSite 属性:https://www.ruanyifeng.com/blog/2019/09/cookie-samesite.html

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值