1

ログインが完了した機械化スクリプトがあります。ログイン後、メインのログインページに移動する前に、最初にリダイレクトが表示されます。

redirect() を実行すると、ログイン ページに戻ります。なんで?

login() を実行すると、このページが表示されますが、それでもメイン ページに進む必要があります。

<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>

</title></head>
<body>
     <form name="form1" method="post" action="tmp.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE2MTY2ODcyMjlkZCOgyU+AdP30f85W4DdUIV6LnCqa" />
</div>

      <script type="text/javascript">
          top.location.href = document.location.href;
          document.forms["form1"].submit();
      </script>
          &nbsp;&nbsp;</form>
      </body>
</html>

私はこれが初めてなので、何をすべきか本当にわかりません。

最初のログインで提供された認証済みのデータを使用して、この種のフォームを送信するにはどうすればよいですか?

また、認証されたユーザーでより多くの POST データを送信する方法は?

これまでの私のコード:

import re
import mechanize

login_url = 'login.aspx'

def login(id, username, password):
    br = mechanize.Browser()
    br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
    br.open(login_url)
    br.select_form(nr=0)
    br.form.set_all_readonly(False)
    br["__EVENTTARGET"] = "TransactBtn"
    br["AccountID"] = id
    br["UserName"] = username
    br["Password"] = password   
    response = br.submit()
    return response.geturl()
    #after submitting this it goes to the redirect portal page then to the main page

def redirect(url): 
    #after login we submit the redirect portal to see the main page
    br = mechanize.Browser()
    br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
    br.open(url)
    br.select_form(nr=0)
    response = br.submit()
    return response.read() #to the main

def dostuff():
    #this will submit some data as POST with the authenticated user.

print redirect(login('myid', 'myusername', 'mypassword'))
4

2 に答える 2

3

リクエストに対して機械の新しいインスタンスを作成しているため、この問題が発生したと思います。Mechanise はブラウザのようなもので、Cookie の保存などがあります。オブジェクトの再作成は、ブラウザですべてのデータを消去するのとまったく同じです。

そのため、すべてのリクエストで Browser クラスの 1 つのインスタンスを共有する必要があります。

login関数は必要なことを実行しているように見えます。印刷br._ua_handlers['_cookies'].cookiejarを試みて、すべての Cookie がサーバー上のログイン ハンドラーによって設定されていることを確認してから、Browser の同じインスタンスを使用して必要なページをプルします。

私が思うに、クラスを作成して Browser をクラス変数に設定するのが最善だと思います。

class MyWorker(object):
    def __init__(self):
        self._br = mechanize.Browser()
        self._br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]

    def login(self):
        self._br.open(login_url)
        self._br.select_form(nr=0)
        self._br.form.set_all_readonly(False)
        self._br["__EVENTTARGET"] = "TransactBtn"
        self._br["AccountID"] = id
        self._br["UserName"] = username
        self._br["Password"] = password   
        self._br.submit()

私は間違っているかもしれませんが、ここの Javascript はあまり重要ではないようです。

于 2012-11-27T09:06:18.623 に答える
2

Mechanizeはjavascriptをサポートしていません。Seleniumを確認する必要があります。これは、mechanizeとほぼ同じことを行いますが、javascriptを処理します。

于 2012-11-27T08:10:02.570 に答える