Как отключить обработку файлов cookie с помощью библиотеки запросов Python?

Когда я использую запросы для доступа к URL-адресу , файлы cookie автоматически отправляются обратно на сервер (в следующем примере запрошенный URL-адрес задает некоторые значения cookie, а затем перенаправляет на другой URL-адрес, отображающий сохраненный файл cookie)

>>> import requests
>>> response = requests.get("http://httpbin.org/cookies/set?k1=v1&k2=v2")
>>> response.content
'{\n  "cookies": {\n    "k2": "v2",\n    "k1": "v1"\n  }\n}'

Можно ли временно отключить обработку файлов cookie так же, как вы устанавливаете Chrome или Firefox, чтобы не принимать файлы cookie?

Например, если я получаю доступ к указанному выше URL-адресу с Chrome с отключенной обработкой файлов cookie, я получаю то, что ожидал:

{
  "cookies": {}
}

Ответ 1

Вы можете сделать это, указав политику cookie, чтобы отклонить все файлы cookie:

from http import cookiejar  # Python 2: import cookielib as cookiejar
class BlockAll(cookiejar.CookiePolicy):
    return_ok = set_ok = domain_return_ok = path_return_ok = lambda self, *args, **kwargs: False
    netscape = True
    rfc2965 = hide_cookie2 = False

(Обратите внимание, что API http.cookiejar API требует, чтобы вы определили набор атрибутов и методов, как показано.)

Затем установите политику файлов cookie в сеансе запросов:

import requests
s = requests.Session()
s.cookies.set_policy(BlockAll())

Теперь он не будет хранить и не отправлять файлы cookie:

s.get("https://httpbin.org/cookies/set?foo=bar")
assert not s.cookies

В стороне, если вы посмотрите на код, методы удобства в пакете requests (в отличие от объектов requests.Session) каждый раз создают новый Session. Поэтому куки файлы не сохраняются между отдельными вызовами requests.get. Однако, если первая страница устанавливает куки, а затем выдает перенаправление HTTP, на целевой странице будут отображаться файлы cookie. (Это то, что происходит с вызовом HTTPBin /cookies/set, который перенаправляется на /cookies.)

Итак, в зависимости от того, какое поведение вы хотите перенаправить, вам может не понадобиться ничего особенного. Для сравнения:

>>> print(requests.get("https://httpbin.org/cookies/set?foo=bar").json())
{'cookies': {'foo': 'bar'}}
>>> print(requests.get("https://httpbin.org/cookies").json())
{'cookies': {}}

>>> s = requests.Session()
>>> print(s.get("https://httpbin.org/cookies/set?foo=bar").json())
{'cookies': {'foo': 'bar'}}
>>> print(s.get("https://httpbin.org/cookies").json())
{'cookies': {'foo': 'bar'}}

>>> s = requests.Session()
>>> s.cookies.set_policy(BlockAll())
>>> print(s.get("https://httpbin.org/cookies/set?foo=bar").json())
{'cookies': {}}
>>> print(requests.get("https://httpbin.org/cookies").json())
{'cookies': {}}

Ответ 2

>>> import mock
>>> import requests
>>> with mock.patch.object(requests.cookies.RequestsCookieJar, 'update', lambda *args, **kwargs: 0):
...     r = requests.get("http://httpbin.org/cookies/set?k1=v1&k2=v2")#, cookies=cj)
...     r.content
... 
'{\n  "cookies": {}\n}'
>>> r = requests.get("http://httpbin.org/cookies/set?k1=v1&k2=v2")
>>> r.content
'{\n  "cookies": {\n    "k2": "v2",\n    "k1": "v1"\n  }\n}'

Ответ 3

Вы возвращаетесь "k2": "v2", "k1": "v1", потому что они отправляются в параметрах GET. Если вы выполните второй запрос, вы увидите, что вы не отправляете файлы cookie. Если вы не используете requests.Session, cookie автоматически не обрабатывается в клиенте, и вы должны явно передавать dict или CookieJar с каждым запросом.

In [17]: r = requests.get("http://httpbin.org/cookies/set?k1=v1&k2=v2")

In [18]: r.content
Out[18]: '{\n  "cookies": {\n    "k2": "v2",\n    "k1": "v1"\n  }\n}'

In [20]: r.cookies.get_dict()
Out[20]: {}

In [21]: r = requests.get("http://httpbin.org/cookies")

In [22]: r.content
Out[22]: '{\n  "cookies": {}\n}'

Ответ 4

class BlockAll(CookiePolicy):
    def set_ok(self, cookie, request):
        return False
session.cookies.policy = BlockAll()