2010-11-19 21 views
5

Próbuję zalogować się do witryny za pomocą Python i Mechanize, jednak napotykam problemy, gdy próbuję uzyskać dane POST, aby zachowywały się tak, jak chcę.Python zmechanizuj logowanie do strony internetowej

Zasadniczo chcę powtórzyć to za pomocą mechanizacji i Python:

wget --quiet --save-cookies cookiejar --keep-session-cookies --post-data "action=login&login_nick=USERNAME&login_pwd=PASSWORD" -O outfile.htm http://domain.com/index.php 

Formularz wygląda następująco:

<login POST http://domain.com/index.php application/x-www-form-urlencoded 
    <TextControl(login_nick=USERNAME)> 
    <PasswordControl(login_pwd=PASSWORD)> 
    <CheckboxControl(login_auto=[1])> 
    <SubmitButtonControl(<None>=) (readonly)>> 

Ustawienie odpowiednich wartości i wysłaniu formularza nie jest problemem, ale to pomija część "action = login".

response = self.browser.open(self.url+"/index.php") 
self.browser.select_form(name="login") 

self.browser["login_nick"] = self.encoded_username 
self.browser["login_pwd"] = self.encoded_password 

self.browser.method = "POST" 

response = self.browser.open(self.browser.submit()) 

print (response.read()) 

Teraz pytanie brzmi, jak mogę dodać action=login udział?

Edit: Ok, więc dodałem ukryte pole o nazwie działania i ustaw wartość logowania. Analizując strumień TCP za pomocą Wiresharka, dane POST są rzeczywiście tak skonstruowane, jak powinny. Wydaje się jednak, że mechanize miesza się z moim kodowaniem urnym (już zakodowałem wartości specjalnie dla zestawu znaków, którego używa strona internetowa). Na przykład moja nazwa użytkownika zawiera symbol Å - który mam zakodowany w urnie do% C5. Jednak gdy jest wysyłany z mechanizacją, jest wyświetlany jako% 25C5. Jak zatrzymać mechanizację przed zmianą ciągów?

EDYCJA: Zdałem sobie sprawę, że zamiast walczyć z mechaniką, mogłem po prostu nie urlencode moje struny przed wysłaniem ich. Sprawa zamknięta.

+0

Zamiast edytować pytanie i dodawać odpowiedzi do treści pytania, należy opublikować odpowiedź na własne pytanie, a następnie ją zaakceptować. Jest bardziej * naturalny * w ten sposób. – Felix

+2

Zrobiłem. Po prostu nie mogę tego zaakceptować przez kolejne 2 dni. –

Odpowiedz

8

Mechanize wydaje się zakotwiczyć łańcuchy tak czy inaczej, więc nie ma sensu go zwalczać. To jest ostateczne rozwiązanie (oczywiście nie jest poprawne pod względem składni, ale mam nadzieję, że wpadniesz na ten pomysł).

import mechanize 

self.browser = mechanize.Browser() 
self.browser.open(self.url) 
self.browser.select_form(name="login") 

self.browser["login_nick"] = self.username 
self.browser["login_pwd"] = self.password 
self.browser.new_control("HIDDEN", "action", {}) 
control = self.browser.form.find_control("action") 
control.readonly = False 
self.browser["action"] = "login" 
self.browser.method = "POST" 
self.browser.action = self.url 

response = self.browser.submit() 
Powiązane problemy