Jak wysłać pliki cookie w żądaniu postu z biblioteką Python Requests?

101

Próbuję użyć biblioteki Żądania, aby wysłać pliki cookie z żądaniem publikacji, ale nie jestem pewien, jak właściwie skonfigurować pliki cookie na podstawie jej dokumentacji. Skrypt jest przeznaczony do użytku w Wikipedii, a pliki cookie, które należy przesłać, mają następującą formę:

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

Jednak przewodnik requestsSzybki start podaje to jako jedyny przykład:

cookies = dict(cookies_are='working')

Jak mogę zakodować plik cookie taki jak powyżej, korzystając z tej biblioteki? Czy muszę to zrobić za pomocą standardowej biblioteki plików cookie Pythona, a następnie wysłać wraz z żądaniem POST?

Ricardo Altamirano
źródło
2
Twój plik cookie składa się z kilku a=b;par. Domyślnie użyj ajako klucza i bjako wartości w słowniku.
Thomas K

Odpowiedzi:

224

Najnowsza wersja Requests utworzy dla Ciebie CookieJars z prostych słowników.

import requests

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

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

Cieszyć się :)

Kenneth Reitz
źródło
Czy ten kod ma umieszczać plik cookie w mojej przeglądarce? Spróbowałem i to nie zadziałało.
Chris Nielsen
18
@ChrisNielsen to pytanie / odpowiedź nie ma nic wspólnego z przeglądarkami
ThiefMaster
@ThiefMaster: Zwykle pliki cookie działają w przeglądarkach. Jeśli ta odpowiedź nie ma nic wspólnego z przeglądarkami, co to ma wspólnego?
Chris Nielsen
5
@ChrisNielsen: To pytanie i kod w odpowiedzi dotyczą ustawienia pliku cookie w żądaniu Pythona. Żądanie działa podobnie do żądania przeglądarki, ale nie są zaangażowane żadne przeglądarki.
Dnia
122

Aby rozszerzyć poprzednią odpowiedź, jeśli łączysz ze sobą dwa żądania i chcesz wysłać pliki cookie zwrócone z pierwszego do drugiego (na przykład utrzymywanie aktywnej sesji między żądaniami), możesz wykonać:

import requests
r1 = requests.post('http://www.yourapp.com/login')
r2 = requests.post('http://www.yourapp.com/somepage',cookies=r1.cookies)
oarevalo
źródło
54
Dodatkowo możesz użyć requests.sessiondo tego dokładnie, przechowywania plików cookie w wielu sesjach, sessionzamiast tego wykonując wywołania z zwróconego obiektu.
TankorSmash
7
Musiałem to wykorzystać, nawet gdy czasami korzystałem z sesji. W niektórych sytuacjach sesje wydają się nie mieć nagłówków Set-Cookie.
kervin
1
@kervin to właśnie mi się przydarzyło. Wygląda na błąd w żądaniach, ponieważ sesja powinna to obsłużyć.
deweydb
3
@TankorSmash zdecydowanie jest błąd, moje pliki cookie nie są przenoszone do przodurequest.session
Tjorriemorrie
Czy to najlepszy sposób na ustawienie (pominiętego) pliku cookie w sesji? stackoverflow.com/a/17240616/143397
davidA
0

Jeśli chcesz przekazać plik cookie do przeglądarki, musisz dołączyć do nagłówków, które mają zostać odesłane. Jeśli używasz 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]

Mogę pomyślnie uwierzytelnić się za pomocą Bugzilli i TWiki hostowanych w tej samej domenie, w której działa mój skrypt Python wsgi, przekazując użytkownika uwierzytelniania / hasło do mojego skryptu Python i przekazując pliki cookie do przeglądarki. Dzięki temu mogę otwierać strony Bugzilla i TWiki w tej samej przeglądarce i być uwierzytelnianym. Próbuję zrobić to samo z SuiteCRM, ale mam problem z akceptacją przez SuiteCRM plików cookie sesji uzyskanych ze skryptu Pythona, mimo że został pomyślnie uwierzytelniony.

Próbuj dalej
źródło