Как отправить запрос? 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 шт):
В requests её никак не нажать, потому что эта библиотека занимается запросами, а не эмулирует браузер как selenium, в котором можно что-либо нажимать.
Но давай разберёмся за что отвечает этот 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 и всё получится.

