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

96

Я пытаюсь использовать библиотеку запросов для отправки файлов cookie с почтовым запросом, но я не уверен, как на самом деле настроить файлы cookie на основе документации. Скрипт предназначен для использования в Википедии, а файлы cookie, которые необходимо отправить, имеют следующую форму:

enwiki_session=17ab96bd8ffbe8ca58a78657a918558e; path=/; domain=.wikipedia.com; HttpOnly

Однако в requestsкратком руководстве по документации это единственный пример:

cookies = dict(cookies_are='working')

Как я могу закодировать файл cookie, подобный приведенному выше, с помощью этой библиотеки? Нужно ли мне делать это со стандартной библиотекой файлов cookie Python, а затем отправлять ее вместе с запросом POST?

Рикардо Альтамирано
источник
2
Ваш файл cookie состоит из нескольких a=b;пар. Предположительно, используйте aкак ключ и bкак значение в словаре.
Thomas K

Ответы:

218

Последний выпуск Requests будет создавать CookieJars для вас из простых словарей.

import requests

cookies = {'enwiki_session': '17ab96bd8ffbe8ca58a78657a918558'}

r = requests.post('http://wikipedia.org', cookies=cookies)

Наслаждаться :)

Кеннет Райтц
источник
Этот код должен размещать cookie в моем браузере? Я попробовал, и у меня ничего не вышло.
Крис Нильсен
15
@ChrisNielsen, этот вопрос / ответ не имеет ничего общего с браузерами
ThiefMaster
@ThiefMaster: Обычно файлы cookie хранятся в браузерах. Если этот ответ не имеет отношения к браузерам, то при чем здесь?
Крис Нильсен
4
@ChrisNielsen: Этот вопрос и код в ответе касаются установки cookie в запросе Python. Запрос делает что-то похожее на запрос браузера, но браузеры не задействованы.
ДДень
119

Чтобы продолжить предыдущий ответ, если вы связываете два запроса вместе и хотите отправить файлы cookie, возвращенные из первого, во второй (например, поддерживая сеанс в рабочем состоянии между запросами), вы можете сделать:

import requests
r1 = requests.post('http://www.yourapp.com/login')
r2 = requests.post('http://www.yourapp.com/somepage',cookies=r1.cookies)
Oarevalo
источник
54
Кроме того, вы можете использовать requests.sessionименно это, сохраняя файлы cookie в нескольких сеансах, sessionвместо этого выполняя вызовы из возвращенного объекта.
ТанкорСмаш
7
Мне приходилось использовать это даже во время сеансов. Кажется, что в некоторых ситуациях сеансы пропускают заголовки Set-Cookie.
kervin
1
@kervin, это тоже со мной случилось. Похоже на ошибку в запросах, потому что сессия должна с этим справиться.
deweydb 08
3
@TankorSmash, это определенно ошибка, мои куки не переносятся с использованиемrequest.session
Tjorriemorrie
Это лучший способ установить (пропущенный) файл cookie в сеансе? stackoverflow.com/a/17240616/143397
davidA
0

Если вы хотите передать файл cookie в браузер, вам нужно добавить его к заголовкам, которые будут отправлены обратно. Если вы используете wsgi:

import requests
...


def application(environ, start_response):
    cookie = {'enwiki_session': '17ab96bd8ffbe8ca58a78657a918558'}
    response_headers = [('Content-type', 'text/plain')]
    response_headers.append(('Set-Cookie',cookie))
...

    return [bytes(post_env),response_headers]

Я успешно могу пройти аутентификацию с помощью Bugzilla и TWiki, размещенных в том же домене, в котором запущен мой скрипт python wsgi, путем передачи пользователя / пароля аутентификации в мой скрипт Python и передачи файлов cookie в браузер. Это позволяет мне открывать страницы Bugzilla и TWiki в одном браузере и проходить аутентификацию. Я пытаюсь сделать то же самое с SuiteCRM, но у меня проблемы с тем, что SuiteCRM принимает файлы cookie сеанса, полученные из сценария python, даже если он успешно прошел проверку подлинности.

Стараться
источник