2014-09-29 46 views
1

基地脚本:有问题通过的Oauth针-auth的会议越来越火力数据巢

from sanction import Client 
# client_id & client_secret are omitted but are valid 

client_pin = input('Enter PIN:') 

access_token_url = 'https://api.home.nest.com/oauth2/access_token' 

c = Client(
    token_endpoint=access_token_url, 
    client_id=client_id, 
    client_secret=client_secret) 

c.request_token(code = client_pin) 

[See edits for history]

运行c.request('/devices')返回:

Traceback (most recent call last): 
    File "C:\py\nest_testing_sanction.py", line 36, in <module> 
    c.request("/devices") 
    File "C:\Python34\lib\site-packages\sanction-0.4.1-py3.4.egg\sanction\__init__.py", line 169, in request 
    File "C:\Python34\lib\site-packages\sanction-0.4.1-py3.4.egg\sanction\__init__.py", line 211, in transport_query 
    File "C:\Python34\lib\urllib\request.py", line 258, in __init__ 
    self.full_url = url 
    File "C:\Python34\lib\urllib\request.py", line 284, in full_url 
    self._parse() 
    File "C:\Python34\lib\urllib\request.py", line 313, in _parse 
    raise ValueError("unknown url type: %r" % self.full_url) 
ValueError: unknown url type: 'None/devices?access_token=c.[some long session token]' 

鉴于输出好像我需要要加入通用网址,所以我试过c.request('wss://developer-api.nest.com')

Traceback (most recent call last): 
    File "C:\py\nest_testing_sanction.py", line 36, in <module> 
    data = c.request(query_url) 
    File "C:\Python34\lib\site-packages\sanction-0.4.1-py3.4.egg\sanction\__init__.py", line 171, in request 
    File "C:\Python34\lib\urllib\request.py", line 153, in urlopen 
    return opener.open(url, data, timeout) 
    File "C:\Python34\lib\urllib\request.py", line 455, in open 
    response = self._open(req, data) 
    File "C:\Python34\lib\urllib\request.py", line 478, in _open 
    'unknown_open', req) 
    File "C:\Python34\lib\urllib\request.py", line 433, in _call_chain 
    result = func(*args) 
    File "C:\Python34\lib\urllib\request.py", line 1257, in unknown_open 
    raise URLError('unknown url type: %s' % type) 
urllib.error.URLError: <urlopen error unknown url type: nonewss> 

我也试过https按:

enter image description here - 同样的结果

相比之下,这个工程(一firebase.io虚拟设备):

firebase = firebase.FirebaseApplication('https://nesttest.firebaseio.com', None) 
thermostat_result  = firebase.get('/devices', 'thermostats') 

回答

1

这是更多的评论,但系统不让我评论。

对于你的问题,关于在哪里把web引脚简单地添加code = pin到request_token调用。

c.request_token(code = nest_client_pin) 

这仍然不能完全解决问题,因为我只能使用一次PIN。在我使用过一次之后,随后的每次呼叫都会按照您描述的方式再次失败。仍在研究。

+0

谢谢,清除错误,基本上只是把我扔回到shell提示符。正如你所说的那样,保持/重复使用会话是下一步。由于文档几乎不存在,因此我在这里完全失败。 – Enigma 2014-10-15 15:28:04

+0

同意。不容易得到这个工作。我会在业余时间继续努力...... – fxstein 2014-10-15 15:30:48

+0

所以我做了'c.request('/ devices')'之后出现错误,但它也输出了看起来像是实际的会话令牌。不知道如何重用它,但也许这会帮助你..帮助我。 :) – Enigma 2014-10-15 15:48:18

2

在Python我想使用像sanction这样的东西来保持简单。你应该能够得到它使用类似的代码与鸟巢API的工作:(未经测试,使用令牌流量,而不是销流量)

from sanction.client import Client 

# instantiating a client to get the auth URI 
c = Client(auth_endpoint="https://home.nest.com/login/oauth2", 
    client_id=config["nest.client_id"]) 

# instantiating a client to process OAuth2 response 
c = Client(token_endpoint="https://api.home.nest.com/oauth2/access_token", 
    client_id=config["nest.client_id"], 
    client_secret=config["nest.client_secret"]) 

库是有据可查的,所以你应该能够弄清楚从这里如果有东西丢失。

+0

是否有关于销流量的任何文档(我没有看到任何)?我没有重定向URI。 – Enigma 2014-10-02 18:52:10

+0

要执行引脚流程,只需在您的客户端中省略重定向URI,Nest将在身份验证流程结束时向用户显示PIN。您可以像使用重定向中的access_token一样使用PIN。 – 2014-10-07 22:43:38

+0

我是否甚至需要使用client_id/client_secret,如果我将这些内容嵌入到URL中:[https://api.home.nest.com/oauth2/access_token?code=AUTHORIZATION_CODE&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code](https: //api.home.nest.com/oauth2/access_token?code=AUTHORIZATION_CODE&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code)还是我假定Client()为我做了这件事,我应该在'/ access_token'之后放弃所有事情? – Enigma 2014-10-08 16:04:33