Stai dimenticando i campi nascosti del modulo:
<form id="loginForm" class="validate-enabled failure form" method="post" action="https://www.fitbit.com/login" name="login">
<input type="hidden" value="Log In" name="login">
<input type="hidden" value="" name="includeWorkflow">
<input id="loginRedirect" type="hidden" value="" name="redirect">
<input id="disableThirdPartyLogin" type="hidden" value="false" name="disableThirdPartyLogin">
<input class="field email" type="text" tabindex="23" name="email" placeholder="E-mail">
<input class="field password" type="password" tabindex="24" name="password" placeholder="Mot de passe">
</form>
quindi si consiglia di aggiornare:
acc_pwd = {'login':'Log In',
'email':'username',
'password':'pwd',
'disableThirdPartyLogin':'false',
'loginRedirect':'',
'includeWorkflow':'',
'login':'Log In'
}
che potrebbero ottenere estratti dal loro servizio. Anche se, dato il nome del campo disableThirdPartyLogin
, mi chiedo se non ci sia javascript sporco associato all'azione di invio del modulo che aggiunge effettivamente un valore prima di eseguire effettivamente il POST. Potresti voler verificarlo con gli strumenti per sviluppatori e i valori POST analizzati.
test che sembra non è così, anche se il javascript aggiunge alcuni valori, che possono essere dai cookie:
__fp w686jv_O1ZZztQ7FkK21Ry2MI7JbqWTf
_sourcePage tJvTQfA5dkvGrJMFkFsv6XbX0f6OV1Ndj1zeGcz7OKzA3gkNXMXGnj27D-H9WXS-
disableThirdPartyLogin false
email [email protected]
includeWorkflow
login Log In
password aeou
redirect
ecco il mio prendere sul fare questo utilizzando le richieste (che ha un'API meglio di urllib ;-))
>>> import requests
>>> import cookielib
>>> jar = cookielib.CookieJar()
>>> login_url = 'https://www.fitbit.com/login'
>>> acc_pwd = {'login':'Log In',
... 'email':'username',
... 'password':'pwd',
... 'disableThirdPartyLogin':'false',
... 'loginRedirect':'',
... 'includeWorkflow':'',
... 'login':'Log In'
... }
>>> r = requests.get(login_url, cookies=jar)
>>> r = requests.post(login_url, cookies=jar, data=acc_pwd)
e non dimenticarti di entrare prima nella pagina di accesso utilizzando un get per riempire il tuo barattolo di biscotti in!
Infine, non posso aiutarti ulteriormente, poiché non ho un account valido su fitbit.com e non ne ho bisogno/ne voglio uno. Quindi posso solo accedere alla pagina di errore di accesso per i miei test.
edit:
per analizzare l'output, quindi è possibile utilizzare:
>>> from lxml import etree
>>> p = etree.HTML(r.text)
ad esempio per ottenere i messaggi di errore:
>>> p.xpath('//ul[@class="errorList"]/li/text()')
['Lutilisateur nexiste pas ou le mot de passe est incorrect.']
risorse:
ed entrambi su PyPI:
pip install lxml requests
HTH
Grazie! Ma per il prossimo, come posso usare r? Non ho mai usato la libreria di richieste prima. – MacSanhe
puoi usare 'r.status_code' per ottenere il codice di stato,' r.cookies' per ottenere il cookie jar (o puoi usare 'jar'), puoi usare' r.text' e passarlo a 'lxml' o 'BeautifulSoup' per aiutarti a analizzare la pagina risultante. Dai un'occhiata a http://python-requests.org per convincerti di quanto sia grande quella libreria :-) – zmo
Intendo quello che di solito faccio: 1. opener.open (login_url, data) 2. regolarmente urllib2.urlopen .request (balabalabala) Quindi, se utilizzo la richiesta di accesso, vuol dire che devo usare la richiesta per estrarre html dall'URL? Ho provato il mio secondo passaggio regolare, non funziona. – MacSanhe