Python Mechanize Войти на сайт - PullRequest
5 голосов
/ 19 ноября 2010

Я пытаюсь зайти на сайт, используя Python и Mechanize, однако у меня возникают проблемы при попытке заставить данные POST работать так, как я хочу.

По сути, я хочу повторить это, используя mechanize и 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

Форма выглядит так:

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

Установка соответствующих значений и отправка формы не является проблемой, но это исключает часть "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())

Теперь вопрос, как мне добавить action=login часть?

Редактировать: Хорошо, поэтому я добавил скрытое поле с именем action и установил значение login . Анализируя поток TCP с помощью Wireshark, данные POST действительно структурированы так, как должны. Тем не менее, кажется, что Mechanize мешает моему urlencoding (я уже urlencoded значения специально для кодировки, которую использует веб-сайт). Например, мое имя пользователя содержит Å, которое я кодировал в% C5. Тем не менее, когда он отправляется с механизацией, он отображается как% 25C5. Как мне остановить механизацию от замены строк?

РЕДАКТИРОВАТЬ: я понял, что вместо борьбы с механизацией, я мог бы просто не urlencode мои строки перед отправкой их Дело закрыто.

1 Ответ

8 голосов
/ 19 ноября 2010

Механизация, кажется, все равно кодирует строки, поэтому нет смысла бороться с этим.Это окончательное решение (очевидно, не синтаксически верное, но, надеюсь, вы поняли идею).

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...