正则表达式和POST在同一连接中

时间:2013-01-29 16:42:51

标签: regex login python-2.7 urllib2

请耐心等待我,我是Python的新手!

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

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

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

有人可以了解我如何连接到网站,使用正则表达式获取值,然后在同一连接中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:

<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>

1 个答案:

答案 0 :(得分: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