Cookie 免密登錄了解一下

我們都知道 HTTP 是無狀態(tài)的赤兴,用戶每次打開 web 頁面時横漏,服務(wù)器都打開新的會話抠艾,而且服務(wù)器也不會自動維護客戶的上下文信息纫塌,那么服務(wù)器是怎么識別用戶的呢诊县?

這就是本文的主要內(nèi)容,當服務(wù)端需要記錄用戶的狀態(tài)時措左,就需要用某種機制來識具體的用戶依痊,這個機制就是 session 和 cookie

Session 和 Cookie

session 是保存在服務(wù)器端的,用于標識用戶怎披,并且跟蹤用戶的一種上下文保持機制胸嘁。當服務(wù)器創(chuàng)建了一個 Session 時瓶摆,給客戶端發(fā)送的響應(yīng)報文包含了 Set-Cookie 字段,其中有一個名為 sid 的鍵值對性宏,這個鍵值對就是 Session ID赏壹。客戶端收到后就把 Cookie 保存在瀏覽器中衔沼,并且之后發(fā)送的請求報文都包含 Session ID

Cookie 由服務(wù)器生成蝌借,發(fā)送給瀏覽器,瀏覽器把 Cookie 以 kv 形式保存到某個目錄下的文本文件內(nèi)指蚁。是客戶端保存用戶信息的一種機制菩佑,用來記錄用戶的一些信息,它是實現(xiàn) Session 的一種方式凝化。

瀏覽器會根據(jù)響應(yīng)報文里的一個叫做 Set-Cookie 的首部字段信息稍坯,將其保存在本地。

當下一次請求時會把該 Cookie 發(fā)送給服務(wù)器搓劫,之后服務(wù)端發(fā)現(xiàn)客戶端發(fā)送過來的 Cookie 后瞧哟,會檢查是那個客戶端發(fā)送過來的請求,然后對服務(wù)器上的記錄枪向,最后得到了之前的狀態(tài)信息勤揩。

我們經(jīng)常看到登錄的時候秘蛔,有個下次自動登錄的選項陨亡,就是根據(jù)這個原理來實現(xiàn)的。
既然瀏覽器能實現(xiàn)免密登錄的功能深员,那么我們用代碼如何來實現(xiàn)呢?
這里有兩個登錄案例负蠕,看完之后你就知道如何實現(xiàn)了。

案例一:豆瓣登錄

在這里我們使用 Python 中的 LWPCookieJar 倦畅,它是管理 cookie 的工具遮糖,可以將 cookie 保存到文件,在文件中讀取本地 cookie 數(shù)據(jù)到程序中叠赐,一般用到以下兩種方法:

源碼
  1. 將登錄成功的 cookie 寫入到本地文件
# 實例化一個 LWPCookieJar 對象欲账,并設(shè)置保存 cookie 的文件
session = requests.session()
session.cookies = LWPCookieJar(filename='DouBanCookies.txt')

在使用代碼登錄成功之后,使用 session.save() 將自動將 cookie 寫入到設(shè)置的 cookie 文件中

def login():
    name = input("輸入賬戶:")
    password = input("輸入密碼:")
    url = "https://accounts.douban.com/j/mobile/login/basic"
    data = {
        "ck": "",
        "name": name,
        "password": password,
        "remember": "True",
        "ticket": "",
    }
    response = session.post(url, data=data)
    print(response.text)
    session.cookies.save()  # 保存 cookie

寫入之后燎悍,會在當前目錄生成 DouBanCookies.txt 的文件敬惦,如下圖所示:

  1. 直接使用該文件中的 cookie 實現(xiàn)免密碼登錄

直接使用 load 方法,從文件中獲取 cookie 到代碼中谈山。其中 load 方法有兩個可選值俄删,ignore_discard 主要是忽略關(guān)閉瀏覽器丟失, ignore_expires 是忽略 cookie 失效〕胍可根據(jù)自己的實際場景自由選擇臊诊。

session.cookies.load(ignore_discard=True)

使用 cookie 登錄之后,可以自主驗證一下是否登錄成功斜脂。一般選擇訪問個人主頁抓艳,查看響應(yīng)內(nèi)容,判讀是否登錄成功帚戳。完整代碼如下:

# coding: utf-8
import requests
from scrapy import Selector
from http.cookiejar import LWPCookieJar

session = requests.session()
headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
    }
session.headers = headers
session.cookies = LWPCookieJar(filename='DouBanCookies.txt')  # 實例化一個LWPCookieJar對象

def login():
    name = input("輸入賬戶:")
    password = input("輸入密碼:")
    url = "https://accounts.douban.com/j/mobile/login/basic"
    data = {
        "ck": "",
        "name": name,
        "password": password,
        "remember": "True",
        "ticket": "",
    }
    response = session.post(url, data=data)
    print(response.text)
    session.cookies.save()
    verify_login()

def verify_login():
    mine_url = "https://www.douban.com/mine/"
    mine_response = session.get(mine_url)
    selector = Selector(text=mine_response.text)
    user_name = selector.css(".info h1 ::text").extract_first("")
    print(f"豆瓣用戶名:{user_name.strip()}")



def cookie_login():
    try:
        # 從文件中加載cookies(LWP格式)
        session.cookies.load(ignore_discard=True)
        print(session.cookies)
    except Exception:
        print("Cookies未能加載玷或,使用密碼登錄")
        login()

    else:
        verify_login()

if __name__ == "__main__":
    cookie_login()

案例二:新榜登錄

除了使用 Python 中自帶的 cookie 管理工具之外,我們還可以自己創(chuàng)建 cookie 文件片任,寫入到本地文件或者 Redis 中偏友。

例如,新榜的登錄对供,通過我的測試發(fā)現(xiàn)位他,主要是校驗 token 和用戶名這兩個參數(shù)。而 token 在登錄成功后产场,可以在響應(yīng)內(nèi)容中找到鹅髓。那么我們就可以自己創(chuàng)建 cookie 文件,一般是 .txt 或者.json 文件京景。

 cookies = {
        "name": self.account,
         "token": token,
         "useLoginAccount": "true"
         }
with open("XinBangCookies.txt", 'w')as f:  # 將cookies保存到本地
    f.write(str(cookies))

然后讀取 cookie 加載到代碼中

with open("XinBangCookies.txt", "r")as f:
    cookies = f.read()
cookies = eval(cookies)
cookie = "; ".join((key + "=" + value) for key, value in cookies.items())
self.session.headers.update({"Cookie": cookie})

使用本地 cookie 登錄后窿冯,可以選擇訪問登錄之后才能訪問的地址進行驗證,具體代碼就不貼了醋粟,邏輯和上面的案例差不多靡菇,只是處理方法不一樣。

總結(jié)

本文主要是介紹 session 和 cookie 的一些基本概念米愿,以及兩者之間的區(qū)別。同時給大伙介紹了兩種用代碼處理 cookie 的案例鼻吮,這里要注意一下 cookie 存在時效性育苟,如果失效了需要重新用密碼登錄。感興趣的朋友可以根據(jù)以上兩個案例去練練手噢椎木。如果覺得本文不錯违柏,請幫忙點個贊唄~~

公眾號: Python編程與實戰(zhàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市香椎,隨后出現(xiàn)的幾起案子漱竖,更是在濱河造成了極大的恐慌,老刑警劉巖畜伐,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馍惹,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機万矾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門悼吱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人良狈,你說我怎么就攤上這事后添。” “怎么了薪丁?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵遇西,是天一觀的道長。 經(jīng)常有香客問我严嗜,道長粱檀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任阻问,我火速辦了婚禮梧税,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘称近。我一直安慰自己第队,他們只是感情好,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布刨秆。 她就那樣靜靜地躺著凳谦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪衡未。 梳的紋絲不亂的頭發(fā)上尸执,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音缓醋,去河邊找鬼如失。 笑死,一個胖子當著我的面吹牛送粱,可吹牛的內(nèi)容都是我干的褪贵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼抗俄,長吁一口氣:“原來是場噩夢啊……” “哼脆丁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起动雹,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤槽卫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后胰蝠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歼培,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡震蒋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了丐怯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喷好。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖读跷,靈堂內(nèi)的尸體忽然破棺而出梗搅,到底是詐尸還是另有隱情,我是刑警寧澤效览,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布无切,位于F島的核電站,受9級特大地震影響丐枉,放射性物質(zhì)發(fā)生泄漏哆键。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一瘦锹、第九天 我趴在偏房一處隱蔽的房頂上張望籍嘹。 院中可真熱鬧,春花似錦弯院、人聲如沸辱士。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颂碘。三九已至,卻和暖如春椅挣,著一層夾襖步出監(jiān)牢的瞬間头岔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工鼠证, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留峡竣,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓量九,卻偏偏與公主長得像澎胡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子娩鹉,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容