Использование запросов на вход в систему, когда идентификаторы элемента имени пользователя и пароля не постоянны - PullRequest
1 голос
/ 08 марта 2020

Я пытаюсь почистить веб-форум, и у меня возникают проблемы с доступом к страницам, которые находятся за логином. Изучив элементы страницы входа, я обнаружил, что идентификатор элементов ввода имени пользователя и пароля меняется каждый раз, когда я обновляю sh страницу. Моя текущая стратегия состоит в том, чтобы

  1. Создать и использовать сеанс запросов
  2. Сделать GET-запрос для страницы входа на форум
  3. Используйте BeautifulSoup для извлечения идентификаторов имени пользователя и элементы ввода пароля
  4. Используйте извлеченные идентификаторы в качестве ключей, а имя пользователя и пароль моей учетной записи в качестве значений для запроса полезной нагрузки, который передается в запрос POST для страницы входа в систему
  5. Выполнить запрос GET для страницы на форуме

Я столкнулся с проблемой на шаге 4: код состояния запроса POST равен 400, что указывает на то, что я что-то делаю не так.

Вот MWE, в котором переменные KIWIFARMS_USERNAME и KIWIFARMS_PASSWORD были изменены, чтобы они не были моими реальными именем пользователя и паролем учетной записи:

import os

import requests
from bs4 import BeautifulSoup

# login url for forum, and fake forum credentials (they're real in my script)
LOGIN_URL = 'https://kiwifarms.net/login/'
KIWIFARMS_USERNAME = 'username'
KIWIFARMS_PASSWORD = 'password'

with requests.Session( ) as session:

  # step 1
  r = session.get( LOGIN_URL )

  # step 2
  soup = BeautifulSoup( r.content, 'lxml' )

  # step 3
  username_id = soup.find( 'input', { 'autocomplete' : 'username' } )[ 'id' ]
  password_id = soup.find( 'input', { 'type' : 'password' } )[ 'id' ]

  payload = {
    username_id: KIWIFARMS_USERNAME,
    password_id : KIWIFARMS_PASSWORD }

  # step 4
  post = session.post( LOGIN_URL, data = payload )

  # failure of step 4 (prints 400)
  print( post.status_code )

Я много смотрел страниц и ссылок, включая это , это , это и это , но я до сих пор не могу понять, почему мой пост запрос получает ошибку 400 Bad Request.

У меня есть версия этой работы в Selenium, но я бы очень хотел знать, какую ошибку я совершаю, и заставить ее работать с помощью запросов. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 08 марта 2020

Веб-сайт генерирует _xfToken во время входа в систему, также вы пропустили Form-Data для запроса POST.

Здесь я поддерживаю session, используя requests.Session(), а затем я проанализировал value из _xfToken во время моего GET запроса, а затем передал его через POST запрос.

import requests
from bs4 import BeautifulSoup


def Main():
    with requests.Session() as req:
        r = req.get("https://kiwifarms.net/login/login")
        soup = BeautifulSoup(r.text, 'html.parser')
        token = soup.find("input", {'name': '_xfToken'}).get("value")
        data = {
            'username': 'test',
            'password': 'test',
            'remember': '1',
            '_xfRedirect': '/',
            '_xfToken': token
        }
        r = req.post("https://kiwifarms.net/login/login", data=data)
        print(r)


Main()

Вывод:

<Response [200]>

если вы проверите r.text и увидите, что мы на правильном пути.

<div class="blockMessage blockMessage--error blockMessage--iconic">
The requested user could not be found.
</div>

Это подтверждает, что мы делаем это правильно, так как я не прошел действительного пользователя / прохода.

...