cookie繞過驗證碼登錄操作


Requests方法 -- cookie繞過驗證碼登錄操作

前言
有些登錄的接口會有驗證碼:短信驗證碼,圖形驗證碼等,這種登錄的話驗證碼參數可以從后台獲取的(或者查數據庫最直接)。
獲取不到也沒關系,可以通過添加 cookie 的方式繞過驗證碼。

1、這里以登錄博客園為例。

a、抓取登錄的cookie,登錄后會生成一個已登錄狀態的cookie,那么只需要把這個值直接添加到cookies里面就可以

b、這里用Fiddler抓包工具進行,先手動登錄一次,然后抓取cookie

c、打開 fiddler 抓包工具,刷新下登錄首頁,就是登錄前的 cookie 了

img

d、登錄成功后,再查看 cookie 變化,發現多了兩組參數,多的這兩組參數就是我們想要的,copy 出來,一會有用

img

2、cookie結構

.用抓包工具 fidller 只能看到 cookie 的 name 和 value 兩個參數,實際上 cookie 還有其它參數的。

3、添加cookie

a、往 session 里面添加 cookie 可以用以下方式
b、set 里面參數按括號里面的參數格式

coo = requests.cookies.RequestsCookieJar()
coo.set('cookie-name', 'cookie-value', path='/', domain='.xxx.com')
s.cookies.update(c)
c、於是添加登錄的 cookie,把第一步 fiddler 抓到的內容填進去就可以了
c = requests.cookies.RequestsCookieJar()
c.set('.CNBlogsCookie', 'xxx')
c.set('.Cnblogs.AspNetCore.Cookies','xxx')
s.cookies.update(c)
print(s.cookies)

img

4、參考代碼

import requests
#禁用安全請求警告
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
"""
1.由於登錄時候是多加 2 個 cookie,我們可以先用 get 方法打開登錄首頁,獲取部分 cookie
2.再把登錄需要的 cookie 添加到 session 里
3.添加成功后,隨便編輯正文和標題保存到草稿箱
"""

# 先打開登錄首頁,獲取部分 cookie
url = "https://account.cnblogs.com/signin?returnurl=https%3A%2F%2Fwww.cnblogs.com%2F"

header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"
}

s = requests.Session()
r = s.get(url,headers=header)
print(r.cookies)

# 添加登錄需要的兩個 cookie
c = requests.cookies.RequestsCookieJar()
c.set(".Cnblogs.AspNetCore.Cookies","添加圖二的cookie")
c.set(".CNBlogsCookie","添加圖二的cookie")
# c.set('AlwaysCreateItemsAsActive',"True")
# c.set('AdminCookieAlwaysExpandAdvanced',"True")
s.cookies.update(c)
print(s.cookies)

# 登錄成功后保存編輯內容
r1 = s.get("https://i.cnblogs.com/EditPosts.aspx?opt=1", headers=header,verify=False)
print(r1.text)

# 保存草稿箱
url2 = "https://i.cnblogs.com/EditPosts.aspx?opt=1"
body = {
    "__VIEWSTATE":"",
    "__VIEWSTATEGENERATOR":"FE27D343",
    "Editor$Edit$txbTitle":"Hi,你好",
    "Editor$Edit$EditorBody":"<p>你們好嗎 ?</p><p>Are you ok ?</p>",
    "Editor$Edit$Advanced$ckbPublished":"on",
    "Editor$Edit$Advanced$chkDisplayHomePage":"on",
    "Editor$Edit$Advanced$chkComments":"on",
    "Editor$Edit$Advanced$chkMainSyndication":"on",
    "Editor$Edit$Advanced$txbEntryName":"",
    "Editor$Edit$Advanced$txbExcerpt":"",
    "Editor$Edit$Advanced$txbTag":"",
    "Editor$Edit$Advanced$tbEnryPassword":"",
    "Editor$Edit$lkbDraft":"存為草稿",
}

r2 = s.post(url2,data=body,verify=False)
print(r.content.decode("utf-8"))

5、執行后,刷新下草稿箱頁面,查看我的草稿箱是否有新增。

img

selenium-跳過登錄驗證碼

selenium最常見的就是登錄,但是登錄有個坑,就是驗證碼的問題,關於驗證碼一共四個辦法:

1.讓開發注釋掉驗證碼。

2.讓開發設置一個萬能驗證碼,只要輸入這個驗證碼,就通過。

3.跳過驗證碼直接登錄成功。

4.驗證碼識別技術。

第三條寫的很模糊,不過下面就介紹一下第三條的實現方法。

先說一下實現思路:

1.打開要測試的網頁,獲取登錄前的cookie(可以抓包獲取,可以代碼實現,下面會附上代碼)。

2.手動登錄,再獲取登錄后的cookie。

3.對比兩次獲取的cookie,找出登錄后多出來的cookie,只要多出來的name和value就行(一般name就是token)。

4.在代碼里加上寫入cookie,把找出來的name和value寫入。然后再寫一遍打開網頁的代碼。

下面放上代碼(不要着急復制代碼為自己所用,代碼后面會寫限制,有些登錄用這代碼也跳不過去,哈哈)。

#coding=utf-8
from selenium import webdriver
import time
#下面四行這么寫是去掉谷歌瀏覽器上面提示的,第二行和第三行分別對應不同的提示
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches",["ignore-certificate-errors"])
# options.add_argument('disable-infobars')
browser = webdriver.Chrome(chrome_options=options)
#
browser.maximize_window()
#打開火狐瀏覽器
# browser=webdriver.Firefox()
#輸入網址
browser.get("https://m.flycua.com/h5/#/")
#點擊登錄,用下面注釋的代碼獲取cookie,實現跳過登錄,執行腳本的時候就不用這部分了
# browser.find_element_by_id("su").click()
# cookie1= browser.get_cookies()
#打印登錄前的cookie
# print (cookie1)
#等待30秒,用這30秒時間完成登錄操作
# time.sleep(30)
#獲取登錄后的cookie
# cookie2= browser.get_cookies()
#打印登錄后的cookie
# print (cookie2)
#
#加入要獲取的cookie,寫進去
browser.add_cookie({'name':'tokenId', 'value':'8BB8FDD4FBB31F92424A7E0EBE872E01A4AF77654043DAD638E9F93B378F94E19A882A6C7E78999C9A5482985FDA333C3D1E5236C6BDA7935A89178F053FB490'})
#再次輸入網址
browser.get("https://m.flycua.com")

上面代碼包含了獲取cookie和實現跳過登錄的所有代碼,注釋部分一定要看清楚。(最早寫的是用的python2,后來又拿到python3的環境上執行,根據自己python版本,對腳本略作修改,應該只有print要修改)

然后我再說一下這代碼的局限性。

1.可以看出cookie里有tokenId,這個tokenId可以使用比較長的一段時間,前提是只執行這自動化腳本,不能再手動登錄。因為手動登錄又會產生一個新的tokenId,代碼需要更新。

2.如果某些網站打開直接就是登錄頁,那恐怕就跳不過登錄了,即使寫入cookie,第二次打開的網頁,仍然是登錄頁,即使寫了登錄后的網址。(我還見過更厲害的,登錄之前和登錄之后網址都不變)


免責聲明!

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



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