Python 3, отправка сообщения urllib

#python #post #python-3.x #urllib

#python #Публикация #python-3.x #urllib

Вопрос:

Я хотел бы написать скрипт на Python для автоматического входа в мою учетную запись broadband usage meter. Я никогда раньше не делал POST submit, и у меня возникли некоторые проблемы с этим.

 import urllib.request, urllib.parse, urllib.error
import socket

try:
    details = urllib.parse.urlencode({ 'IDToken1': 'USERNAME', 'IDToken2': 'PASSWORD' })
    url = urllib.request.Request('https://login1.telecom.co.nz/distauth/UI/Login?realm=XtraUsersamp;goto=https://www.telecom.co.nz:443/jetstreamum/xtraSum?link=rdt', details)
    url.add_header("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13")

    responseData = urllib.request.urlopen(url).read().decode('utf8', 'ignore')
    responseFail = False

except urllib.error.HTTPError as e:
    responseData = e.read().decode('utf8', 'ignore')
    responseFail = False

except urllib.error.URLError:
    responseFail = True

except socket.error:
    responseFail = True

except socket.timeout:
    responseFail = True

except UnicodeEncodeError:
    print("[x]  Encoding Error")
    responseFail = True

print(responseData)
  

Из HTML я вывел, что это IDToken1 идентификатор имени пользователя и IDToken2 идентификатор пароля.

Вот моя проблема:

  • Когда я ввожу правильное имя пользователя и пароль, загружается страница входа, но:

  • Когда я ввожу неправильное имя пользователя или пароль, я получаю страницу с надписью:

    Этот сервер столкнулся с внутренней ошибкой, которая не позволяет ему выполнить ваш запрос. Наиболее вероятной причиной является неправильная конфигурация. Пожалуйста, попросите администратора поискать сообщения в журнале ошибок сервера.

Комментарии:

1. Ну, это очень сложно, не видя фактическую страницу, которую вы используете… может быть, вам следует проверить, что на самом деле отправляется вашим браузером с помощью инструментов разработчика Chrome или анализатора пакетов, такого как Wireshark?

Ответ №1:

 details = urllib.parse.urlencode({'IDToken1': 'USERNAME', 'IDToken2': 'PASSWORD'})
  

Добавьте следующую строку:

 details = details.encode('UTF-8')
  

Ответ №2:

Это могло быть сделано специально. Что произойдет, если вы сделаете это в браузере? Тот факт, что он работает с правильными данными, означает, что вы делаете это правильно.