http.cookiejar — Обработка файлов cookie для HTTP-клиентов
Модуль http.cookiejar определяет классы для автоматической обработки файлов cookie HTTP. Он полезен для доступа к веб-сайтам, которые требуют установки небольших фрагментов данных — файлов cookie — на компьютере клиента с помощью HTTP-ответа веб-сервера и последующего возвращения их на сервер в последующих HTTP-запросах.
Обрабатываются как стандартный протокол файлов cookie Netscape, так и протокол, определённый в RFC 2965. Обработка RFC 2965 отключена по умолчанию. Файлы cookie RFC 2109 парсятся как файлы cookie Netscape и впоследствии обрабатываются как файлы cookie Netscape или RFC 2965 в соответствии с действующей политикой. Обратите внимание, что подавляющее большинство файлов cookie в Интернете — это файлы cookie Netscape. http.cookiejar пытается следовать фактическому протоколу файлов cookie Netscape (который существенно отличается от протокола, описанного в оригинальной спецификации Netscape), включая учёт max-age и port атрибутов файлов cookie, введённых в RFC 2965.
Примечание
Различные именованные параметры, встречающиеся в заголовках Set-Cookie и Set-Cookie2 (например, domain и expires) обычно называются атрибутами. Чтобы отличать их от атрибутов Python, в документации этого модуля используется термин атрибут файла cookie вместо.
Модуль определяет следующую исключительную ситуацию:
-
Экземпляры
FileCookieJarгенерируют это исключение при неудачной загрузке файлов cookie из файла.LoadErrorявляется подклассомOSError.
Предоставляются следующие классы:
-
policy — объект, реализующий интерфейс
CookiePolicy.Класс
CookieJarхранит файлы cookie HTTP. Он извлекает файлы cookie из HTTP-запросов и возвращает их в HTTP-ответах. ЭкземплярыCookieJarавтоматически истекают содержащимися файлами cookie при необходимости. Подклассы также отвечают за хранение и извлечение файлов cookie из файла или базы данных.
-
policy — объект, реализующий интерфейс
CookiePolicy. Для других аргументов см. документацию по соответствующим атрибутам.Класс
CookieJar, который может загружать файлы cookie из файла и, возможно, сохранять файлы cookie в файл на диске. Файлы cookie НЕ загружаются из указанного файла до тех пор, пока не будет вызван методload()илиrevert(). Подклассы этого класса документированы в разделе Подклассы FileCookieJar и взаимодействие с веб-браузерами.
-
Этот класс отвечает за решение вопроса о том, следует ли принимать каждый файл cookie от сервера/возвращать на сервер.
-
Аргументы конструктора должны передаваться только как именованные аргументы. blocked_domains — последовательность доменных имён, файлы cookie от которых никогда не принимаются и на которые не возвращаются файлы cookie. allowed_domains, если не
None, — последовательность единственных доменов, для которых принимаются и возвращаются файлы cookie. Для всех остальных аргументов см. документацию по объектамCookiePolicyиDefaultCookiePolicy.DefaultCookiePolicyреализует стандартные правила принятия/отклонения файлов cookie Netscape и RFC 2965. По умолчанию файлы cookie RFC 2109 (т. е. файлы cookie, полученные в заголовке Set-Cookie с атрибутом версии файла cookie 1) обрабатываются в соответствии с правилами RFC 2965. Однако, если обработка RFC 2965 выключена илиrfc2109_as_netscapeравноTrue, файлы cookie RFC 2109 «приводятся к виду» файлов cookie Netscape в экземпляреCookieJar, устанавливая атрибутversionэкземпляраCookieв 0.DefaultCookiePolicyтакже предоставляет некоторые параметры для настройки политики.
-
Этот класс представляет файлы cookie Netscape, RFC 2109 и RFC 2965. Не ожидается, что пользователи
http.cookiejarбудут создавать собственные экземплярыCookie. Вместо этого, при необходимости вызовитеmake_cookies()для экземпляраCookieJar.
См. также
-
Moduleurllib.request -
Открытие URL с автоматической обработкой файлов cookie.
-
Modulehttp.cookies -
Классы файлов cookie HTTP, главным образом полезные для кода на стороне сервера. Модули
http.cookiejarиhttp.cookiesне зависят друг от друга. - https://curl.haxx.se/rfc/cookie_spec.html
-
Спецификация исходного протокола файлов cookie Netscape. Несмотря на то, что это по-прежнему доминирующий протокол, «протокол файлов cookie Netscape», реализованный всеми основными браузерами (и
http.cookiejar), имеет лишь поверхностное сходство с тем, что набросано вcookie_spec.html. - RFC 2109 - Механизм управления состоянием HTTP
-
Устарел RFC 2965. Использует Set-Cookie с version=1.
- RFC 2965 - Механизм управления состоянием HTTP
-
Протокол Netscape с исправленными ошибками. Использует Set-Cookie2 вместо Set-Cookie. Не широко используется.
- http://kristol.org/cookie/errata.html
-
Незавершенные исправления RFC 2965.
RFC 2964 - Использование управления состоянием HTTP
21.24.1. Объекты CookieJar и FileCookieJar
CookieJar имеет следующие методы:
-
Добавить правильный заголовок Cookie в запрос.
Если политика позволяет (т.е. атрибуты
rfc2965иhide_cookie2экземпляраCookieJar’sCookiePolicyистинны и ложны соответственно), то заголовок Cookie2 также добавляется при необходимости.Объект запрос (обычно экземпляр
urllib.request..Request) должен поддерживать методыget_full_url(),get_host(),get_type(),unverifiable(),has_header(),get_header(),header_items(),add_unredirected_header()и атрибутorigin_req_host, как описано вurllib.request.Изменено в версии 3.3: Объект запрос требует атрибута
origin_req_host. Зависимость от устаревшего методаget_origin_req_host()была удалена.
-
Извлечь куки из HTTP ответа и сохранить их в
CookieJar, если это разрешено политикой.CookieJarбудет искать разрешенные заголовки Set-Cookie и Set-Cookie2 в аргументе ответ и сохранять куки соответственно (в соответствии с одобрением методаCookiePolicy.set_ok()).Объект ответ (обычно результат вызова
urllib.request.urlopen()или аналогичного) должен поддерживать методinfo(), возвращающий экземплярemail.message.Message.Объект запрос (обычно экземпляр
urllib.request.Request) должен поддерживать методыget_full_url(),get_host(),unverifiable()и атрибутorigin_req_host, как описано вurllib.request. Запрос используется для установки значений по умолчанию для атрибутов куки, а также для проверки возможности установки куки.Изменено в версии 3.3: Объект запрос требует атрибута
origin_req_host. Зависимость от устаревшего методаget_origin_req_host()была удалена.
-
Установить экземпляр
CookiePolicyдля использования.
-
Возвращает последовательность объектов
Cookie, извлеченных из объекта ответ.См. документацию по
extract_cookies()для интерфейсов, необходимых для аргументов ответ и запрос.
-
Установить
Cookie, если политика разрешает это.
-
Установить
Cookieбез проверки с политикой, чтобы узнать, следует ли её устанавливать.
-
Очистить некоторые куки.
Если вызвана без аргументов, очищает все куки. Если задан один аргумент, удаляются только куки, принадлежащие данному домену. Если заданы два аргумента, удаляются куки, принадлежащие указанному домену и пути URL. Если заданы три аргумента, удаляется кука с указанным доменом, путем и именем.
Возбуждает
KeyError, если соответствующая кука не существует.
-
Отбросить все сессионные куки.
Отбрасывает все содержащиеся куки, имеющие атрибут
discard(обычно потому, что у них либо нет атрибута кукиmax-ageилиexpires, либо есть явный атрибут кукиdiscard). Для интерактивных браузеров конец сессии обычно соответствует закрытию окна браузера.Обратите внимание, что метод
save()не будет сохранять сессионные куки, если вы не укажете обратное, передав аргумент ignore_discard со значением True.
FileCookieJar реализует следующие дополнительные методы:
-
Сохранить куки в файл.
Этот базовый класс возбуждает
NotImplementedError. Подклассы могут оставить этот метод нереализованным.filename — имя файла, в который нужно сохранить куки. Если filename не указан, используется
self.filename(по умолчанию — значение, переданное в конструктор, если таковое имеется); еслиself.filenameравноNone, возбуждаетсяValueError.ignore_discard: сохранить даже куки, установленные для удаления. ignore_expires: сохранить даже куки, срок действия которых истек.
Файл перезаписывается, если он уже существует, тем самым удаляя все содержащиеся в нём куки. Сохранённые куки можно восстановить позже, используя методы
load()илиrevert().
-
Загрузить куки из файла.
Старые куки сохраняются, если они не перезаписываются вновь загруженными.
Аргументы такие же, как у
save().Имя файла должно иметь формат, понятный для класса, иначе возбуждается
LoadError. Также может быть возбужденоOSError, например, если файла не существует.
-
Очистить все куки и перезагрузить куки из сохранённого файла.
revert()может возбуждать те же исключения, что иload(). Если произошла ошибка, состояние объекта не изменится.
FileCookieJar экземпляры имеют следующие публичные атрибуты:
-
Имя файла по умолчанию, в котором хранятся куки. Этот атрибут может быть изменён.
-
Если True, загружать куки лениво из диска. Этот атрибут не должен изменяться. Это лишь подсказка, поскольку это влияет только на производительность, а не на поведение (если куки на диске меняются). Объект
CookieJarможет его игнорировать. Ни один из классовFileCookieJarв стандартной библиотеке не загружает куки лениво.
21.24.2. Подклассы FileCookieJar и взаимодействие с веб-браузерами
END_OF_DOCUMENT_MARKER-
A
FileCookieJarthat can load from and save cookies to disk in the Mozillacookies.txtfile format (which is also used by the Lynx and Netscape browsers).Примечание
This loses information about RFC 2965 cookies, and also about newer or non-standard cookie-attributes such as
port.Предупреждение
Перед сохранением сделайте резервную копию файлов cookie, если потеря/повреждение файлов cookie может быть неудобной (есть некоторые нюансы, которые могут привести к небольшим изменениям в файле при многократных загрузках/сохранениях).
Также обратите внимание, что файлы cookie, сохраненные во время работы Mozilla, будут перезаписаны Mozilla.
-
A
FileCookieJarthat can load from and save cookies to disk in format compatible with the libwww-perl library’sSet-Cookie3file format. This is convenient if you want to store cookies in a human-readable file.
21.24.3. Объекты CookiePolicy
-
Возвращает булево значение, указывающее, следует ли принимать cookie от сервера.
cookie — это экземпляр
Cookie. request — это объект, реализующий интерфейс, определенный в документации дляCookieJar.extract_cookies().
-
Возвращает булево значение, указывающее, следует ли возвращать cookie серверу.
cookie — это экземпляр
Cookie. request — это объект, реализующий интерфейс, определенный в документации дляCookieJar.add_cookie_header().
-
Возвращает false, если cookie не должны быть возвращены, учитывая домен cookie.
Этот метод является оптимизацией. Он устраняет необходимость проверки каждого cookie с конкретным доменом (что может потребовать чтения многих файлов). Возвращение true из
domain_return_ok()иpath_return_ok()оставляет всю работу методуreturn_ok().Если
domain_return_ok()возвращает true для домена cookie, вызываетсяpath_return_ok()для пути cookie. В противном случаеpath_return_ok()иreturn_ok()никогда не вызываются для этого домена cookie. Еслиpath_return_ok()возвращает true,return_ok()вызывается с объектомCookieдля полной проверки. В противном случаеreturn_ok()никогда не вызывается для этого пути cookie.Обратите внимание, что
domain_return_ok()вызывается для каждого домена cookie, а не только для домена request. Например, функция может быть вызвана с".example.com"и"www.example.com"если домен запроса"www.example.com". То же самое относится кpath_return_ok().Аргумент request соответствует документации для
return_ok().
-
Возвращает false, если cookie не должны быть возвращены, учитывая путь cookie.
См. документацию для
domain_return_ok().
В дополнение к реализации методов выше, реализации интерфейса CookiePolicy также должны предоставить следующие атрибуты, указывающие, какие протоколы следует использовать и как. Все эти атрибуты могут быть назначены.
-
Реализует протокол Netscape.
-
Реализует протокол RFC 2965.
-
Не добавлять заголовок Cookie2 в запросы (наличие этого заголовка указывает серверу, что мы понимаем файлы cookie RFC 2965).
Наиболее удобный способ определения класса CookiePolicy — наследование от DefaultCookiePolicy и переопределение некоторых или всех методов выше. Сам CookiePolicy может использоваться в качестве «нулевой политики», позволяющей устанавливать и получать любые файлы cookie (это вряд ли будет полезно).
21.24.4. Объекты DefaultCookiePolicy
Оба типа файлов cookie, RFC 2965 и Netscape, поддерживаются. Обработка RFC 2965 отключена по умолчанию.
Самый простой способ предоставить собственную политику — переопределить этот класс и вызвать его методы в ваших переопределенных реализациях перед добавлением собственных дополнительных проверок:
import http.cookiejar
class MyCookiePolicy(http.cookiejar.DefaultCookiePolicy):
def set_ok(self, cookie, request):
if not http.cookiejar.DefaultCookiePolicy.set_ok(self, cookie, request):
return False
if i_dont_want_to_store_this_cookie(cookie):
return False
return True
В дополнение к функциям, необходимым для реализации интерфейса CookiePolicy, этот класс позволяет блокировать и разрешать домены для установки и получения файлов cookie. Также есть несколько переключателей строгости, которые позволяют немного ужесточить правила протокола Netscape (в ущерб блокировке некоторых доброкачественных cookie).
Предоставляется черный и белый списки доменов (оба отключены по умолчанию). Только домены, не находящиеся в черном списке и присутствующие в белом списке (если белый список активен), участвуют в установке и получении файлов cookie. Используйте аргумент конструктора blocked_domains и методы blocked_domains() и set_blocked_domains() (и соответствующие аргументы и методы для allowed_domains). Если вы задаете белый список, вы можете его отключить, установив его в None.
Домены в черном или белом списках, не начинающиеся с точки, должны совпадать с доменом cookie для сопоставления. Например, "example.com" соответствует записи в черном списке "example.com", но "www.example.com" не соответствует. Домены, начинающиеся с точки, сопоставляются также с более конкретными доменами. Например, "www.example.com" и "www.coyote.example.com" сопоставляются с ".example.com" (но сам "example.com" не соответствует). IP-адреса являются исключением и должны совпадать точно. Например, если blocked_domains содержит "192.168.1.2" и ".168.1.2", 192.168.1.2 заблокирован, но 193.168.1.2 нет.
DefaultCookiePolicy реализует следующие дополнительные методы:
-
Возвращает последовательность заблокированных доменов (в виде кортежа).
-
Устанавливает последовательность заблокированных доменов.
-
Возвращает значение, указывающее, находится ли domain в черном списке для установки или получения файлов cookie.
-
Возвращает
Noneили последовательность разрешенных доменов (в виде кортежа).
-
Устанавливает последовательность разрешенных доменов или
None.
-
Возвращает значение, указывающее, находится ли domain в списке запрещенных для установки или получения cookie.
DefaultCookiePolicy экземпляры имеют следующие атрибуты, которые все инициализируются из аргументов конструктора с тем же именем и к которым можно назначать значения.
-
Если True, запрашивает, чтобы экземпляр
CookieJarпонижал RFC 2109 cookie (т.е. cookie, полученные в заголовке Set-Cookie с атрибутом cookie-version 1) до Netscape cookie, установив атрибут version экземпляраCookieв 0. Значение по умолчанию —None, в этом случае RFC 2109 cookie понижаются, если и только если включена обработка RFC 2965. Следовательно, RFC 2109 cookie понижаются по умолчанию.
Общие переключатели строгости:
-
Не допускает установки сайтами двухкомпонентных доменов с доменными зонами верхнего уровня, содержащими код страны, такими как
.co.uk,.gov.uk,.co.nz. и т.д. Это далеко не идеально и не гарантирует работоспособность!
RFC 2965 переключатели строгости протокола:
-
Следует правилам RFC 2965 для неподтвержденных транзакций (обычно неподтвержденная транзакция — это транзакция, полученная в результате перенаправления или запроса изображения, размещенного на другом сайте). Если это значение False, cookie никогда не блокируются на основе проверяемости.
Переключатели строгости протокола Netscape:
-
Применяет правила RFC 2965 для неподтвержденных транзакций даже к Netscape cookie.
-
Флаги, определяющие, насколько строго следует соблюдать правила сопоставления доменов для Netscape cookie. Допустимые значения см. ниже.
-
Игнорирует cookie в заголовках Set-Cookie, имена которых начинаются с
'$'.
-
Не разрешает установку cookie, путь которых не соответствует пути URI запроса.
strict_ns_domain — это набор флагов. Его значение формируется путем побитового ИЛИ (например, DomainStrictNoDots|DomainStrictNonDomain означает, что оба флага установлены).
-
При установке cookie «префикс имени хоста» не должен содержать точку (например,
www.foo.bar.comне может установить cookie для.bar.com, посколькуwww.fooсодержит точку).
-
Cookie, которые явно не указали атрибут cookie-attribute, могут быть возвращены только домену, который установил cookie (например,
spam.example.comне получит cookie отexample.com, у которых не было атрибутаdomaincookie).
-
Требует полного соответствия домену по RFC 2965.
Следующие атрибуты предоставлены для удобства и представляют собой наиболее полезные комбинации вышеупомянутых флагов:
-
Эквивалентно 0 (т.е. все вышеперечисленные флаги строгости домена Netscape отключены).
-
Эквивалентно
DomainStrictNoDots|DomainStrictNonDomain.
21.24.5. Объекты Cookie
Cookie экземпляры имеют атрибуты Python, примерно соответствующие стандартным атрибутам cookie, указанным в различных стандартах cookie. Соответствие не является однозначным, поскольку существуют сложные правила для присвоения значений по умолчанию, поскольку атрибуты cookie max-age и expires содержат эквивалентную информацию, и поскольку RFC 2109 cookie могут быть «снижены» http.cookiejar с версии 1 до версии 0 (cookie Netscape).
Назначение этих атрибутов не должно быть необходимым за исключением редких случаев в методе CookiePolicy. Класс не обеспечивает внутреннюю согласованность, поэтому вам следует знать, что вы делаете, если вы это сделаете.
-
Целое число или
None. Netscape cookie имеютversion0. RFC 2965 и RFC 2109 cookie имеют атрибут cookie-attributeversionравный 1. Однако обратите внимание, чтоhttp.cookiejarможет «снижать» RFC 2109 cookie до Netscape cookie, в этом случаеversionравно 0.
-
Имя cookie (строка).
-
Значение cookie (строка) или
None.
-
Строка, представляющая порт или набор портов (например, «80» или «80,8080»), или
None.
-
Путь cookie (строка, например,
'/acme/rocket_launchers').
-
Trueесли cookie должен быть возвращен только по защищенному соединению.
-
Дата истечения срока действия в секундах с эпохи, целое число, или
None. См. также методis_expired().
-
Trueесли это cookie сеанса.
-
Строковый комментарий от сервера, объясняющий функцию cookie, или
None.
-
URL, который ссылается на комментарий от сервера, объясняющий функцию cookie, или
None.
-
Trueесли это cookie было получено как RFC 2109 cookie (т.е. cookie поступило в заголовке Set-Cookie, и значение атрибута Version cookie в этом заголовке было 1). Этот атрибут предоставляется, посколькуhttp.cookiejarможет «снижать» RFC 2109 cookie до Netscape cookie, в этом случаеversionравно 0.
-
Trueесли порт или набор портов был явно указан сервером (в заголовке Set-Cookie / Set-Cookie2).
-
Trueесли домен был явно указан сервером.
-
Trueесли домен, явно указанный сервером, начинался с точки ('.').
Cookies могут иметь дополнительные нестандартные атрибуты cookie. К ним можно получить доступ, используя следующие методы:
-
Возвращает true, если cookie имеет указанный атрибут.
-
Если cookie имеет указанный атрибут, возвращает его значение. В противном случае, возвращает default.
-
Устанавливает значение указанного атрибута cookie.
Класс Cookie также определяет следующий метод:
-
Trueесли cookie истек, то есть прошло время, в которое сервер запросил его истечение. Если now задано (в секундах с эпохи), возвращает, истек ли cookie в указанное время.
21.24.6. Примеры
Первый пример демонстрирует наиболее распространенное использование http.cookiejar:
import http.cookiejar, urllib.request
cj = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")
Этот пример иллюстрирует, как открыть URL с использованием ваших cookie Netscape, Mozilla или Lynx (предполагается соглашение Unix/Netscape для местоположения файла cookie):
import os, http.cookiejar, urllib.request
cj = http.cookiejar.MozillaCookieJar()
cj.load(os.path.join(os.path.expanduser("~"), ".netscape", "cookies.txt"))
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")
Следующий пример демонстрирует использование DefaultCookiePolicy. Включите cookie RFC 2965, будьте более строгими в отношении доменов при установке и возврате cookie Netscape, и заблокируйте некоторые домены от установки cookie или их возврата:
import urllib.request
from http.cookiejar import CookieJar, DefaultCookiePolicy
policy = DefaultCookiePolicy(
rfc2965=True, strict_ns_domain=Policy.DomainStrict,
blocked_domains=["ads.net", ".ads.net"])
cj = CookieJar(policy)
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.6/library/http.cookiejar.html