web-dev-qa-db-ja.com

要求モジュールを使用して、要求応答で「set-cookie」を処理する方法は?

ログインページ(GET)を開き、Webサーバーから提供されたCookieを取得してから、ユーザー名とパスワードのペアを送信してサイトにログインしようとしています(POST)。

このStackoverflowの質問/回答 を見ると、私は次のことを行うだけだと思います:

import requests
import cookielib


URL1 = 'login Prompt page'
URL2 = 'login submission URL'
jar = cookielib.CookieJar()

r = requests.get(URL1, cookies=jar)
r2 = requests.post(URL2, cookies=jar, data="username and password data payload")

ただし、rではヘッダーにset-cookieがありますが、jarオブジェクトでは変更されません。実際、リンクされた質問の応答が示すように、jarには何も入力されていません。

私はコードでヘッダーdictを使用してこれを回避し、GETまたはPOSTを実行した後、これを使用してset-cookieヘッダーを処理します。

headers['Cookie'] = r.headers['set-cookie']

次に、リクエストメソッドのヘッダーを渡します。これは正しいですか、それともset-cookieを適用するより良い方法はありますか?

18
tommy_o

Cookie-jarを無視して、requestsにcookieを処理させます。代わりに セッションオブジェクト を使用してください。Cookieが永続化され、サーバーに送信されます。

with requests.Session() as s:
    r = s.get(URL1)
    r = s.post(URL2, data="username and password data payload")
53
Martijn Pieters

この種のことを自動的に処理する session というインクルードクラスがあります。そのインスタンスを作成し、代わりにそのインスタンスでgetsetを呼び出すことができます。

import requests

URL1 = 'login Prompt page'
URL2 = 'login submission URL'

session = requests.Session()

r = session.get(URL1)
r2 = session.post(URL2, data="username and password data payload")
10
TankorSmash

セッションオブジェクト を使用せずに)私のために働いた別の方法は次のとおりです(v2.18.4でテストされています)。

jar = requests.cookies.RequestsCookieJar()
response1 = requests.get(some_url, cookies=jar) # or post ...
jar.update(response1.cookies)
response2 = requests.get(some_other_url, cookies=jar) # or post ...

上記のコードは Requests ライブラリによって透過的に処理されるリダイレクトがあると失敗します。このような場合、リダイレクト応答で送信されたCookieを使用してjarを更新する必要もあります。例えば。次のようなことをすることによって:

if (response.history): # we have to add to the cookie jar, the cookies sent by the server in intermediate responses 
    for historicResponse in response.history:
        jar.update(historicResponse.cookies)