Python:使用urllib登录网站

时间:2014-05-13 19:05:53

标签: python urllib2 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 个答案:

答案 0 :(得分:8)

您忘记了表单的隐藏字段:

<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之前添加了一个值。您可能希望通过分析开发人员工具和POST值来检查它。

看起来没有的测试,虽然javascript添加了一些值,可能来自cookie:

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

这是我使用请求执行此操作(具有比urllib更好的API ;-))

>>> 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来填充你的cookie罐来登录页面!

最后,我无法帮助你,因为我在fitbit.com上没有有效的帐户,我不需要/想要一个。所以我只能进入登录失败页面进行测试。

编辑:

解析输出,然后你可以使用:

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

答案 1 :(得分:1)

你将很难用urllib

您可能需要使用已批准的方法https://wiki.fitbit.com/display/API/Fitbit+API;jsessionid=7D918DE258862E80575153385C02507D

这将需要一个oauth令牌......这将需要打开一个网页并让用户登录