Как отправить запрос? Request

Здраствуйте. У меня вопрос как нажать на галочку "Я не робот" в данном случае? Значения ключа разные с каждым запросом мне надо как то парсинг и отправку запроса соединить или как? Нужно делать вход нажав на галочку.

import requests
from bs4 import BeautifulSoup as Bs


def gold_buy():
    session = requests.Session()
    arena = session.get('https://mrush.mobi')
    text = Bs(arena.content, 'html.parser')
    fresh = text.find("input", type='checkbox')
    d=(fresh['name'])
    print(d)
    s = session.post('https://mrush.mobi/login',{'name': 'name', 'password': 'pass', d : ''})
    print (s)

    g = session.get("https://mrush.mobi/christmasCollection?r=815")
    soup = Bs(g.text, 'html.parser') 
    quest_status = soup.find_all('div', class_='wr8')
    for status in quest_status:
       print(status)



    
def main():
    gold_buy()
   

if __name__ == '__main__':
    main()

введите сюда описание изображения введите сюда описание изображения


Ответы (1 шт):

Автор решения: DiMithras

В requests её никак не нажать, потому что эта библиотека занимается запросами, а не эмулирует браузер как , в котором можно что-либо нажимать.

Но давай разберёмся за что отвечает этот checkbox.
Если посмотреть на успешный POST запрос, то видно, что в нём в Payload передаётся… что-то похожее на класс. Посмотрим какой класс у checkbox'а? Вот дела, да это же он.
Ещё раз повторюсь, что в requests ты не можешь ничего нажимать, но твои нажатия так или иначе влияют на последющие запросы. В данном случае берётся класс input если ✅ поставлена.

И тут казалось бы всё просто, парсим input, достаём класс checkbox'а и радуемся жизни.

Но нет, такая защита была бы слишком простой, поэтому создатели данной игры пошли немного дальше и сделали… 12 checkbox'ов. Да-да, именно так много, их не видно на странице, потому что у них разные стили. Причём если посмотреть в developer console эти стили, на первый взгляд, ничем не отличаются, меняются только классы. А классы рандомно генерируются при каждом обновлении страницы. Чтож, моё почтение разработчикам, весёлая получилась защита от школьников.

Но, нет ничего невозможного, перед искомыми div стоит <style>, в нём и происходит вся магия по сокрытию псевдо-checkbox'ов. Поэтому, берём все стили, фильтруем те, что скрыты и получаем необходимые нам.

Методом наблюдений выяснилось, что в ненужных содержится что-то из:

  • float: left;
  • overflow: hidden;
  • display: none;

Их и будем фильтровать.

А что дальше? А дальше остаётся два нужных checkbox'а, первый для "Начать игру", второй для "Войти". В зависимости от того что делаем добавляем в тело запроса и не забываем добавить заголовок Content-Type, которого в вопросе, кстати, не наблюдается‥

import requests
from bs4 import BeautifulSoup as bs

s = requests.Session()

url = 'https://mrush.mobi'
r = s.get(url)
soup = bs(r.content, 'lxml')

soup, styles = bs(r.content, 'lxml'), []
for style in soup.find_all('style'):
    style = style.decode_contents()
    if 'float: left;' not in style \
    and 'overflow: hidden;' not in style \
    and 'display: none;' not in style:
        styles.append(style[style.find('.')+1:style.find('{')])

checkbox = soup.find('div', {'class': styles[0]}).find('input')['class'][0]+'='

headers = {'Content-Type': 'application/x-www-form-urlencoded'}
r = s.post(url + '/start', headers=headers, data=checkbox)
soup = bs(r.content, 'lxml')
soup.find('div', {'class': 'ribbon'})
Вывод:
<div class="ribbon"><div class="rl"><div class="rr">Возвращение домой</div></div></div>

Ну вот и всё, checkbox отработал и в ответ мы получаем новый экран "Возвращение домой" где на игрока нападает степной волк.

Для авторизации выбираем второй checkbox и всё получится.

→ Ссылка