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хранит HTTP-файлы cookie. Он извлекает файлы cookie из HTTP-запросов и возвращает их в HTTP-ответах. ЭкземплярыCookieJarавтоматически удаляют истекшие файлы cookie при необходимости. Подклассы также отвечают за хранение и извлечение файлов cookie из файла или базы данных.
-
policy — объект, реализующий интерфейс
CookiePolicy. Для других аргументов см. документацию соответствующих атрибутов.Объект
CookieJar, который может загружать файлы cookie из файла на диске и, возможно, сохранять их в нем. Файлы cookie НЕ загружаются из указанного файла до тех пор, пока не будет вызван методload()илиrevert(). Подклассы этого класса описаны в разделе Подклассы FileCookieJar и взаимодействие с веб-браузерами.
-
Этот класс отвечает за принятие решения о том, следует ли принимать каждый файл cookie от/возвращать его на сервер.
-
Аргументы конструктора должны передаваться только в качестве ключевых аргументов. blocked_domains — последовательность доменных имён, от которых мы никогда не принимаем и не возвращаем файлы 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_netscapeTrue, файлы cookie RFC 2109 «сводятся» экземпляромCookieJarк файлам cookie Netscape, устанавливая атрибутversionэкземпляраCookieв 0.DefaultCookiePolicyтакже предоставляет некоторые параметры для настройки политики.
-
Этот класс представляет файлы cookie Netscape, RFC 2109 и RFC 2965. Не ожидается, что пользователи
http.cookiejarбудут создавать свои собственные экземплярыCookie. Вместо этого, при необходимости, вызовитеmake_cookies()для экземпляраCookieJar.
См. также
-
Moduleurllib.request -
Открытие URL-адресов с автоматической обработкой файлов cookie.
-
Modulehttp.cookies -
Классы HTTP-файлов cookie, в основном полезные для кода на стороне сервера. Модули
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 с версией=1.
- RFC 2965 - Механизм управления состоянием HTTP
-
Протокол Netscape с исправленными ошибками. Использует Set-Cookie2 вместо Set-Cookie. Не широко используется.
- http://kristol.org/cookie/errata.html
-
Незавершенные исправления для RFC 2965.
RFC 2964 - Использование управления состоянием HTTP
Объекты CookieJar и FileCookieJar
CookieJar имеет следующие методы:
-
Добавить корректный заголовок Cookie к запросу request.
Если политика разрешает (т.е. атрибуты
rfc2965иhide_cookie2экземпляраCookieJar’sCookiePolicyистинны и ложны соответственно), также добавляется заголовок Cookie2, если необходимо.Объект request (обычно экземпляр
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: объект request требует атрибута
origin_req_host. Зависимость от устаревшего методаget_origin_req_host()была удалена.
-
Извлечь куки из HTTP response и сохранить их в
CookieJar, если это разрешено политикой.CookieJarбудет искать разрешенные заголовки Set-Cookie и Set-Cookie2 в аргументе response и сохранять куки соответственно (в зависимости от одобрения методаCookiePolicy.set_ok()).Объект response (обычно результат вызова
urllib.request.urlopen()или аналогичного) должен поддерживать методinfo(), который возвращает экземплярemail.message.Message.Объект request (обычно экземпляр
urllib.request.Request) должен поддерживать методыget_full_url(),get_host(),unverifiable(), и атрибутorigin_req_host, как документировано вurllib.request. Запрос используется для установки значений по умолчанию для атрибутов куки, а также для проверки разрешения установки куки.Изменено в версии 3.3: объект request требует атрибута
origin_req_host. Зависимость от устаревшего методаget_origin_req_host()была удалена.
-
Установить экземпляр
CookiePolicyдля использования.
-
Возвращает последовательность объектов
Cookie, извлеченных из объекта response.См. документацию для
extract_cookies()для интерфейсов, необходимых для аргументов response и request.
-
Установить
Cookie, если политика разрешает это сделать.
-
Установить
Cookie, без проверки с политикой, чтобы определить, нужно ли его устанавливать.
-
Очистить некоторые куки.
Если вызвана без аргументов, очищаются все куки. Если задан один аргумент, удаляются только куки, принадлежащие данному домену. Если заданы два аргумента, удаляются куки, принадлежащие указанному домену и пути URL. Если заданы три аргумента, удаляется куки с указанным доменом, путем и именем.
Возбуждает
KeyError, если соответствующего куки нет.
-
Удалить все куки сеанса.
Удаляет все содержащиеся куки, у которых атрибут
discardимеет значение true (обычно потому, что у них отсутствовал атрибут куки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, включенных в стандартную библиотеку, не загружает куки лениво.
Подклассы FileCookieJar и взаимодействие с веб-браузерами
-
Класс
FileCookieJar, который может загружать и сохранять куки на диск в формате файлов Mozillacookies.txt(который также используется браузерами Lynx и Netscape).Примечание
Этот класс теряет информацию о куки **RFC 2965**, а также о более новых или нестандартных атрибутах куки, таких как
port.Предупреждение
Перед сохранением сделайте резервную копию своих куки, если их потеря/повреждение может быть неудобна (есть некоторые тонкости, которые могут привести к небольшим изменениям в файле при многократном загрузке/сохранении).
Также обратите внимание, что куки, сохраненные во время работы Mozilla, будут перезаписаны Mozilla.
-
Класс
FileCookieJar, который может загружать и сохранять куки на диск в формате, совместимом с библиотекой libwww-perlSet-Cookie3. Это удобно, если вы хотите хранить куки в человекочитаемом файле.
Объекты политики куки
-
Возвращает булево значение, указывающее, следует ли принять куки от сервера.
cookie — экземпляр
Cookie. request — объект, реализующий интерфейс, определенный в документации дляCookieJar.extract_cookies().
-
Возвращает булево значение, указывающее, следует ли вернуть куки серверу.
cookie — экземпляр
Cookie. request — объект, реализующий интерфейс, определенный в документации дляCookieJar.add_cookie_header().
-
Возвращает
False, если куки не должны быть возвращены, учитывая домен куки.Этот метод является оптимизацией. Он устраняет необходимость проверки каждого куки с определенным доменом (что может потребовать чтения многих файлов). Возвращение true из
domain_return_ok()иpath_return_ok()оставляет всю работуreturn_ok().Если
domain_return_ok()возвращает true для домена куки, вызываетсяpath_return_ok()для пути куки. В противном случае,path_return_ok()иreturn_ok()никогда не вызываются для этого домена куки. Еслиpath_return_ok()возвращает true,return_ok()вызывается с объектомCookieдля полной проверки. В противном случае,return_ok()никогда не вызывается для этого пути куки.Обратите внимание, что
domain_return_ok()вызывается для каждого домена cookie, а не только для домена request. Например, функция может быть вызвана как с".example.com", так и с"www.example.com", если домен запроса равен"www.example.com". То же самое касаетсяpath_return_ok().Аргумент request соответствует документации для
return_ok().
-
Возвращает
False, если куки не должны быть возвращены, учитывая путь куки.См. документацию для
domain_return_ok().
Помимо реализации методов выше, реализации интерфейса CookiePolicy также должны предоставить следующие атрибуты, указывающие, какие протоколы следует использовать и как. Все эти атрибуты могут быть назначены.
-
Реализовать протокол Netscape.
-
Реализовать протокол **RFC 2965**.
-
Не добавлять заголовок Cookie2 в запросы (наличие этого заголовка указывает серверу, что мы понимаем куки **RFC 2965**).
Наиболее полезный способ определения класса CookiePolicy — это наследование от DefaultCookiePolicy и переопределение некоторых или всех методов выше. Сам CookiePolicy может использоваться в качестве «нулевой политики», позволяя устанавливать и получать любые куки (это маловероятно, что будет полезно).
Объекты политики куки по умолчанию
Обеспечивает поддержку куки **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, этот класс позволяет блокировать и разрешать домены установки и получения куки. Также есть несколько переключателей строгости, которые позволяют немного ужесточить довольно свободные правила протокола Netscape (в ущерб блокированию некоторых безобидных куки).
Предоставляется чёрный и белый список доменов (оба отключены по умолчанию). Только домены, отсутствующие в чёрном списке и присутствующие в белом списке (если белый список активен), участвуют в установке и возврате куки. Используйте аргумент конструктора blocked_domains и методы blocked_domains() и set_blocked_domains() (и соответствующие аргументы и методы для allowed_domains). Если вы установили белый список, вы можете его отключить, установив его в None.
Домены в чёрном или белом списках, которые не начинаются с точки, должны быть равны домену куки для сопоставления. Например, "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 в чёрном списке для установки или получения куки.
-
Возвращает
None, или последовательность разрешённых доменов (в виде кортежа).
-
Устанавливает последовательность разрешённых доменов или
None.
-
Возвращает значение, указывающее, запрещён ли домен domain для установки или получения куки.
DefaultCookiePolicy экземпляры имеют следующие атрибуты, которые все инициализируются из аргументов конструктора с одноимёнными именами и к которым можно обращаться.
-
Если True, запрашивает, чтобы экземпляр
CookieJarпонижал версию куки RFC 2109 (т.е. куки, полученные в заголовке Set-Cookie с атрибутом версии cookie равным 1) до куки Netscape, установив атрибут версии экземпляраCookieв 0. Значение по умолчанию —None, в этом случае куки RFC 2109 понижаются, если и только если обработка RFC 2965 отключена. Таким образом, куки RFC 2109 по умолчанию понижаются.
Общие флаги жёсткости:
-
Не разрешает сайтам устанавливать двухкомпонентные домены с доменными зонами страны, например
.co.uk,.gov.uk,.co.nz. И т.д. Это далеко не идеально и не гарантирует работоспособности!
RFC 2965 флаги жёсткости протокола:
-
Следуйте правилам RFC 2965 для непроверяемых транзакций (обычно непроверяемой транзакцией является та, которая является результатом перенаправления или запроса изображения, размещённого на другом сайте). Если это значение равно false, куки никогда не блокируются на основе проверяемости.
Флаги жёсткости протокола Netscape:
-
Применяйте правила RFC 2965 для непроверяемых транзакций даже для куки Netscape.
-
Флаги, определяющие, насколько строго следует соблюдать правила соответствия домена для куки Netscape. Допустимые значения см. ниже.
-
Игнорировать куки в заголовках Set-Cookie, имена которых начинаются с
'$'.
-
Не разрешать установку куки, путь которой не соответствует запрошенному URI.
strict_ns_domain — это набор флагов. Его значение формируется путём побитового объединения (например, DomainStrictNoDots|DomainStrictNonDomain означает, что оба флага установлены).
-
При установке куки «префикс хоста» не должен содержать точки (например,
www.foo.bar.comне может установить куки для.bar.com, потому чтоwww.fooсодержит точку).
-
Куки, которые явно не указали атрибут куки
domain, могут быть возвращены только в домен, равный домену, который установил куки (например,spam.example.comне получит куки отexample.com, у которых отсутствовал атрибут кукиdomain).
-
При установке куки требуется полное соответствие домену согласно RFC 2965.
Следующие атрибуты предоставлены для удобства и представляют собой наиболее полезные комбинации вышеуказанных флагов:
-
Эквивалентно 0 (т.е. все вышеперечисленные флаги жёсткости домена Netscape отключены).
-
Эквивалентно
DomainStrictNoDots|DomainStrictNonDomain.
Объекты куки
Cookie экземпляры имеют атрибуты Python, примерно соответствующие стандартным атрибутам куки, указанным в различных стандартах куки. Соответствие не является взаимно однозначным, поскольку существуют сложные правила для присвоения значений по умолчанию, поскольку атрибуты куки max-age и expires содержат эквивалентную информацию, и поскольку куки RFC 2109 могут быть «снижены» модулем http.cookiejar с версии 1 до версии 0 (куки Netscape).
Присваивание этих атрибутов не должно быть необходимым, за исключением редких случаев в методе CookiePolicy. Класс не гарантирует внутреннюю согласованность, поэтому вы должны понимать, что вы делаете, если это сделаете.
-
Целое число или
None. Куки Netscape имеютversion0. RFC 2965 и RFC 2109 куки имеют атрибут кукиversionравный 1. Однако обратите внимание, что модульhttp.cookiejarможет «снижать» куки RFC 2109 до куки Netscape, в этом случаеversionравно 0.
-
Имя куки (строка).
-
Значение куки (строка) или
None.
-
Строка, представляющая порт или набор портов (например, «80» или «80,8080»), или
None.
-
Путь куки (строка, например,
'/acme/rocket_launchers').
-
Trueесли куки должна быть возвращена только по защищённому соединению.
-
Дата истечения срока действия в секундах с начала эпохи, или
None. См. также методis_expired().
-
Trueесли это куки сессии.
-
Строка комментария от сервера, поясняющая функцию этой куки, или
None.
-
URL ссылки на комментарий от сервера, поясняющий функцию этой куки, или
None.
-
Trueесли эта куки была получена как куки RFC 2109 (т.е. куки была получена в заголовке Set-Cookie, а атрибут версии куки в этом заголовке был равен 1). Этот атрибут предоставляется, потому что модульhttp.cookiejarможет «снижать» куки RFC 2109 до куки Netscape, в этом случаеversionравно 0.
-
Trueесли порт или набор портов были явно указаны сервером (в заголовке Set-Cookie / Set-Cookie2).
-
Trueесли домен был явно указан сервером.
-
Trueесли домен, явно указанный сервером, начинался с точки ('.').
Файлы cookie могут иметь дополнительные нестандартные атрибуты. К ним можно получить доступ, используя следующие методы:
-
Возвращает
Trueесли файл cookie имеет указанный атрибут.
-
Если файл cookie имеет указанный атрибут, возвращает его значение. В противном случае возвращает default.
-
Устанавливает значение указанного атрибута файла cookie.
Класс Cookie также определяет следующий метод:
-
Trueесли время жизни файла cookie истекло. Если задано значение now (в секундах с начала эпохи), возвращает, истек ли срок действия файла cookie в указанное время.
Примеры
Первый пример демонстрирует наиболее распространенное использование 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.7/library/http.cookiejar.html