• selenium 添加cookie和token


    1、WebDriver相关的Cookies操作

    • get_cookies(): 获取当前会话中当前域名所有cookies
    • get_cookie(name): 获取当前会话中当前域名指定name对应的cookie值
    • delete_cookie(name): 删除指定cookie
    • delete_all_cookies(): 删除所有cookie
    • add_cookie(self, cookie_dict): 添加cookie

      1.1、添加Cookie时需要逐条添加,cookie_dict示例:

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

    2、如何添加cookie实现绕过登录

    以百度为例

    1. 我们先登录百度为例,通过F12查看应用程序(Application),BDUSS就是cookie。
     

    从图中可以找出:name= "BDUSS",value = "3R-T21PamZseEJmLVlmQ1ZNS2ZRQ3VPeUJE"

    构造cookie字典

    cookie = {'name' : 'BDUSS', 'value' : '3R-T21PamZseEJmLVlmQ1ZNS2ZRQ3VPeUJEVUtXUE**'}

    然后调用:driver.add_cookie(cookie_dict=cookie)

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.maximize_window()
    time.sleep(1)
    cookie = {"name":"BDUSS", "value":"3R-T21PamZseEJmLVlmQ1ZNS2ZRQ3VPeUJEVUtXUEoxUkx2ODVTZ1REZmczOVZmSVFBQUFBJCQAAAAAAAAAAAEAAAA1p7iuyeTI1WluZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBSrl~gUq5fb"}
    
    
    driver.add_cookie(cookie_dict=cookie)
    driver.get("https://www.baidu.com/")
    
    time.sleep(10)
    driver.quit()
    Traceback (most recent call last):
    
    File "I:/python/softwaredate/py_basics/1****/14 selenium cookie绕过登录.py", line 10, in <module>
    ​ driver.add_cookie(cookie_dict=cookie)
    File "D:\software\python38\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 894, in add_cookie
    ​ self.execute(Command.ADD_COOKIE, {'cookie': cookie_dict})
    File "D:\software\python38\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    ​ self.error_handler.check_response(response)
    File "D:\software\python38\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    ​ raise exception_class(message, screen, stacktrace)
    selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain
    (Session info: chrome=85.0.4183.102)**

    如发现如上报错怎么解决呢:
    只需要在添加cookie上方增加一个打开网页的地址即可

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.maximize_window()
    time.sleep(1)
    cookie = {"name":"BDUSS", "value":"3R-T21PamZseEJmLVlmQ1ZNS2ZRQ3VPeUJEVUtXUEoxUkx2ODVTZ1REZmczOVZmSVFBQUFBJCQAAAAAAAAAAAEAAAA1p7iuyeTI1WluZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBSrl~gUq5fb"}
    
    driver.get("https://www.baidu.com/")  #添加这一行即可
    driver.add_cookie(cookie_dict=cookie)
    driver.get("https://www.baidu.com/")
    
    time.sleep(10)
    driver.quit()

    上面的方式就可以实现绕过登录,不过这要注意以下两点:

    • 生成 cookie 的账号不能有退出操作,否则 cookie 会失效。
    • 注意 cookie 的有效期(Expires/Max-Age列),可能需要定时更新 cookie

    3、接口登录获取cookie,构造成cookie_dict添加到add_cookie

    import requests
    from selenium import webdriver
    from time import sleep
    
    def get_cookie(username, password):
        login_url = 'http://****/newecshop/admin/privilege.php'
        data = dict(username=username,password=password, act='signin')
        res = requests.post(login_url, data=data, allow_redirects=False)
        esscp_id = res.cookies.get('ECSCP_ID')
        cookie = dict(name='ECSCP_ID',value=esscp_id)
        return cookie
    
    admin_url = 'http://****/newecshop/admin/index.php'
    
    driver = webdriver.Chrome()
    driver.get(admin_url)  
    cookie = get_cookie(****, ****)
    driver.add_cookie(cookie)
    driver.get('http://***/newecshop/admin/order.php?act=list')
    
    sleep(3)
    driver.quit()

    4、 启动 Chrome 浏览器绕过登录

    我们每次打开浏览器做相应操作时,对应的缓存和 cookie 会保存到浏览器默认的路径下,我们先查看个人资料路径,以 chrome 为例,我们在地址栏输入chrome://version/

     

     

    图中的个人资料路径就是我们需要的,我们去掉后面的 \Default,然后在路径前加上「–user-data-dir=」就拼接出我们要的路径了。

    profile_directory = r'--user-data-dir=C:\Users\xxx\AppData\Local\Google\Chrome\User Data'

    接下来,我们启动浏览器的时候采用带选项时的启动,这种方式启动浏览器需要注意,运行代码前需要关闭所有的正在运行 chrome 程序,不然会报错。全部代码如下。

    from selenium import webdriver
    import time
    import os,platform
    if platform.system() =="Windows":
        os.system("taskkill -im chrome* -f")  # 把chrome开头的进程都杀掉
    else:
        os.system("killall -9 chrome*")
    # 获取用户目录
    my_dir = os.path.expanduser("~")
    
    profile_directory = r'--user-data-dir={}\AppData\Local\Google\Chrome\User Data'.format(my_dir)
    print(profile_directory)
    option = webdriver.ChromeOptions()
    option.add_argument(profile_directory)
    
    driver = webdriver.Chrome(chrome_options=option)
    driver.get("https://www.baidu.com/")
    time.sleep(2)

    selenium 自动化启动浏览器后我们会发现我之前保存的书签完整在浏览器上方,baidu 账号也是登录的状态。

     

     

    5、绕过图形验证码的网站

    文中第一个图是简书登录时的图形验证码,我们登录简书后(cookie 有一定的时效,貌似有 10 天半个月左右),把上面代码中的链接换成简书的,再用上面的方法觉可以实现绕过登录页的图形验证码。



    原文链接:
    链接:https://www.jianshu.com/p/d442a3cbef3a

  • 相关阅读:
    Echarts数据可视化grid直角坐标系(xAxis、yAxis)
    Cannot find module '@babel/plugin-proposal-class-properties'
    git 基本操作
    React报错:Laravel React-Router browserHistory 刷新子页面报错404
    php报错:Notice: iconv(): Wrong charset, conversion from `GBK' to `UTF8' is not allowed
    Larval报错:后台上传图片,storage目录也有相应的图片,但前台访问不到图片。
    Laravel报错:1071 Specified key was too long; max key length is 1000 bytes
    thinkcmf报错:fileowner(): stat failed for /sys
    vbox虚拟机复制&&虚拟机指定静态IP
    thinkcmf在万网上部署
  • 原文地址:https://www.cnblogs.com/superbaby11/p/15737539.html
Copyright © 2020-2023  润新知