web-dev-qa-db-fra.com

Se connecter au site en utilisant des requêtes Python

J'essaie de me connecter à https://www.voxbeam.com/login en utilisant des demandes pour extraire des données. Je suis un débutant en python et j'ai principalement réalisé des tutoriels, ainsi que quelques travaux sur le Web de mon propre chef avec BeautifulSoup.

En regardant le HTML:

<form id="loginForm" action="https://www.voxbeam.com//login" method="post" autocomplete="off">

<input name="userName" id="userName" class="text auto_focus" placeholder="Username" autocomplete="off" type="text">

<input name="password" id="password" class="password" placeholder="Password" autocomplete="off" type="password">

<input id="challenge" name="challenge" value="78ed64f09c5bcf53ead08d967482bfac" type="hidden">

<input id="hash" name="hash" type="hidden">

Je comprends que je devrais utiliser la méthode post et envoyer userName et password.

J'essaye ceci:

import requests
import webbrowser

url = "https://www.voxbeam.com/login"
login = {'userName': 'xxxxxxxxx',
         'password': 'yyyyyyyyy'}

print("Original URL:", url)

r = requests.post(url, data=login)

print("\nNew URL", r.url)
print("Status Code:", r.status_code)
print("History:", r.history)

print("\nRedirection:")
for i in r.history:
    print(i.status_code, i.url)

# Open r in the browser to check if I logged in
new = 2  # open in a new tab, if possible
webbrowser.open(r.url, new=new)

Après une connexion réussie, j'attends que l'URL du tableau de bord soit insérée dans r afin que je puisse commencer à extraire les données dont j'ai besoin.

Lorsque j'exécute le code avec les informations d'authentification à la place de xxxxxx et de yyyyyy, j'obtiens le résultat suivant:

Original URL: https://www.voxbeam.com/login

New URL https://www.voxbeam.com/login
Status Code: 200
History: []

Redirection:

Process finished with exit code 0

Je reçois dans le navigateur un nouvel onglet avec www.voxbeam.com/login

Y a-t-il quelque chose qui cloche dans le code? Est-ce que quelque chose manque dans le code HTML? Je peux m'attendre à obtenir l'URL du tableau de bord en r, ou à être redirigé et à essayer d'ouvrir l'URL dans un onglet de navigateur pour vérifier visuellement la réponse, ou je devrais le faire. faire les choses d'une manière différente?

Je lisais beaucoup de questions similaires ici depuis quelques jours, mais il semble que chaque processus d’authentification de site Web est un peu différent, et j’ai vérifié http://docs.python-requests.org/en/latest/user/authentication/ qui décrit d'autres méthodes, mais je n'ai rien trouvé dans le code HTML suggérant d'utiliser l'une de ces méthodes au lieu de post

J'ai aussi essayé

r = requests.get(url, auth=('xxxxxxxx', 'yyyyyyyy')) 

mais cela ne semble pas fonctionner non plus.

5
Pablo

Comme indiqué ci-dessus, vous devez envoyer les valeurs de tous les champs du formulaire. Ceux-ci peuvent être trouvés dans l'inspecteur Web du navigateur. Ce formulaire envoie 2 valeurs additionnelles cachées:

url = "https://www.voxbeam.com//login"
data = {'userName':'xxxxxxxxx','password':'yyyyyyyyy','challenge':'zzzzzzzzz','hash':''}  
# note that in email have encoded '@' like uuuuuuu%40gmail.com      

session = requests.Session()
r = session.post(url, headers=headers, data=data)

En outre, de nombreux sites bénéficient d'une protection contre un bot, comme les champs de formulaire masqués, JS, l'envoi de valeurs codées, etc. En tant que variantes, vous pouvez:

1) Utilisez des cookies de connexion manuelle:

url = "https://www.voxbeam.com"
headers = {'user-agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36"}
cookies = {'PHPSESSID':'zzzzzzzzzzzzzzz', 'loggedIn':'yes'}

s = requests.Session()
r = s.post(url, headers=headers, cookies=cookies)

2) Utilisez le module Selenium:

from Selenium import webdriver
from Selenium.webdriver.common.keys import Keys

url = "https://www.voxbeam.com//login"
driver = webdriver.Firefox()
driver.get(url)

u = driver.find_element_by_name('userName')
u.send_keys('xxxxxxxxx')
p = driver.find_element_by_name('password')
p.send_keys('yyyyyyyyy')
p.send_keys(Keys.RETURN)
8
bl79

Essayez de spécifier l’URL plus clairement comme suit:

  url=https://www.voxbeam.com//login?id=loginForm

Ceci définiraFocus sur le formulaire de connexion de sorte que la méthode POST s'applique

1
Mohammad Jbber

C'est très délicat selon la façon dont le site Web gère le processus de connexion, mais ce que j'ai fait est d'utiliser Charles, une application proxy, et d'écouter les demandes envoyées par mon navigateur au serveur du site Web pendant que je me connectais manuellement. Ensuite, j'ai copié exactement le même en-tête et le même cookie que ceux présentés par Charles dans mon propre code python et cela a fonctionné! Je suppose que le cookie et l'en-tête sont utilisés pour empêcher la connexion du bot. 

0
Reza Hosseini