#python #authentication #post #web-scraping #python-requests
#python #аутентификация #Публикация #очистка веб-страниц #python-запросы
Вопрос:
Я пытался автоматически входить с помощью запросов python на страницу для загрузки файла каждый час, но мне не повезло с этим.
Страница такая:https://www.still-fds.com/fleetmanager/login/dercomaq
я использую объект Session следующим образом:
import requests
login_URL = 'https://www.still-fds.com/fleetmanager/login/dercomaq'
next_URL = 'https://www.still-fds.com/fleetmanager/pages/reports/vehicle.xhtml'
#(these arent the real username and password, I use the real ones in my code)
payload = {"j_idt181:username": "User", "j_idt181:password": "Password"}
with requests.Session() as ses:
ses.get(login_URL) #I get a JSESSIONID cookie here
ses.post(login_URL, data = payload) #I send the login request
r = ses.get(next_URL) #I try accessing the next page after login
with open('login-test.html', 'wb') as f: #writing the HTML i get back to a file so I can preview it
f.write(r.content)
Однако, когда я проверяю предварительный просмотр на следующей странице, он всегда перенаправляет / показывает мне страницу входа
Я также попытался отправить более полную полезную нагрузку, скопировав все, что отправляется в обычном запросе на вход, вот так
payload = {
'javax.faces.partial.ajax': 'true',
'javax.faces.source':'j_idt181:j_idt190',
'javax.faces.partial.execute': '@all',
'j_idt181:j_idt190': 'j_idt181:j_idt190',
'j_idt181': 'j_idt181',
'j_idt181:username': 'User',
'j_idt181:password': 'Password',
'javax.faces.ViewState': '-4453297688092219000:-1561371993877484606 '
}
И я попытался скопировать заголовки запроса:
#I replace the JSESSIONID cookie for the one that I'm given in the first get request
req_header = {
'Accept': 'application/xml, text/xml, */*; q=0.01'
,'Accept-Encoding': 'gzip, deflate, br'
,'Accept-Language': 'es-ES,es;q=0.9,en-US;q=0.8,en;q=0.7'
,'Connection': 'keep-alive'
,'Content-Length': '287'
,'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
,'Cookie': 'JSESSIONID=U27BXdHsu EXITX-QfUGkmqW; clientId=dercomaq'
,'Faces-Request': 'partial/ajax'
,'Host': 'www.still-fds.com'
,'Origin': 'https://www.still-fds.com'
,'Referer': 'https://www.still-fds.com/fleetmanager/login/dercomaq'
,'Sec-Fetch-Dest': 'empty'
,'Sec-Fetch-Mode': 'cors'
,'Sec-Fetch-Site': 'same-origin'
,'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36'
,'X-Requested-With': 'XMLHttpRequest'
}
Однако я никогда не получаю файл cookie с идентификатором клиента (я пытался вручную предоставить ему файл cookie с идентификатором клиента, поскольку это всегда ‘dercomaq’, но это тоже не помогает)
Все это работает очень легко при использовании Selenium и ChromeDriver, но из-за ограничений веб-приложения я не могу это использовать
Комментарии:
1. Немного касательный к вашему вопросу, но вы упомянули, что это работает «очень легко при использовании Selenium и ChromeDriver», но затем продолжаете делать противоречивое утверждение «из-за ограничений веб-приложения я не могу это использовать». Можете ли вы объяснить это немного лучше?
2. Сделать то, что я хочу (войти на страницу, заполнить форму, загрузить файл), очень легко, потому что вместо того, чтобы вдаваться в подробности запросов, я просто эмулирую вводимые пользователем данные в браузере ChromeDriver. Однако мой босс хочет развернуть этот код в веб-приложении Azure, и после небольшого изучения у Azure нет возможностей для запуска программы webdriver. Таким образом, я не могу использовать Selenium
3. @Franss22 Ваше
'javax.faces.ViewState'
значение не совпадает с моим. Я бы посоветовал вам удалить фактическое значение с веб-страницы, а затем использовать это значение в запросе post.