Python: войдите на веб-сайт с помощью urllib

Я хочу войти на этот сайт:https://www.fitbit.com/login Это мой код, который я использую:

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

Я использую chrome для проверки элемента поля ввода, я пробовал много пар ключей, но никто не работает. Любой может помочь мне взглянуть на этот сайт? Какие правильные данные я показываю в моей переменной acc_pwd?

большое спасибо

2 ответов


вы забываете скрытые поля формы:

<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>

таким образом, вы можете обновить:

acc_pwd = {'login':'Log In',
           'email':'username',
           'password':'pwd',
           'disableThirdPartyLogin':'false',
           'loginRedirect':'',
           'includeWorkflow':'',
           'login':'Log In'
          }

которые могут быть проверены их службой. Хотя, учитывая название поля disableThirdPartyLogin, мне интересно, нет ли грязного javascript, связанного с действием отправки формы, которое фактически добавляет значение, прежде чем фактически делать сообщение. Вы можете проверить это с помощью инструментов разработчика и проанализированных значений POST.

тестирование, которое выглядит не так, хотя javascript добавляет некоторые значения, которые могут быть из cookies:

__fp    w686jv_O1ZZztQ7FkK21Ry2MI7JbqWTf
_sourcePage tJvTQfA5dkvGrJMFkFsv6XbX0f6OV1Ndj1zeGcz7OKzA3gkNXMXGnj27D-H9WXS-
disableThirdPartyLogin  false
email   foo@example.org
includeWorkflow 
login   Log In
password    aeou
redirect    

вот мой взгляд на это с помощью запросов (который имеет лучший API, чем 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)

и не забудьте сначала попасть на страницу входа, используя get, чтобы заполнить куки-куки!

наконец, я не могу помочь вам дальше, так как у меня нет действительной учетной записи на fitbit.com и он мне не нужен. Поэтому я могу попасть только на страницу сбоя входа в систему для моего тесты.

edit:

для разбора вывода, то вы можете использовать:

>>> from lxml import etree
>>> p = etree.HTML(r.text)

например, чтобы получить сообщения об ошибках:

>>> p.xpath('//ul[@class="errorList"]/li/text()')
['Lutilisateur nexiste pas ou le mot de passe est incorrect.']

ресурсы:

и они оба на pypi:

pip install lxml requests

HTH


У вас будет трудное время только с urllib

вам, вероятно, придется использовать утвержденные методы https://wiki.fitbit.com/display/API/Fitbit+API;jsessionid=7D918DE258862E80575153385C02507D

для чего потребуется токен oauth ... что потребует открытия веб-страницы и входа пользователя