Возникли проблемы с получением данных Firebase через сеанс вывода Oauth для Nest

Базовый скрипт:

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)

[Смотрите правки для истории]

Бег 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]'

Учитывая вывод, кажется, что мне нужно вставить общий URL, поэтому я попытался 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 согласно:

- тот же результат

В отличие от этого, это работает (для виртуального устройства firebase.io):

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

2 ответа

Решение

Это скорее комментарий, но система пока не позволяет мне комментировать.

На ваш вопрос о том, куда поместить веб-пин, просто добавьте code = pin к вызову request_token.

c.request_token(code = nest_client_pin)

Это все еще не полностью решает проблему, поскольку я могу использовать ПИН-код только один раз. После того, как я использовал его один раз, каждый последующий вызов снова потерпит неудачу, как вы описываете. Все еще исследую это.

В Python я бы использовал что-то вроде санкции, чтобы все было просто. Вы должны быть в состоянии заставить его работать с Nest 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"])

Библиотека хорошо документирована, так что вы сможете найти ее отсюда, если чего-то не хватает.

Другие вопросы по тегам