5

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().

これは、私の最初の方法がうまくいくはずだと言っているようですが、そうではありません。

これについて何か助けていただければ幸いです - 紛らわしく、ドキュメントが大幅に不足しているようです。

4

2 に答える 2

2

Mechanize を使用して Shibboleth Web サイトを認証しているときに、まったく同じメッセージに出くわしました。あなたと同じ間違いをしたからです。と、なんとなくわかったような気がします。

簡潔な答え

開く必要があるリンクは次のとおりです。

br.open("https://web30.uottawa.ca/Shibboleth.sso/Login?target=https://web30.uottawa.ca/hr/web/post-register")

それ以外の:

br.open("https://idp.uottawa.ca/idp/login.jsp?actionUrl=%2Fidp%2FAuthn%2FUserPassword")

なんで?

Shibboleth: 1 回の簡単なログインで、さまざまなサービスに簡単かつ安全に接続できます。

どのサービスにログインしたいかを彼に伝えなければ、Shibboleth ログイン自体は役に立ちません。HTTP ヘッダーを分析し、両方のクエリで取得した Cookie を比較してみましょう。

1. https://idp.uottawa.ca/idp/login.jsp?actionUrl=%2Fidp%2FAuthn%2FUserPassword を開く

Cookie: JSESSIONID=C2D4A19B2994BFA287A328F71A281C49; _ga=GA1.2.1233451770.1401374115; arp_scroll_position=-1; tools-resize=tools-resize-small; lang-prev-page=en; __utma=251309913.1233451770.1401374115.1401375882.1401375882.1; __utmb=251309913.14.9.1401376471057; __utmz=251309913.1401375882.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); lang=en

2. https://web30.uottawa.ca/Shibboleth.sso/Login?target=https://web30.uottawa.ca/hr/web/post-registerを開く

Cookie: JSESSIONID=8D6BEA53823CC1C3045B2CE3B1D61DB0; _idp_authn_lc_key=fc18251e-e5aa-4f77-bb17-5e893d8d3a43; _ga=GA1.2.1233451770.1401374115; arp_scroll_position=-1; tools-resize=tools-resize-small; lang-prev-page=en; __utma=251309913.1233451770.1401374115.1401375882.1401375882.1; __utmb=251309913.16.9.1401378064938; __utmz=251309913.1401375882.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); lang=en

違いは何ですか?もう 1 つの Cookie があります: _idp_authn_lc_key=1c21128c-2fd7-45d2-adac-df9db4d0a9ad;「そこにログインしたい」というCookieだと思います。

認証プロセス中に、IdP は _idp_authn_lc_key という名前の Cookie を設定します。この Cookie には、現在の認証プロセス (通常は複数の要求/応答にまたがる) を識別するために必要な情報のみが含まれ、認証プロセスが完了すると削除されます。

ソース: https://wiki.shibboleth.net/confluence/display/SHIB2/IdPCookieUsage


どうやって そのリンクを見つけたのですか? 実際にウェブを掘り下げたところ、https: //web30.uottawa.ca/hr/web/en/user/registration が次のリンクを含むログイン フォームにリダイレクトされることがわかりました。

<a href="https://web30.uottawa.ca/Shibboleth.sso/Login?target=https://web30.uottawa.ca/hr/web/post-register" 
   class="button standard"><span>Create your account using infoweb</span></a>

それは Mechanize の問題ではありませんでしたが、それ以上に Shibboleth は一見すると少しわかりにくいです。Shibboleth 認証フローの詳細については、こちらを参照してください。

于 2014-05-29T16:20:40.783 に答える
-3

The website you're submitting your form data to probably needs a CSRF token (a cookie provided in the form you're skipping the download of.)

Try using Requests:

http://docs.python-requests.org/en/latest/user/quickstart/#cookies

Look for the cookies and/or hidden form fields and then fire away.

于 2012-12-07T01:11:35.920 に答える