我在redover上的stackoverflow上找到了这个代码。我试图为hackthissite.org修改它:
import urllib2
import urllib
import cookielib
# Store the cookies and create an opener to hold them
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
# Add our headers
opener.addheaders = [('User-agent', 'Tester')]
# Install the opener, changes the global opener to the one we just made
urllib2.install_opener(opener)
# URL for authentification
auth_url = 'https://www.hackthissite.org/user/login'
# Parameters to send
payload = {
'username': 'myUser',
'password': 'myPass',
'btn_submit': 'Login'
}
# Encode payload
data = urllib.urlencode(payload)
# Build request object (supplying 'data' makes it a POST)
req = urllib2.Request(auth_url, data)
# Make request and store in resp
resp = urllib2.urlopen(req)
print resp
据我所知,我的有效负载是正确的,这是hackthissite.org上的登录表单:
<form id="loginform" method="post" action="/user/login">
<div id="innerlogin">
<script type="text/javascript">var userclicked=0; var passclicked=0;</script>
<p><input type="text" name="username" class="login" value="" onclick="if(userclicked==0){this.value='';userclicked=1;};" title="Username" /></p>
<p><input type="password" name="password" class="login" value="" onclick="if(passclicked==0){this.value='';passclicked=1;};" title="Password" /></p>
<p><input type="submit" value="Login" name="btn_submit" class="submit-button" /></p>
</div>
</form>
我从服务器获得的响应是:
<addinfourl at 36515712 whose fp = <socket._fileobject object at 0x022D3DB0>>
如何登录该网站? 在这种情况下,服务器响应意味着什么? (AddInfoUrl?)
答案 0 :(得分:6)
我强烈建议您只需查看mechanize并使用它。这使得这种事情几乎是微不足道的。例如,以下是您与上述网站的接口方式:
from mechanize import Browser
br = Browser()
br.open("https://www.hackthissite.org/user/login")
br.select_form(predicate=lambda f: f.attrs.get('action') == '/user/login')
br["username"] = "myUser"
br["password"] = "myPass"
response = br.submit()
print response.read()
更新:解释这一行:
br.select_form(predicate=lambda f: f.attrs.get('action') == '/user/login')
select_form
采用nr
参数或name
参数或predicate
参数。如果您执行br.select_form(nr=1)
,则会选择页面上的第二个表单。如果您执行br.select_form(name="foobar")
,则会在页面上选择名为“foobar”的第一个表单。或者你可以给它一个带有HTMLForm
对象的函数,并返回它是否应该是要选择的形式。
在上面的例子中,我给它一个函数,如果表单的"action"
属性为"/user/login"
,则该函数返回true。如果您知道表单的名称或其在文档中的位置,那可能更容易。
答案 1 :(得分:1)
resp = urllib2.urlopen(req)
urlopen
返回一个“类文件”对象,它本质上是一个句柄,您可以从中读取响应。如果您只对服务器的响应文本感兴趣,可以在响应对象上调用read
:
print resp.read()
此外,您还需要一些额外的方法,例如info
,它们会为您提供有关响应标头的信息。