Python Selenium Cookie 繞過驗證碼實現登錄


Python Selenium Cookie 繞過驗證碼實現登錄

 

之前介紹過博客園的通過cookie 繞過驗證碼實現登錄的方法。這里並不多余,會增加分析和另外一種方法實現登錄。

 

 

1、思路介紹

 

1.1、直接看代碼,內有詳細注釋說明

 

# FileName : Wm_Cookie_Login.py
# Author   : Adil
# DateTime : 2018/3/20 19:47
# SoftWare : PyCharm

from selenium import webdriver

import time

url = 'https://system.address'


def login():
    '''先定義一個正常登錄的方法,獲取登錄前和登錄后的cookie'''

    driver = webdriver.Chrome()

    driver.get(url)
    driver.maximize_window()
    cookieBefore = driver.get_cookies()
    # 打印登錄前的cookie
    print(cookieBefore)
    time.sleep(2)
    driver.find_element_by_id("new-username").clear()
    driver.find_element_by_id("new-username").send_keys("username")
    driver.implicitly_wait(5)
    driver.find_element_by_id("new-password").clear()
    driver.find_element_by_id("new-password").send_keys("password")
    driver.find_element_by_id('home-right-login').click()
    driver.implicitly_wait(5)
    # 加一個休眠,這樣得到的cookie 才是登錄后的cookie,否則可能打印的還是登錄前的cookie
    time.sleep(5)
    print("登錄后!")
    cookiesAfter = driver.get_cookies()
    print("cookiesAfter:")
    print(cookiesAfter)
    # cookie 存放到了list,其中是dict
    # 對比發現登錄后的cookie比登錄前多了4個dict。
    # 如下代碼分別是  1、4 、7、 8 
    len1 = len(cookiesAfter)
    print("len:%d" %len1)
    cookie1 = cookiesAfter[0]
    cookie2 = cookiesAfter[3]
    cookie3 = cookiesAfter[-2]
    cookie4 = cookiesAfter[-1]
    print("cookie1:%s" %cookie1)
    print("cookie2:%s" %cookie2)
    print("cookie3:%s" %cookie3)
    print("cookie4:%s" %cookie4)
    driver.quit()
    # 將獲取的這四個cookie作為參數,傳遞給,使用cookie登錄的函數,如下
    cookieLogin(cookie1,cookie2,cookie3,cookie4)
def cookieLogin(cookie1,cookie2,cookie3,cookie4):
    print("+++++++++++++++++++++++++")
    print("cookieLogin")
    print("cookie2:%s" % cookie2)
    print("cookie4:%s" % cookie4)
    driver = webdriver.Chrome()
    driver.maximize_window()
    # 清除一下cookie
    driver.delete_all_cookies()
    time.sleep(3)
    driver.get(url)
    # 打開瀏覽器后添加訪問地址后,添加cookie
    driver.add_cookie(cookie1)
    driver.add_cookie(cookie2)
    driver.add_cookie(cookie3)
    driver.add_cookie(cookie4)
    print("cookies")
    # 打印一下cookie,與上面正常登錄的cookie對比一下
    print(driver.get_cookies())
    time.sleep(5)
    # 刷新頁面,可以看到已經是登錄狀態了,至此完成的使用cookie 的登錄。
    driver.refresh()
    time.sleep(5)
    driver.quit()


if __name__ == "__main__":

    login()

 

1.2、代碼介紹

 

如圖,可以查看到登錄前與登錄后的cookie,將其拷貝出來,進行對比

 

 如圖,對比可以,登錄后多余四個cookie

 

查看多余cookie的位置,是list 的1、4、7、8g額元素,所以將其取出,作為參數給cookie登錄函數。

 

注意:該實例介紹的是無驗證碼登錄操作,但思路是一樣的。而這個demo ,僅僅是為了介紹一下使用cookie 登錄的思路,具體項目應用中,這樣是很不方便的。

 

2、繞過驗證碼登錄實戰

接下來,介紹含有驗證碼的登錄,當然cookie處理的思路與上介紹的基本一樣

 

這里增加了幾點內容:

  a、先首次使用驗證碼正確登錄並保存登錄前、后的cookie,對比分析cookie,篩選有用的cookie

  b、將cookie 寫到yaml 文件中,方便后續使用cookie登錄時直接使用,而不需像上面介紹的那樣,每次都需要先正常登錄一樣。

  c、使用cookie登錄時,從yaml文件中讀取對應cookie即可。注意:Yaml 文件操作詳見: Python Yaml 學習 ,有詳細介紹yaml的讀寫操作。

  注意:這里介紹的是先手動輸入驗證碼正確登錄后獲取cookie。實際應用中可以使用其他方式獲取cookie

  如:1、之前介紹的博客園登錄實例:Python - Cookie繞過驗證碼登錄  使用fiddler,查看cookie

    2、使用瀏覽器查看cookie 如,借助chrome 插件如下圖,導出cookie進行分析。

 

 思路如上,代碼如下:

 2.1、正常登錄獲取有效cookie

# FileName : getLoginCookie.py
# Author   : Adil
# DateTime : 2018/3/20 21:43
# SoftWare : PyCharm
import yaml,time,os
from selenium import webdriver
url = 'https://system.address'
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()
time.sleep(2)
driver.find_element_by_id("username").clear()
driver.find_element_by_id("username").send_keys("username")
driver.implicitly_wait(5)
driver.find_element_by_id("password").clear()
driver.find_element_by_id("password").send_keys("password")
print("請輸入驗證碼:")
# 手動輸入驗證碼
security_code = input()
time.sleep(1)
driver.find_element_by_id("security_code").send_keys(security_code)
time.sleep(1)
driver.find_element_by_id('sign_btn').click()
driver.implicitly_wait(5)
# 加一個休眠,這樣得到的cookie 才是登錄后的cookie,否則可能打印的還是登錄前的cookie
time.sleep(5)
cookiesAfter = driver.get_cookies()
len1 = len(cookiesAfter)
# 已經知道需要第幾個cookie,這里需要第3個cookie,所以選擇cookie下標為2
cookie1 = cookiesAfter[2]
# 獲取當前文件所在路徑
fileNamePath = os.path.split(os.path.realpath(__file__))[0]
# 拼接config.yaml文件絕對路徑
yamlPath = os.path.join(fileNamePath,'config.yaml')
# 以覆蓋寫入打開文件
fw = open(yamlPath,'w',encoding='utf-8')
# 構建數據
data = {"cookie1":cookie1}
# 裝載寫入yaml文件。
yaml.dump(data,fw)

driver.quit()

 

 2.2、讀取cookie配置文件,使用cookie登錄系統

 

 

# FileName : stlUseCookieLogin.py
# Author   : Adil
# DateTime : 2018/3/20 21:48
# SoftWare : PyCharm
from selenium import webdriver
import time,yaml,os
url = 'https://system.address'
driver = webdriver.Chrome()
driver.maximize_window()
driver.delete_all_cookies()
time.sleep(3)
driver.get(url)

fileNamePath = os.path.split(os.path.realpath(__file__))[0]
yamlPath = os.path.join(fileNamePath,'config.yaml')
# 讀取yaml 文件
f = open(yamlPath,'r',encoding='utf-8')
cont = f.read()
conf = yaml.load(cont)
# 讀取cookie值
cookie1 = conf.get("cookie1")
# 添加cookie
driver.add_cookie(cookie1)
print("cookies")
print(driver.get_cookies())
time.sleep(5)
# 這里重新獲取地址,因為有些系統,未登錄狀態,鏈接會跳轉,這里就是,登錄狀態后,才能正確打開指定網址,所以這里要再次指定網址。
driver.get(url)
# 刷新查看登錄狀態
driver.refresh()
time.sleep(5)
driver.quit()

 

 

以上應該算是已經詳細的介紹了使用cookie 登錄的思路了。有什么問題可以加群溝通,或是關注微信公眾號,進行溝通。希望對大家有所幫助。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM