22

cookies.txtPython Requests を使用して、(Chrome 拡張機能で生成された) ファイルを使用して認証済みサイトにアクセスしようとしています。

import requests, cookielib

cj = cookielib.MozillaCookieJar('cookies.txt')
cj.load()
r = requests.get(url, cookies=cj)

エラーや例外はスローされませんが、ログイン画面が誤って生成されます。ただし、Cookie ファイルを使用してコンテンツを正常に取得できるため、Cookie ファイルが有効であることはわかっていますwget。私が間違っていることは何か分かりますか?

編集:

追跡cookielib.MozillaCookieJar._really_loadしていて、Cookie が正しく解析されていることを確認できます (つまりdomainpathsecure、 などのトークンの値が正しい)。しかし、トランザクションはまだログイン フォームで行われているため、wget何か追加の処理を行っているように見えます (まったく同じcookies.txtファイルが機能するため)。

4

5 に答える 5

15

MozillaCookieJarFileCookieJarコンストラクターに次の docstring がある 継承元:

Cookies are NOT loaded from the named file until either the .load() or
.revert() method is called.

.load()次に、メソッドを呼び出す必要があります。

また、Jermaine Xu が指摘したように、ファイルの最初の行には# Netscape HTTP Cookie Fileまたは# HTTP Cookie File文字列を含める必要があります。使用するプラグインによって生成されたファイルにはそのような文字列が含まれていないため、自分で挿入する必要があります。http://code.google.com/p/cookie-txt-export/issues/detail?id=5で適切なバグを報告しました

編集

セッション Cookie は、5 列目に 0 で保存されます。ignore_expires=Trueメソッドに渡さない場合load()、ファイルからロードするときにそのような Cookie はすべて破棄されます。

ファイルsession_cookie.txt:

# Netscape HTTP Cookie File
.domain.com TRUE    /   FALSE   0   name    value

Python スクリプト:

import cookielib

cj = cookielib.MozillaCookieJar('session_cookie.txt')
cj.load()
print len(cj)

出力: 0

編集2

上記の jar に Cookie を取得することはできましたが、属性にまだ値があるため、後で破棄されます。これを防ぐには、次のように有効期限を将来の時間に設定する必要があります。cookielib0expires

for cookie in cj:
    # set cookie expire date to 14 days from now
    cookie.expires = time.time() + 14 * 24 * 3600

編集3

私は wget と curl の両方をチェックし、どちらも0有効期限を使用してセッション Cookie を示します。これは事実上の標準であることを意味します。ただし、Python の実装では同じ目的で空の文字列を使用しているため、問題が発生しました。この点に関する Python の動作は、wget と curl が行うことと一致しているべきだと思います。そのため、http://bugs.python.org/issue17164でバグを報告しました。5列目の s を空の文字列に
置き換えることに注意してください。問題を解決する別の方法は0、入力ファイルの有効期限を変更してに渡すignore_discard=Trueことload()です (この場合、有効期限を変更する必要はありません)。

于 2013-02-07T19:47:16.233 に答える
-1

私はついにそれを機能させる方法を見つけました(私はのcurl冗長な出力を見てアイデアを得ました):ファイルからCookieをロードする代わりにdict、必要なvalue/nameペアでを作成しました:

cd = {'v1': 'n1', 'v2': 'n2'}
r = requests.get(url, cookies=cd)

そしてそれは機能しました(以前の方法が機能しなかった理由は説明されていませんが)。すべての助けをありがとう、それは本当に感謝しています。

于 2013-02-07T22:21:53.757 に答える