Bagaimana cara mengirim cookie dalam permintaan posting dengan pustaka Permintaan Python?

96

Saya mencoba menggunakan pustaka Permintaan untuk mengirim cookie dengan permintaan kiriman, tetapi saya tidak yakin bagaimana sebenarnya menyiapkan cookie berdasarkan dokumentasinya. Skrip ini untuk digunakan di Wikipedia, dan cookie yang perlu dikirim adalah dalam bentuk ini:

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

Namun, panduan mulai cepat requestsdokumentasi memberikan ini sebagai satu-satunya contoh:

cookies = dict(cookies_are='working')

Bagaimana cara saya menyandikan cookie seperti di atas menggunakan perpustakaan ini? Apakah saya perlu membuatnya dengan pustaka cookie standar python, lalu mengirimkannya bersama dengan permintaan POST?

Ricardo Altamirano
sumber
2
Cookie Anda terdiri dari beberapa a=b;pasang. Saat menebak, gunakan asebagai kunci dan bsebagai nilai dalam kamus.
Thomas K

Jawaban:

218

Rilis terbaru Permintaan akan membuat CookieJars untuk Anda dari kamus sederhana.

import requests

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

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

Nikmati :)

Kenneth Reitz
sumber
Apakah kode ini seharusnya menempatkan cookie di browser saya? Saya mencobanya dan tidak berhasil untuk saya.
Chris Nielsen
15
@ChrisNielsen pertanyaan / jawaban ini tidak ada hubungannya dengan browser
ThiefMaster
@ThiefMaster: Biasanya, cookie ada di browser. Jika jawaban ini tidak ada hubungannya dengan browser, apa hubungannya dengan itu?
Chris Nielsen
4
@ChrisNielsen: Pertanyaan ini dan kode jawabannya adalah tentang menyetel cookie dalam permintaan Python. Permintaan tersebut melakukan sesuatu yang mirip dengan permintaan browser, tetapi tidak ada browser yang terlibat.
DDay
119

Hanya untuk memperluas jawaban sebelumnya, jika Anda menautkan dua permintaan bersama dan ingin mengirim cookie yang dikembalikan dari yang pertama ke yang kedua (misalnya, mempertahankan sesi tetap hidup di seluruh permintaan), Anda dapat melakukan:

import requests
r1 = requests.post('http://www.yourapp.com/login')
r2 = requests.post('http://www.yourapp.com/somepage',cookies=r1.cookies)
oarevalo.dll
sumber
54
Selain itu, Anda dapat menggunakan requests.sessionuntuk hal ini, menyimpan cookie di beberapa sesi, membuat panggilan dari sessionobjek yang dikembalikan sebagai gantinya.
TankorSmash
7
Saya harus memanfaatkan ini bahkan saat menggunakan sesi di kali. Sesi tampaknya kehilangan header Set-Cookie dalam beberapa situasi.
kervin
1
@kervin ini baru saja terjadi pada saya juga. Sepertinya ada bug dalam request, karena session harus menanganinya.
deweydb
3
@TankorSmash pasti ada bug, cookie saya tidak dibawa ke depan menggunakanrequest.session
Tjorriemorrie
Apakah ini cara terbaik untuk menyetel cookie (terlewat) dalam sebuah sesi? stackoverflow.com/a/17240616/143397
davidA
0

Jika Anda ingin meneruskan cookie ke browser, Anda harus menambahkan header untuk dikirim kembali. Jika Anda menggunakan 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]

Saya berhasil mengotentikasi dengan Bugzilla dan TWiki yang dihosting di domain yang sama, skrip wsgi python saya berjalan dengan meneruskan pengguna / kata sandi auth ke skrip python saya dan meneruskan cookie ke browser. Ini memungkinkan saya untuk membuka halaman Bugzilla dan TWiki di browser yang sama dan diautentikasi. Saya mencoba melakukan hal yang sama dengan SuiteCRM tetapi saya mengalami masalah dengan SuiteCRM dalam menerima cookie sesi yang diperoleh dari skrip python meskipun telah berhasil diautentikasi.

Berusaha lebih keras
sumber