- Python получить куки браузера
- Получение куки
- Всё о работе с cookie в Python — класс http.cookies
- Создание и установка значения Cookie
- Morsel
- Закодированные значения
- Получение и парсинг заголовков Cookie
- Альтернативные форматы вывода
- browsercookie 0.7.7
- Навигация
- Ссылки проекта
- Статистика
- Метаданные
- Сопровождающие
- Описание проекта
Python получить куки браузера
Для установки куки на сервере у объекта Response и его классов-наследников применяется метод set_cookie() . Этот метод принимает ряд параметров:
- key : ключ или имя куки. Обязательный параметр
- value : значение куки, значение по умолчанию — пустая строка
- max_age : максимальное время жизни куки в секундах. Это может быть либо число, либо значение None (ограничивает время жизни куки текущей сессией браузера, является значением по умолчанию).
- expires : когда истекает действие куки. Это может быть либо число, либо значение None (ограничивает время жизни куки текущей сессией браузера, является значением по умолчанию).
- path : путь, для которого устанавливаются куки. Значение по умолчанию — корень веб-приложения «/»
- domain : домен, к которому применяются куки. значение по умолчанию None
- secure : устанавливает используемый протокол. Так, если имеет значение True , то куки будут посылаться на сервер только в запросе по протоколу https. Значение по умолчанию False
- httponly : устанавлиет доступность для скриптов javascript на клиенте. Так, значение True предотвращает доступ к куки из кода javascript на клиенте. Значение по умолчанию False
- samesite : устанавливает разрешения на отправку куки в кроссдоменных запросах. Так, значение lax (значение по умолчанию) указывают браузеру не посылать куки в кроссдоменных запросах.
Установим куку, которую назовем «last_visit»:
from fastapi import FastAPI, Response from datetime import datetime app = FastAPI() @app.get(«/») def root(response: Response): now = datetime.now() # получаем текущую дату и время response.set_cookie(key=»last_visit», value=now) return
В данном случае кука «last_visit» представляет дату последнего визита и хранит текущую дату. Затем в браузере через инструменты разработчика мы можем увидеть параметры этой куки.
В примере выше объект Response передавался в качестве параметра. Но также можно установить куку и с помощью явно созданного объекта Response:
from fastapi import FastAPI from fastapi.responses import JSONResponse from datetime import datetime app = FastAPI() @app.get("/") def root(): now = datetime.now() # получаем текущую дату и время response = JSONResponse(content=) response.set_cookie(key="last_visit", value=now) return response
Получение куки
Для получения куки на сервере применяется класс fastapi.Cookie . Например, получим выше установленную куку «last_visit»:
from fastapi import FastAPI, Cookie app = FastAPI() @app.get(«/») def root(last_visit = Cookie()): return
Для получения куки определяется параметр с именем куки, которому присваивается объект Cookie.
В примере выше куки была обязательна. Если ее нет в запросе, приложение выдало бы ошибку. Чтобы избежать этого, мы можем определить значение по умолчанию, в том числе None:
from fastapi import FastAPI, Cookie app = FastAPI() @app.get("/") def root(last_visit: str | None = Cookie(default=None)): if last_visit == None: return else: return ">
Всё о работе с cookie в Python — класс http.cookies
Модуль http.cookies реализует парсер для cookie, по большей части совместимый с RFC 2109 — документом со стандартами работы с cookie и смежными вещами.
Стоит отметить, что реализация чуть менее строгая, чем стандарт, так как Microsoft Internet Explorer 3.0x, а позже современные браузеры облегчили правила для работы с cookie.
Создание и установка значения Cookie
Cookie используются как инструмент для поддержания текущего состояния в браузерных приложениях, поэтому чаще всего они создаются, изменяются и используются сервером, а хранятся у пользователя. Самый простой пример создания пары ключ-значение:
# http_cookies_setheaders.py from http import cookies c = cookies.SimpleCookie() c['mycookie'] = 'cookie_value' print(c)
Выводом является валидный Set-Cookie заголовок, готовый к передаче клиенту как часть HTTP ответа.
$ python3 http_cookies_setheaders.py Set-Cookie: mycookie=cookie_value
Morsel
Также вы можете управлять другими параметрами cookie, такими как время жизни записи, путь и домен. Оказывается, что всеми RFC атрибутами можно управлять с помощью объекта Morsel .
# http_cookies_Morsel.py from http import cookies import datetime def show_cookie(c): print(c) for key, morsel in c.items(): print() print('key =', morsel.key) print(' value =', morsel.value) print(' coded_value =', morsel.coded_value) for name in morsel.keys(): if morsel[name]: print(' <> = <>'.format(name, morsel[name])) c = cookies.SimpleCookie() # Cookie со значением, которое должно быть закодировано, # чтобы поместиться в заголовок c['encoded_value_cookie'] = '"cookie,value;"' c['encoded_value_cookie']['comment'] = 'Has escaped punctuation' # А эта cookie применяется только к части сайта c['restricted_cookie'] = 'cookie_value' c['restricted_cookie']['path'] = '/sub/path' c['restricted_cookie']['domain'] = 'PyMOTW' c['restricted_cookie']['secure'] = True # Эта cookie истекает через 5 минут c['with_max_age'] = 'expires in 5 minutes' c['with_max_age']['max-age'] = 300 # seconds # Cookie истекает в указанное время c['expires_at_time'] = 'cookie_value' time_to_live = datetime.timedelta(hours=1) expires = (datetime.datetime(2009, 2, 14, 18, 30, 14) + time_to_live) # Формат: Wdy, DD-Mon-YY HH:MM:SS GMT expires_at_time = expires.strftime('%a, %d %b %Y %H:%M:%S') c['expires_at_time']['expires'] = expires_at_time show_cookie(c)
Этот пример включает в себя два различных метода для создания cookie с датой истечения срока жизни. Один устанавливает max-age как количество секунд жизни cookie с момента создания, другой устанавливает параметр expires как дату и время, когда cookie должна быть удалена.
$ python3 http_cookies_Morsel.py Set-Cookie: encoded_value_cookie="\"cookie\054value\073\""; Comment="Has escaped punctuation" Set-Cookie: expires_at_time=cookie_value; expires=Sat, 14 Feb 2009 19:30:14 Set-Cookie: restricted_cookie=cookie_value; Domain=PyMOTW; Path=/sub/path; Secure Set-Cookie: with_max_age="expires in 5 minutes"; Max-Age=300 key = encoded_value_cookie value = "cookie,value;" coded_value = "\"cookie\054value\073\"" comment = Has escaped punctuation key = restricted_cookie value = cookie_value coded_value = cookie_value path = /sub/path domain = PyMOTW secure = True key = with_max_age value = expires in 5 minutes coded_value = "expires in 5 minutes" max-age = 300 key = expires_at_time value = cookie_value coded_value = cookie_value expires = Sat, 14 Feb 2009 19:30:14
Оба объекта Cookie и Morsel ведут себя как словари. Morsel отвечает за фиксированный набор значений: expires , path , comment , domain , max-age , secure , version .
Закодированные значения
Заголовок cookie должен быть закодирован для того, чтобы потом он был правильно распарсен.
# http_cookies_coded_value.py from http import cookies c = cookies.SimpleCookie() c['integer'] = 5 c['with_quotes'] = 'He said, "Hello, World!"' for name in ['integer', 'with_quotes']: print(c[name].key) print(' <>'.format(c[name])) print(' value='.format(c[name].value)) print(' coded_value='.format(c[name].coded_value)) print()
Morsel.value всегда является закодированным значением cookie, в то время как Morsel.coded_value всегда является представлением, которое используется для передачи значения клиенту. Оба значения всегда являются строками. Значения, которые не являются строками, будут автоматически преобразованы в нужный тип.
$ python3 http_cookies_coded_value.py integer Set-Cookie: integer=5 value='5' coded_value='5' with_quotes Set-Cookie: with_quotes="He said\054 \"Hello\054 World!\"" value='He said, "Hello, World!"' coded_value='"He said\\054 \\"Hello\\054 World!\\""'
Получение и парсинг заголовков Cookie
После того, как Set-cookie заголовки переданы клиенту, он будет возвращать их на сервер в последующих запросах, используя заголовок Cookie . Входящий заголовок может содержать несколько cookie, разделённых символами ; :
Cookie: integer=5; with_quotes="He said, \"Hello, World!\""
В зависимости от веб-сервера и фреймворка, cookie доступы либо прямо из заголовка, либо из значения HTTP_COOKIE .
# http_cookies_parse.py from http import cookies HTTP_COOKIE = '; '.join([ r'integer=5', r'with_quotes="He said, \"Hello, World!\""', ]) print('From constructor:') c = cookies.SimpleCookie(HTTP_COOKIE) print(c) print() print('From load():') c = cookies.SimpleCookie() c.load(HTTP_COOKIE) print(c)
Чтобы их раскодировать, передайте нужную часть cтроки в SimpleCookie , либо используйте метод load() .
$ python3 http_cookies_parse.py From constructor: Set-Cookie: integer=5 Set-Cookie: with_quotes="He said, \"Hello, World!\"" From load(): Set-Cookie: integer=5 Set-Cookie: with_quotes="He said, \"Hello, World!\""
Альтернативные форматы вывода
Кроме использования заголовка Set-Cookie , серверы поставляют JavaScript, который добавляет cookie клиенту. SimpleCookie и Morsel генерируют JavaScript при использовании метода js_output() .
# http_cookies_js_output.py from http import cookies import textwrap c = cookies.SimpleCookie() c['mycookie'] = 'cookie_value' c['another_cookie'] = 'second value' js_text = c.js_output() print(textwrap.dedent(js_text).lstrip())
Результатом является готовый тег script для задания нужных значений cookie.
$ python3 http_cookies_js_output.py
browsercookie 0.7.7
Loads cookies from your browser into a cookiejar object so can download with urllib and other libraries the same content you see in the web browser.
Навигация
Ссылки проекта
Статистика
Метаданные
Лицензия: lgpl
Сопровождающие
Описание проекта
Browser Cookie
==============
The **browsercookie** module loads cookies used by your web browser
into a cookiejar object. This can be useful if you want to use python to
download the same content you see in the web browser without needing to
login.
Install
-------
.. sourcecode:: bash
pip install browsercookie
On Windows the builtin sqlite module will raise an error when loading
the FireFox database. An updated version of sqlite can be installed with:
.. sourcecode:: bash
pip install pysqlite
Usage
-----
Here is a hack to extract the title from a webpage:
.. sourcecode:: python
>>> import re
>>> get_title = lambda html: re.findall('', html, flags=re.DOTALL)[0].strip()
And here is the webpage title when downloaded normally:
.. sourcecode:: python
>>> import urllib2
>>> url = 'https://bitbucket.org/'
>>> public_html = urllib2.urlopen(url).read()
>>> get_title(public_html)
'Git and Mercurial code management for teams'
Now let's try with **browsercookie** - make sure you are logged into
Bitbucket in Firefox before trying this example:
.. sourcecode:: python
>>> import browsercookie
>>> cj = browsercookie.firefox()
>>> opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
>>> login_html = opener.open(url).read()
>>> get_title(login_html)
'richardpenman / home — Bitbucket'
Differences with Python3:
.. sourcecode:: python
>>> import urllib.request
>>> public_html = urllib.request.urlopen(url).read()
>>> opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
You should see your own username here, meaning the module successfully
loaded the cookies from Firefox.
Here is an alternative example with
`requests `__, this time
loading the Chrome cookies. Again make sure you are logged into
Bitbucket in Chrome before running this:
.. sourcecode:: python
>>> import requests
>>> cj = browsercookie.chrome()
>>> r = requests.get(url, cookies=cj)
>>> get_title(r.content)
'richardpenman / home — Bitbucket'
Alternatively if you don't know/care which browser has the cookies you
want then all available browser cookies can be loaded:
.. sourcecode:: python
>>> cj = browsercookie.load()
>>> r = requests.get(url, cookies=cj)
>>> get_title(r.content)
'richardpenman / home — Bitbucket'
Contribute
----------
So far the following platforms are supported:
- **Chrome:** Linux, OSX, Windows
- **Firefox:** Linux, OSX, Windows
However I only tested on a single version of each browser and so am not
sure if the cookie sqlite format changes location or format in
earlier/later versions. If you experience a problem please `open an
issue `__
which includes details of the browser version and operating system. Also
patches to support other browsers are very welcome, particularly for
Internet Explorer on Windows.
Acknowledgements
----------------
* Nathan Henrie for his example of `how to decode the Chrome cookies `__
* Graeme Robinson for his Chrome Windows patch