2013-07-29 3 views
0

Я нашел этот код где-то в stackoverflow для reddit. Я попытался изменить его hackthissite.org:Python: Вход на сайт

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

ответ

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

UPDATE: Для того, чтобы объяснить эту строку:

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 и возвращает, должна ли быть форма для выбора.

В приведенном выше случае я даю ему функцию, которая возвращает true, если атрибут "action" составляет "/user/login". Если вы знаете имя формы или ее позицию в документе, это, вероятно, проще.

+0

Спасибо, я посмотрю! Можете ли вы объяснить, что делает эта часть: предикат = lambda f: f.attrs.get ('action') == '/ user/login' Я понимаю, что я выбираю форму из br, у которой есть действие =/user/login ", но что означает предикат = lambda f? – Juicy

+0

уверенный вещь, проверьте обновление – Claudiu

+0

Спасибо, человек! – Juicy

1
resp = urllib2.urlopen(req) 

urlopen возвращает «файл типа» объект, который по существу представляет собой ручку, где вы можете прочитать ответ от. Если вы просто заинтересованы в тексте ответа сервера, вы можете просто вызвать read на объект ответа:

print resp.read() 

Кроме того, вы также несколько дополнительных методов, как info, который дает вам информацию о заголовках ответа.

Смежные вопросы