คุกกี้มีความซับซ้อนมากกว่าคู่คีย์-ค่าเพียงเล็กน้อย เบราว์เซอร์ยังต้องติดตามว่า URL ใดที่คุกกี้ใช้งานได้ (ผ่านกฎเกี่ยวกับชื่อโฮสต์ หมายเลขพอร์ต เส้นทาง URL และการเชื่อมต่อจะถูกเข้ารหัสหรือไม่) และระยะเวลาที่จะเก็บไว้ (หมดอายุ) คุกกี้บางตัวได้รับการออกแบบให้หมดอายุทันทีที่คุณปิดเบราว์เซอร์ ดังนั้นจึงไม่มีการตั้งค่าการหมดอายุ
คุณไม่ได้จัดเก็บข้อมูลทั้งหมดไว้ในฐานข้อมูลอย่างไรก็ตาม คุณเก็บเฉพาะคีย์และค่าเท่านั้น และเมื่อคุณเพิ่มคุกกี้กลับเข้าไปในโถคุกกี้ requests.Session()
ใหม่ คุกกี้เหล่านั้นจะถูกทำเครื่องหมายเป็น สากลและถาวร คุกกี้จะถูกส่งไปยัง URL ทั้งหมด ซึ่งจะไม่มีวันหมดอายุ และจะไม่ถูกทิ้งไม่ว่าด้วยเหตุผลใดก็ตาม คุกกี้ประเภทนี้บางครั้งเรียกว่า คุกกี้พิเศษ แต่เซิร์ฟเวอร์ยังคงตั้งค่าคุกกี้ปกติด้วยข้อมูลความถูกต้องของ URL และการหมดอายุที่สมบูรณ์ และคุกกี้เหล่านี้ คุกกี้ที่แตกต่างกัน เนื่องจากการตั้งค่าเหล่านั้น
คุณสามารถยืนยันสิ่งนี้ได้ด้วยการวนซ้ำออบเจ็กต์คุกกี้ในโค้ด httpbin.org
ตัวอย่างของคุณ:
>>> from requests import Session
>>> sess = Session()
>>> sess.cookies.update({"sessioncookie": "1234567890"})
>>> __ = sess.get("https://httpbin.org/cookies/set/sessioncookie/0987654321")
>>> for cookie in sess.cookies: print(cookie)
...
<Cookie sessioncookie=1234567890 for />
<Cookie sessioncookie=0987654321 for httpbin.org/>
มีคุกกี้สองรายการที่แยกกันอยู่ที่นี่ คุกกี้หนึ่งสำหรับ /
(ทุกเส้นทาง ทุกโดเมน) และอีกคุกกี้หนึ่งสำหรับ httpbin.org
เพียงอย่างเดียว ทั้งสองจะถูกส่ง
คุณต้องคงข้อมูลเพิ่มเติมไว้ในฐานข้อมูลเพื่อสร้างคุกกี้ 'ปกติ' ขึ้นมาใหม่ หากคุณไม่ต้องการพื้นที่เก็บข้อมูลที่ อ่านได้ ไลบรารี requests
จะทำให้ขวดคุกกี้เป็นแบบเลือกได้อย่างชัดเจน:
import pickle
cookiedata = pickle.dumps(session.cookies, pickle.HIGHEST_PROTOCOL)
นี่คือข้อมูลไบนารี่ เก็บไว้เช่นนั้น คุณสามารถกู้คืนคุกกี้ของคุณด้วย:
session.cookies.update(pickle.loads(cookiedata))
มิฉะนั้น หากคุณต้องมี JSON คุณจะต้องจัดเก็บ Cookie
คุณลักษณะทั้งหมด:
cookie_attrs = [
"version", "name", "value", "port", "domain", "path", "secure",
"expires", "discard", "comment", "comment_url", "rfc2109"
]
cookiedata = json.dumps([
{attr: getattr(cookie, attr) for attr in cookie_attrs}
for cookie in session.cookies
])
และกู้คืนจาก JSON ด้วย
for entry in json.loads(cookiedata):
session.cookies.set(**entry)
ในทางเทคนิคแล้ว ยังมีแอตทริบิวต์ _rest
ที่ติดตามแอตทริบิวต์ HttpOnly
ของคุกกี้ (ในพจนานุกรมที่ซ้อนกัน) แต่แอตทริบิวต์นั้นจะไม่ถูกละเลยโดย requests
เนื่องจากแอตทริบิวต์ดังกล่าวใช้กับเบราว์เซอร์ที่คุกกี้ที่มีแอตทริบิวต์นั้นตั้งค่าเป็น True
ไม่ได้ เข้าถึงได้จาก JavaScript
โดยหลักการแล้ว แอตทริบิวต์ domain
, path
, name
จะทำให้คุกกี้ ไม่ซ้ำกัน แต่ถ้าเซิร์ฟเวอร์ตั้งค่า เช่น คุกกี้ที่มีค่า port
เฉพาะ และคุณทำให้คุกกี้นั้นต่อเนื่องกันและกู้คืนในภายหลัง ในตอนนี้ คุกกี้จะถูกส่งโดยไม่คำนึงถึงพอร์ตที่ใช้สำหรับ URL เป้าหมาย (ทุกอย่างเท่าเทียมกัน) และนั่นอาจทำให้พังได้หากไซต์ตัดสินใจว่าการเห็นคุกกี้ดังกล่าวที่อื่นเป็นปัญหา
person
Martijn Pieters
schedule
10.07.2019
account.cookies
มีสตริง json ฉันแน่ใจว่าปัญหานั้นไม่ได้อยู่ที่นี่ เพราะในขั้นแรกขอให้ส่งคุกกี้ที่เหมาะสม - person Olvin Roght   schedule 10.07.2019print(local_session.cookies.items())
นี้หลังจากคำขอครั้งที่สองแล้วเขียนผลลัพธ์ลงในโพสต์ของคุณได้ไหม - person Corentin Limier   schedule 10.07.2019.items()
มีทั้งสองคู่: มีค่าเก่าและใหม่ ปัญหาอยู่ที่การจัดเก็บคุกกี้หลังจากการร้องขอครั้งแรก - person Olvin Roght   schedule 10.07.2019s=Session();s.get('https://httpbin.org/cookies/set/sessioncookie/123456789');s.get('https://httpbin.org/cookies/set/sessioncookie/12345679');print(s.cookies.items()
(httbin.org ให้ apis แก่คุณเพื่อจำลองคำขอ) และจริง ๆ แล้วมันอัปเดตคุกกี้ได้ดี คุณมีพฤติกรรมแบบเดียวกันบนเว็บไซต์นี้หรือไม่? - person Corentin Limier   schedule 10.07.2019account.cookies = json.dumps(dict(session.cookies))
มีตัวอย่างที่ด้านล่างของคำถามโดยไม่มีฐานข้อมูล มีโค้ดเพียง 4 บรรทัดที่สร้างปัญหาเดียวกัน ดังนั้นฉันไม่คิดว่าจะมีปัญหาเกิดขึ้น - person Olvin Roght   schedule 10.07.2019