Python handles cookie details

  • 2020-04-02 13:24:52
  • OfStack

To install cookies on the user's browser, the HTTP server adds an HTTP header to the HTTP response that looks like the following:


Set-Cookie : session=8345234;expires=Sun . 15-Nov-2013 15:00:00 GMT ; path=/ ; domain=baidu.com

Expires is the lifetime of a cookie, path is the valid path to a cookie, and domain is the valid domain of a cookie.

The "path" is used to set the top-level directory where a cookie can be read.

Setting the path of the cookie to the top-level directory of your page makes it accessible to all pages in that directory.

Method: add path=/ to your cookie; If you only want to make the cookie available to web pages in the "food" directory, you add path=/food; .

Domain: some websites have many small domains. For example, baidu may also have pages under the domains "news.baidu.com", "zhidao.baidu.com" and "v.baidu.com".

If you want all machines under "baidu.com" to read the cookie, you must add "domain=.baidu.com" in the cookie.

The user's browser will store cookies until they expire, and the browser will send the following HTTP request headers to the path and domain servers:


Cookie : session=8345234 . 

For example, when logging on www.baidu.com, the cookie in the HTTP response header sent back by baidu server is:


Set-Cookie:H_PS_PSSID=4681_4567_1452_9876_4759; path=/; domain=.baidu.com
Set-Cookie:BDSVRTM=74; path=/

The browser's HTTP request header:


Cookie:BAIDUID=0FD996SDFG12********107B9C227F4C:FG=1; locale=zh; bdshare_firstime=1384567418140; NBID=D830DD2345HH2818A9F4134E5A2D778D3B:FG=1; H_PS_LC=4_shadu2014; BD_CK_SAM=1; H_PS_PSSID=4681_4567_1452_9876_4759

When the browser sends the cookie back to the HTTP server, it USES the encoded form of key=value string and does not return optional properties such as expires, path, and domain.

The cookie string is usually in the HTTP_COOKIE environment variable and can be read as follows:


import os
print "Content-type: text/plainn"
if "HTTP_COOKIE" in os.environ:
    print os.environ["HTTP_COOKIE"]
else:
    print "HTTP_COOKIE not set!"

The Cookie module in Python (python2,python3 for http.cookies) provides a special dictionary-like object called a SimpleCookie that stores and manages a collection of Cookie values called Morsel.

Each Morsel has name, value, and optional properties (expires, path, domain, comment, max-age, secure, version, httponly).

The SimpleCookie can use the output() method to create an output of cookie data in the form of an HTTP header, and the js_output() method to generate a string containing javascript code.

Generate cookies with HTTP_COOKIE:


cookie=Cookie.SimpleCookie(os.environ['HTTP_COOKIE'])
print cookie.output()

The set cookies:


import Cookie
import datetime
import random

expiration = datetime.datetime.now() + datetime.timedelta(days=30)
cookie = Cookie.SimpleCookie()
cookie["session"] = random.randint(1,1000000000)
cookie["session"]["domain"] = ".baidu.com"
cookie["session"]["path"] = "/"
cookie["session"]["expires"] = expiration.strftime("%a, %d-%b-%Y %H:%M:%S PST")

print "Content-type: text/plain"
print cookie.output()
print
print "Cookie set with: " + cookie.output()

Output:


Content-type: text/plain
Set-Cookie: session=155209565; Domain=.jayconrod.com; expires=Mon, 03-Mar-2014 07:42:47 PST; Path=/
Cookie set with: Set-Cookie: session=155209565; Domain=.jayconrod.com; expires=Mon, 03-Mar-2014 07:42:47 PST; Path=/

The cookielib library in Python (http.cookiejar in Python 3) provides client support for storing and managing cookies.

The main function of this module is to provide objects that can store cookies. Use this module to capture cookies and resend them on subsequent connection requests

Work with files that contain cookie data.

This module provides a few main object, CookieJar, FileCookieJar, MozillaCookieJar, LWPCookieJar.

The CookieJar object is stored in memory.


>>> import urllib2
>>> import cookielib
>>> cookie=cookielib.CookieJar()
>>> handler=urllib2.HTTPCookieProcessor(cookie)
>>> opener=urllib2.build_opener(handler)
>>> opener.open('http://www.google.com.hk' ) <addinfourl at 161806444 whose fp = <socket._fileobject object at 0x9a348ac>>

The cookie accessing Google has been caught.

Here's what it looks like:


>>> print cookie
<cookielib.CookieJar[<Cookie NID=67=B6YQoEIEjcqDj-adada_WmNYl_JvADsDEDchFTMtAgERTgRjK452ko6gr9G0Q5p9h1vlmHpCR56XCrWwg1pv6iqhZnaVlnwoeM-Ln7kIUWi92l-X2fvUqgwDnN3qowDW for .google.com.hk/>, <Cookie PREF=ID=7ae0fa51234ce2b1:FF=0:NW=1:TM=1391219446:LM=1391219446:S=cFiZ5X8ts9NY3cmk for .google.com.hk/>]>

It seems to be a collection of Cookie instances. Cookie instances have properties such as name,value,path,expires, etc.


>>> for ck in cookie:
...     print ck.name,':',ck.value
... 
NID : 67=B6YQoEIEjcqDj-adada_WmNYl_JvADsDEDchFTMtAgERTgRjK452ko6gr9G0Q5p9h1vlmHpCR56XCrWwg1pv6iqhZnaVlnwoeM-Ln7kIUWi92l-X2fvUqgwDnN3qowDW
PREF : ID=7ae0fa51234ce2b1:FF=0:NW=1:TM=1391219446:LM=1391219446:S=cFiZ5X8ts9NY3cmk

Cookies can also be captured in a file.

FileCookieJar (filename)

Create a FileCookieJar instance, retrieve the cookie information, and store the information in a file, filename being the name of the file.

MozillaCookieJar (filename)

Create a FileCookieJar instance that is compatible with the Mozilla cookies. TXT file.

LWPCookieJar (filename)

Create a FileCookieJar instance that is compatible with the libww-perl set-cookie3 file.

Code:


import urllib2
import cookielib
def HandleCookie():
     #handle cookie whit file
     filename='FileCookieJar.txt'
     url='http://www.google.com.hk'
     FileCookieJar=cookielib.LWPCookieJar(filename)
     FileCookeJar.save()
     opener =urllib2.build_opener(urllib2.HTTPCookieProcessor(FileCookieJar))
     opener.open(url)
     FileCookieJar.save()
     print open(filename).read() 
     #read cookie from file
     readfilename = "readFileCookieJar.txt"
     MozillaCookieJarFile =cookielib.MozillaCookieJar(readfilename)
     print MozillaCookieJarFile        
     MozillaCookieJarFile.load(cookieFilenameMozilla)
     print MozillaCookieJarFile
 if __name__=="__main__":
     HandleCookie()


Related articles: