Cookie を必要とする Web ページのログイン フォームに入力し、結果のページに関する情報を取得する必要があります。これは夜の非常に奇妙な時間に実行する必要があるため、プロセスを自動化したいので、機械化を使用しています (他の提案は大歓迎です - 学校のサーバーでスクリプトを実行する必要があることに注意してください。新しいソフトウェアをインストールします。Mechanize は純粋な python であるため、この問題を回避できます)。
問題は、ログイン フォームをホストするページで、Cookie を受け入れて送信できる必要があることです。理想的には、自分の Cookie をハードコードするのではなく、サーバーが送信するすべての Cookie を受け入れて送信できるようにしたいと考えています。
そこで、mechanize を使用してスクリプトを作成することにしましたが、Cookie の処理が間違っているようです。役立つドキュメントがどこにも見つからないので (盲目な場合は指摘してください)、ここで質問します。
これが私の機械化スクリプトです:
import mechanize as mech
br = mech.Browser()
br.set_handle_robots(False)
print "No Robots"
br.set_handle_redirect(True)
br.open("some internal uOttawa website")
br.select_form(nr=0)
br.form['j_username'] = 'my username'
print "Login: ************"
br.form['j_password'] = 'my password'
print "Password: ************"
response = br.submit()
print response.read()
これにより、次のように出力されます
No Robots
Login: ************
Password: ************
<html>
<body>
<img src="/idp/images/uottawa-logo-dark.png" />
<h3>ERROR</h3>
<p>
An error occurred while processing your request. Please contact your helpdesk or
user ID office for assistance.
</p>
<p>
This service requires cookies. Please ensure that they are enabled and try your
going back to your desired resource and trying to login again.
</p>
<p>
Use of your browser's back button may cause specific errors that can be resolved by
going back to your desired resource and trying to login again.
</p>
<p>
If you think you were sent here in error,
please contact technical support
</p>
</body>
</html>
これは実際、Chrome ブラウザで Cookie を無効にして同じことを試みた場合に表示されるページです。
次のようにクッキージャーを追加しようとしましたが、うまくいきませんでした。
br = mech.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
複数の機械化ドキュメント ソースを調べました。そのうちの1人が言及
A common mistake is to use mechanize.urlopen(), and the .extract_cookies() and
.add_cookie_header() methods on a cookie object themselves.
If you use mechanize.urlopen() (or OpenerDirector.open()),
the module handles extraction and adding of cookies by itself,
so you should not call .extract_cookies() or .add_cookie_header().
これは、私の最初の方法がうまくいくはずだと言っているようですが、そうではありません。
これについて何か助けていただければ幸いです - 紛らわしく、ドキュメントが大幅に不足しているようです。