1. 程式人生 > 其它 >selenium 新增cookie和token

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