3

请多多包涵,我是 Python 新手!

我正在尝试登录使用 PHP 的网站。该表单包含两个隐藏字段,一个的值和另一个的名称是在页面加载时生成的。

我下面的代码成功地访问了页面并使用正则表达式设法返回值 - 太棒了!

我遇到的问题是,然后我生成将用于 POST 的查询字符串(这包含之前获得的两个值)并再次打开 url。这会生成全新的令牌/值,而我的原件没有用。

有人可以阐明我如何连接到站点,使用正则表达式获取值,然后在同一个连接中发布所有内容。

我希望我已经说清楚了,如果没有,请告诉我。

在此先感谢您的帮助。

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 库,但我的第一反应是,这会在一个请求中为您提供所有响应文本,您可以使用它获取新令牌,不是吗?

基于表单更新:看起来您的问题是您将登录信息发布到index.php而不是index.php/welcome.

于 2013-01-29T17:33:51.523 回答