2014-05-13 10 views
9

voglio per accedere a questo sito: https://www.fitbit.com/login Questo è il mio codice che uso:Python: Entra in un sito web utilizzando urllib

import urllib2 
import urllib 
import cookielib 

login_url = 'https://www.fitbit.com/login' 
acc_pwd = {'login':'Log In','email':'username','password':'pwd'} 
cj = cookielib.CookieJar() ## add cookies 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 
opener.addheaders = [('User-agent','Mozilla/5.0 \ 
        (compatible; MSIE 6.0; Windows NT 5.1)')] 
data = urllib.urlencode(acc_pwd) 
try: 
    opener.open(login_url,data,10) 
    print 'log in - success!' 
except: 
    print 'log in - times out!', login_url 

ho utilizzare Chrome per ispezionare l'elemento della casella di input, ho provato molte coppie di chiavi, ma nessuna funziona. Qualcuno può aiutarmi a dare un'occhiata a questo sito? Qual è il dato corretto che mostro messo nella mia variabile acc_pwd?

ringrazio molto

risposta

7

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

+0

Grazie! Ma per il prossimo, come posso usare r? Non ho mai usato la libreria di richieste prima. – MacSanhe

+0

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

+0

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

Problemi correlati