0

前駆者: 昨日、ここで似たような質問をしました。その質問を編集しない理由は、この 2 つは似ていますが、こちらの方がはるかに高度だからです。

私のプロジェクト: Python を使用して、安全な Web サイトにログオンし、そのセッション内のいくつかのページに移動して、それらのページからテキストをファイルに抽出したいと考えています。

詳細: これは、私が収集したすべての情報/私が書いたコードです。

セキュリティで保護されたサイトのログオン ページの注目すべき部分を次に示します。

<form action="index.asp" method="post" name="form">
   <input type="text" id="user" name="user"">
   <input type="password" name="password">
   <input type="hidden" name="logon" value="username">
   <input type="submit" name="submit" value="Log In" class="button">
</form>

ページには Cookie をチェックする JavaScript コードもあるので、cookielib.CookieJar().

大きな編集

次のモジュールをインポートしています: urlliburllib2cookielibおよびnltk

次のコードを生成するには:

cookiejar = cookielib.CookieJar()

# Notice I set 'debug' to 'true'.
debug = True
handlers = [
                urllib2.HTTPHandler(debuglevel=debug),
                urllib2.HTTPSHandler(debuglevel=debug),
                urllib2.HTTPCookieProcessor(cookiejar),
           ]
opener = urllib2.build_opener(*handlers)
# These headers I copied directly from Chrome's Developer Tools
opener.addheaders = [
    ("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
    ("Accept-Encoding", "gzip,deflate,sdch"),
    ("Accept-Language", "en-US,en;q=0.8"),
    ("Cache-Control", "max-age=0"),
    ("Connection", "keep-alive"),
    ("Content-Type", "application/x-www-form-urlencoded"),
    ("Host", "www.myebill.com"),
    ("Origin", "https://www.myebill.com"),
    ("Referer", "https://www.myebill.com/index.asp?startnam"),
    ("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36")
                    ]
urllib2.install_opener(opener)

# Passing the form data as a URL-encoded string
payload = "user=<User>&password=<Password>&logon=username&submit=Log+In"

req = urllib2.Request("https://www.myebill.com/index.asp", data=payload)
cookiejar.add_cookie_header(req)
page = urllib2.urlopen(req)
pdata = page.read()

print( nltk.clean_html( pdata ) )

: デバッグ出力の投稿を希望される場合は、お問い合わせください。:)

私の問題: コードを実行した後、「セッションがタイムアウトしたか、正しくログオンしていません」というメッセージが表示されます。メッセージ。

助けてください?どんな提案やコードをいただければ幸いです。

また、答えが見つかったら、参照としてこれが必要な人に、完全なコードを編集として投稿することを約束します! (もちろん、ログオン情報は省略します..)

4

2 に答える 2

1

これを狙ってみます。まず、投稿された HTML フォーム コード スニペットに従って、フォームは GET URL に対して POST アクションを実行しますhttps://www.myebill.com/index.asp?nam。これが実際に POST したい URL であることをもう一度確認することをお勧めします。

そうは言っても、urllib2 はすでに HTTPSHandler をサポートしています。Python を使用して Web サービスにアクセスする方法については、関連するスタック オーバーフローの議論がここにあります。これはクエリとは直接関係ありませんが、この質問への回答には、プログラム経由で HTTPS を使用してログオンしようとするときに注意すべき点についての適切な指針が含まれています。具体的には、ヘッダー内のRefererタグの設定です。安全な Web サイトはこのメカニズムを使用して CSRF 攻撃から身を守るため、これが必要です。

以下のコード スニペットは、リクエストを行う前に行う必要がある最も重要な設定を示しています。Nullege Python for Simple Dropbox Loginからこれを取得しました

handlers = [
                urllib2.HTTPHandler(debuglevel=debug),
                urllib2.HTTPSHandler(debuglevel=debug),
                urllib2.HTTPCookieProcessor(cookiejar),
            ]
opener = urllib2.build_opener(*handlers)
urllib2.install_opener(opener)   #the opener will be used for all urlopen requests from now on.

HTTPSHandler の使用に注意してください。

次に、認証情報を入力します。

payload = urllib.urlencode({'username' : username, 'j_password' : password})

次に、ログインを実行します。

headers['Referer'] = self.urlbase #note the presence of the "Referer' header
req = urllib2.Request(url=self.urlbase+'login', data=data, headers=headers)
cookiejar.add_cookie_header(req)
page = urllib2.urlopen(req)
pdata = page.read()

これがあなたにどうやって行くかについてのアイデアを与えることを願っています..

于 2013-08-09T16:02:40.637 に答える
1

すべての助けてくれてありがとう、しかし私は最終的に Python のモジュールを使用して問題を解決しましたRequests

コードは次のとおりです。

import nltk
from requests import session

payload = {
    'user': '<Username>',
    'password': '<Password>',
    'logon': 'username',
    'submit': 'Log In'
}

headers = {
    'Referer': 'https://www.myebill.com/index.asp?startnam',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36'
    }

with session() as c:
    c.post('https://www.myebill.com/index.asp?startnam', data=payload, headers=headers)
    request = c.get('https://www.myebill.com/index.asp')
    print request.headers
    print( nltk.clean_html( request.text ) )

このコードを使用する人は、選択したプログラム (例: Wireshark、Chrome Developer Tools、Firefox Firebug など) でログイン セッションを監視し、「ペイロード」辞書をセッションのデータに置き換えることを忘れないでください。

助けてくれてありがとう!urllibいつの日か、 andurllib2メソッドについて詳しく調べる日が来るかもしれませんがRequests、同じ操作をより短く、より単純なコードで実行する場合は...うん!!!

于 2013-08-09T17:54:49.187 に答える