3

ご容赦ください、私はPythonが初めてです!

PHP を使用する Web サイトにログインしようとしています。フォームには 2 つの非表示フィールドが含まれており、1 つの値と別の名前がページの読み込み時に生成されます。

以下の私のコードはページに正常にアクセスし、正規表現を使用して値を返すことができます-素晴らしい!

私が抱えている問題は、POST に使用されるクエリ文字列を生成し (これには以前に取得した 2 つの値が含まれています)、再度 URL を開くことです。これにより、まったく新しいトークン/値が生成され、オリジナルは役に立たなくなります。

サイトに接続し、正規表現を使用して値を取得し、すべて同じ接続で POST する方法について、誰かが光を当てることができますか?

私は自分自身を明確にしたことを願っています。そうでない場合はお知らせください。

よろしくお願いします。

import urllib2,urllib,re,cookielib

url='http://www.example.com/index.php'

req = urllib2.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3 Gecko/2008092417 Firefox/3.0.3')
response = urllib2.urlopen(req)
link=response.read()
response.close()
token1=re.compile('<input type="hidden" name="return" value="(.+?)" />').findall(link)
token2=re.compile('<input type="hidden" name="(.+?)" value="1" />').findall(link)
print token1[0]
print token2[0]

username = 'username'
password = 'password'

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
login_data = urllib.urlencode({'username' : username, 'password' : password, 'return' : token1[0], token2[0] : '1', 'Submit' : 'Log in', 'option' : 'com_users', 'task' : 'user.login'})
opener.open('http://www.example.com/index.php', login_data)
resp = opener.open('http://www.example.com/index.php')

形:

<form action="/index.php/welcome2" method="post" id="login-form" >
     <fieldset class="userdata">
          <p id="form-login-username">
               <label for="modlgn-username">User Name</label>
               <input id="modlgn-username" type="text" name="username" class="inputbox"  size="18" />
          </p>
          <p id="form-login-password">
               <label for="modlgn-passwd">Password</label>
               <input id="modlgn-passwd" type="password" name="password" class="inputbox" size="18"  />
          </p>
          <p id="form-login-remember">
               <label for="modlgn-remember">Remember Me</label>
               <input id="modlgn-remember" type="checkbox" name="remember" class="inputbox" value="yes"/>
         </p>
         <input type="submit" name="Submit" class="button" value="Log in" />
         <input type="hidden" name="option" value="com_users" />
         <input type="hidden" name="task" value="user.login" />
         <input type="hidden" name="return" value="aW5kZXgucGhwP0l0ZW1pZD0xMjc=" />
         <input type="hidden" name="c813c34837e4e48e8e3268c0a42912a2" value="1" />
    </fieldset>
<ul>
<li>
<a href="/index.php/my-account/my-details?view=reset">
Forgot your password?</a>
</li>
<li>
<a href="/index.php/my-account/my-details?view=remind">
Forgot your username?</a>
</li>
<li>
<a href="/index.php/register">
Create an account</a>
</li>
</ul>
</form>
4

1 に答える 1

0

あなたが書くとき...

opener.open('http://www.example.com/index.php', login_data)
resp = opener.open('http://www.example.com/index.php')

なぜこれだけではないのですか?

resp = opener.open('http://www.example.com/index.php', login_data)

この Python ライブラリを使用したことはありませんが、最初の反応は、これにより 1 つの要求ですべての応答テキストが得られ、それを使用して新しいトークンを取得できるということでしたね。

フォームに基づく更新:あなたの問題は、ログイン情報をindex.phpではなくに投稿しているようですindex.php/welcome

于 2013-01-29T17:33:51.523 に答える