Як надіслати файли cookie у запиті на публікацію за допомогою бібліотеки запитів Python?


94

Я намагаюся використовувати бібліотеку запитів для надсилання файлів 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

Відповіді:


214

Останній випуск Requests створить для вас CookieJars із простих словників.

import requests

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

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

Насолоджуйтесь :)


Чи повинен цей код розміщувати файли cookie у моєму браузері? Я спробував, і у мене це не спрацювало.
Chris Nielsen,

15
@ChrisNielsen це питання / відповідь не має нічого спільного з браузерами
ThiefMaster

@ThiefMaster: Зазвичай файли cookie містяться у браузерах. Якщо ця відповідь не пов’язана з браузерами, з чим це пов’язано?
Кріс Нільсен,

4
@ChrisNielsen: Це питання та код у відповіді стосуються встановлення файлу cookie у запиті Python. Запит робить щось подібне до запиту браузера, але жоден браузер не бере участь.
ДД

118

Щоб продовжити попередню відповідь, якщо ви пов’язуєте два запити разом і хочете надіслати файли cookie, повернуті з першого на другий (наприклад, підтримуючи живий сеанс між запитами), ви можете зробити:

import requests
r1 = requests.post('http://www.yourapp.com/login')
r2 = requests.post('http://www.yourapp.com/somepage',cookies=r1.cookies)

54
Крім того, ви можете використовувати саме requests.sessionдля цього, зберігаючи файли cookie протягом декількох сеансів, роблячи sessionзамість цього дзвінки з повернутого об'єкта.
TankorSmash

7
Мені доводилося використовувати це, навіть використовуючи сеанси часом. У деяких ситуаціях сеанси, як видається, пропускають заголовки Set-Cookie.
kervin

1
@kervin це теж трапилося і зі мною. Схоже на помилку в запитах, оскільки сесія повинна це обробляти.
deweydb

3
@TankorSmash, безумовно, є помилка, мої файли cookie не переносяться за допомогоюrequest.session
Tjorriemorrie 02

Це найкращий спосіб встановити (пропущений) файл 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, розміщених у тому самому домені, в якому запущений скрипт wsgi python, передавши аутентифікацію користувача / пароль моєму сценарію python та передавши файли cookie браузеру. Це дозволяє мені відкривати сторінки Bugzilla та TWiki в одному веб-переглядачі та пройти автентифікацію. Я намагаюся зробити те саме з SuiteCRM, але у мене проблеми з SuiteCRM, приймаючи файли cookie сеансу, отримані зі сценарію python, навіть якщо він успішно пройшов аутентифікацію.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.