Как передать данные формы без POST с запросами Python? - PullRequest
0 голосов
/ 12 июня 2019

Я пишу небольшой кусочек кода на Python, чтобы войти на несколько сайтов "Investing" и получить текущую сумму вложенных денег. Я использую библиотеку запросов pythons и анализирую html-источник, чтобы определить форму и поля для заполнения. Итак, форма может выглядеть так:

 <form class="onboarding-form" id="loginForm" action="https://estateguru.co/portal/login/authenticate" method="post" data-redirect="https://estateguru.co/portal/home">
              <div class="row">
                <div class="col-md-6">
                  <div class="form-group">
                     <input type="text" class="form-control main-input" name="username">
                     <label class="bmd-label-floating main-label">E-Mail</label>
                     <em id="username-error" class="error bmd-help help-block" style="display:none;">This field is required.</em>
                    </div>
                 </div>
              <div class="col-md-6">
                    <div class="form-group">
                       <input type="password" class="form-control main-input login-pass" name="password">
                        <label class="bmd-label-floating main-label long-label">Passwort (Mindestens 8 Zeichen)</label>
                        <em id="password-error" class="error bmd-help help-block" style="display:none;">This field is required.</em>
                         <a href="#" class="show-pass-icon"><i class="zmdi zmdi-eye"></i></a>
                   </div>
                  </div>
                </div>

В этом случае мой код выглядит так:

import requests
_username = 'xxx'
_password = 'yyy'

loginUrl = 'https://estateguru.co/portal/login/authenticate'
readUrl = 'https://estateguru.co/portal/portfolio/overview'
with requests.session() as s:

    payload = {"username": _username, "password": _password}

    final = s.post(loginUrl, data = payload)
    result = s.get(readUrl)
    print(result)

Это работает как очарование для многих сайтов! Но теперь у меня есть веб-сайт без «method = post» в форме, поэтому я не знаю, как передать данные формы. Html-часть (от http://www.reinvest24.com/en/login) выглядит так:

<form>
    <div class="form-group">
        <input type="text" id="email" placeholder="Email" value="" name="email" maxLength="100" class="form-control"/>
    </div>
    <div class="form-group">
        <input type="password" id="password" placeholder="Password" value="" name="password" maxLength="100" class="form-control"/>
    </div>
    <p class="forgot text-right">
        <a href="/en/forgot-password"><span>Forgot password?</span></a>
    </p>
    <input type="submit" class="btn btn-success" value="Login"/>
        <p class="reg text-center">
            <span>Don&#x27;t have an account?</span>
             <a href="/en/registration">
            <span>Sign up</span></a>
        </p>
</form>

Так что без уточнения метода я попробовал

final = s.get(loginUrl, data = payload)

но безуспешно. Результатом в обоих случаях является html-вывод, в котором говорится что-то вроде «Загрузка деталей авторизации ...».

Итак, мой вопрос: я пропускаю правильный метод (POST / GET) для передачи данных или я пропускаю какой-то другой параметр? Некоторым веб-сайтам необходим токен сеанса, который я удаляю с самого сайта входа в систему (как в случае https://www.mintos.com/de/login),, но, на мой взгляд, здесь проблема не в этом.

1 Ответ

0 голосов
/ 13 июня 2019

По умолчанию тело (данные формы) HTTP-запроса игнорируется, когда для метода установлено значение GET. Поэтому вам не следует пытаться отправить запрос через GET (не только небезопасно передавать конфиденциальную информацию через GET, сервер просто проигнорирует имя пользователя / пароль вашего запроса).

Проблема здесь в том, что на странице выполняется некоторое волшебство JavaScript, чтобы отправить ваш запрос по другому URL. Откройте свой веб-инспектор и следите за вкладкой «сеть» всякий раз, когда вы пытаетесь войти на этот сайт. Вы должны увидеть, что запрос отправлен на https://api-frontend.reinvest24.com/graphql.

Когда мы проверяем этот запрос POST, мы видим, что данные передаются в виде тела JSON, а не тела формы. Таким образом, ваш запрос должен выглядеть примерно так:

login_url = 'https://api-frontend.reinvest24.com/graphql'
payload = {
    "operationName": "login",
    "variables": {
        "email": EMAIL,
        "password": PASSWORD
    },
    "query": "mutation login($email: String!, $password: String!) {\n  login(email: $email, password: $password)\n}\n"
}
r = s.post(url=login_url, json=payload)

# note that we used the 'json' parameter here not 'data'

Веб-инспектор Chrome - ваш друг, который наблюдает за тем, как данные передаются при входе в систему.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...