Pythonリクエストライブラリを使用してポストリクエストでCookieを送信する方法


94

Requestsライブラリを使用して、ポストリクエストでCookieを送信しようとしていますが、ドキュメントに基づいて実際にCookieを設定する方法がわかりません。スクリプトはWikipediaで使用するためのものであり、送信する必要があるCookieは次の形式です。

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

ただし、requestsドキュメントのクイックスタートでは、これを唯一の例として示しています。

cookies = dict(cookies_are='working')

このライブラリを使用して、上記のようなCookieをどのようにエンコードできますか?Pythonの標準Cookieライブラリで作成し、POSTリクエストと共に送信する必要がありますか?


2
あなたのクッキーはいくつかのa=b;ペアで構成されています。推測では、辞書のaキーおよびb値として使用します。
トーマスK

回答:


214

リクエストの最新リリースでは、シンプルな辞書からCookieJarが作成されます。

import requests

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

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

楽しい :)


このコードはブラウザにCookieを配置することになっていますか?試してみましたが、うまくいきませんでした。
Chris Nielsen

15
@ChrisNielsenこの質問/回答はブラウザとは関係ありません
ThiefMaster

@ThiefMaster:通常、Cookieはブラウザーに存在します。この答えがブラウザと関係がない場合、それは何と関係がありますか?
Chris Nielsen

4
@ChrisNielsen:この質問と回答のコードは、PythonリクエストでのCookieの設定に関するものです。リクエストはブラウザリクエストと同様の処理を行いますが、ブラウザは関与しません。
Dデイ

118

前の回答を拡張すると、2つの要求をリンクしていて、最初の要求から2番目の要求に返された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 2012年

7
時々セッションを利用する時もこれを利用しなければなりませんでした。一部の状況では、セッションがSet-Cookieヘッダーを見逃しているようです。
ケルビン2013

1
@kervinこれは私にも起こりました。セッションはそれを処理する必要があるため、リクエストのバグのようです。
deweydb 2013

3
@TankorSmash間違いなくバグがあり、私のCookieは使用されませんrequest.session
Tjorriemorrie

これは、セッションで(欠落した)Cookieを設定する最良の方法ですか?stackoverflow.com/a/17240616/143397
davidA '21

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]

私のpython wsgiスクリプトが実行している同じドメインでホストされているBugzillaとTWikiで認証することに成功しました。これは、Pythonスクリプトにauth user / passwordを渡し、ブラウザにCookieを渡すことによって実行されます。これにより、BugzillaとTWikiのページを同じブラウザーで開いて認証を受けることができます。SuiteCRMで同じことをしようとしていますが、SuiteCRMが認証に成功したにもかかわらず、Pythonスクリプトから取得したセッションCookieを受け入れるのに問題があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.