Очистка сайта сеанса ASPX с python запросами и несколькими перенаправлениями - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь почистить сайт для принадлежащего мне устройства. Устройство загружает свои данные на этот сайт, и сам сайт не предлагает API или какой-либо другой программный c способ для меня получить доступ к этим данным.

Успешно выглядит так (на проверку браузера) инструмент):

  1. GET /Site/Login.
  2. POST / Site / Login
  3. 302 к / Site / Index *
  4. 302 к / Клиент / Аккаунт
  5. 302 в /Customer/Account/email%40domain.tld

Вот код, который у меня пока есть:

#!/usr/bin/python3

import requests
import json

payload = {
    "Email" : email,
    "Password" : password,
    "Remember" : 'false'
}
headers = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
  'Accept-Encoding': 'gzip, deflate, br',
  'Accept-Language' : 'en-US,en;q=0.5',
  'Content-Type': 'application/x-www-form-urlencoded',
  'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0',
}

s = requests.Session()

s.get('https://www.wifi.ecowater.com/Site/Login')

# Add the RequestVerificationToken to the payloay.
RVT = requests.utils.dict_from_cookiejar(s.cookies)
payload['__RequestVerificationToken'] = RVT['__RequestVerificationToken']

r = s.post('https://www.wifi.ecowater.com/Site/Login', params=payload, headers=headers)

print(r.text)

Этот код получает мне страницу с ошибкой, почти как запросы не следуют за всеми перенаправлениями.

Вот команды curl для 5 указанных выше шагов для инструмента проверки браузера Firefox.

РЕДАКТИРОВАТЬ: Попытка отправки 5 команд скручивания, но stackoverflow помечает это как спам, когда я делаю это, и не позволяет мне писать.

1 Ответ

0 голосов
/ 18 февраля 2020

У меня почти было это в моем первоначальном вопросе, но, посмотрев немного ближе к веб-сайту, я нашел скрытый ввод формы со вторым __RequestVerificationToken.

По сути, мне не нужно вручную управлять __RequestVerificationToken cook ie на всех - requests.Session делает это - но мне нужно добавить скрытое __RequestVerificationToken к данным данных формы.

В итоге мы получаем два разных токена, оба названный __RequestVerificationToken. Один отправляется с сервера и является поваром ie, другой - данными формы, которые вам нужно найти вручную.

Вот мой рабочий код:

#!/usr/bin/python3

import requests
import re

# Regex to match the hidden input on the initial log in page
request_validation_re = re.compile(r'<input name="__RequestVerificationToken" type="hidden" value="(.*?)" />')

# The serial number of your ecowater device
dsn = { "dsn": "serial" }

# The initial form data
payload = {
    "Email" : "emailaddress",
    "Password" : "password",
    "Remember" : 'false'
}

# The headers needed for the JSON request
headers = {
    'Accept': '*/*',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language' : 'en-US,en;q=0.5',
    'X-Requested-With': 'XMLHttpRequest',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:73.0) Gecko/20100101 Firefox/73.0'
}

with requests.Session() as s:
    # Initial GET request
    g = s.get('https://www.wifi.ecowater.com/Site/Login')

    # Grab the token from the hidden input
    tokens = request_validation_re.findall(g.text)
    # Add the token to the form data payload
    payload['__RequestVerificationToken'] = tokens[0]

    # Log in to the site
    login = s.post('https://www.wifi.ecowater.com/Site/Login', data=payload)
    # Add the correct Referer header
    headers['Referer'] = login.url + '/' + dsn['dsn']

    # Query the JSON endpoint for the data that we actually want
    data = s.post('https://www.wifi.ecowater.com/Dashboard/UpdateFrequentData', data=dsn, headers=headers)
    print(data.json())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...