Sleepyq 클라이언트가 로그인할 수 없습니다.
묘사
지금까지 Sleepyq 클라이언트는 더 이상 작동하지 않는 것 같습니다.다음은 간단한 테스트입니다.from sleepyq import Sleepyq
client = Sleepyq("my_sleepiq_username", "my_sleepiq_password")
client.login()
다음 오류가 발생했습니다.Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/jreagan/.local/lib/python3.8/site-packages/sleepyq/__init__.py", line 125, in login
self._session.params['_k'] = r.json()['key']
File "/usr/lib/python3.8/site-packages/requests/models.py", line 898, in json
return complexjson.loads(self.text, **kwargs)
File "/usr/lib/python3.8/site-packages/simplejson/__init__.py", line 525, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.8/site-packages/simplejson/decoder.py", line 370, in decode
obj, end = self.raw_decode(s)
File "/usr/lib/python3.8/site-packages/simplejson/decoder.py", line 400, in raw_decode
return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
토론 #1
를 깊이 연구한 결과'/login'요청이 403로 되돌아온 것 같다.나는 몇 가지 실험을 했는데, 그들은 '사용자 에이전트' 로 요청을 막은 것 같다.'python 요청/2.24.0 '.이것은 Python 요청 라이브러리에서 기본적으로 사용하는 것입니다.나는 그들이 가정 보조 사용자의 모든 요청을 좋아하지 않을 것이라고 추측한다.폭소:어쨌든 다음과 같이 세션 put 명령에 User Agent "foo"헤더를 전달하여 이 문제를 해결할 수 있습니다.
...
data = {'login': self._login, 'password': self._password}
headers = {'User-Agent': 'foo'}
r = self._session.put(self._api+'/login', headers=headers, json=data)
...
하지만 이런 복구가 얼마나 지속될지 모른다.나는 그들이 그것을 막기 위해 다른 방법을 찾을 것이라고 추측한다.사용자 에이전트를 크롬(Mozilla/5.0(X11; Linux x86 64) Apple WebKit/537.36(KHTML, Gecko) 크롬/87.0.4280.66 Safari/537.36) 같은 브라우저로 설정할 수도 있습니다.그들에게 봉쇄는 더 어려울 수도 있지만, 그들이 왜 봉쇄를 선택했는지 알아낼 필요가 있을지도 모른다.다만 수면 지능에 대해 누구에게 연락할지 확실하지 않다.토론 #2
우리는 응용 프로그램 사용자 에이전트를 모방할 수 있습니까?토론 #셋
No idea how long that fix would last though. I'm guessing they'll find another way to block it. You could also set the 'User-Agent' to mimic a browser like Chrome (ie, 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'). It might be harder for them to block, but it might be worth figuring out why they chose to block it in the first place. Just not sure who to contact on the Sleep IQ side.
허비타트 사람들이 그렇게 하는 것 같아.
private def ApiUserAgent() { "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36" }
https://community.hubitat.com/t/sleepiq-sleep-number/15053/11토론 #4
사용자 에이전트를 사용하여 로그인이 성공적으로 허용되었지만 추가 API 호출이 실패한 것 같습니다.Python 3.7.5 (default, Apr 19 2020, 20:18:17)
[GCC 9.2.1 20191008] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from sleepyq import Sleepyq
>>> from pprint import pprint
>>> client = Sleepyq('sleepiq_user', 'sleepiq_pass')
>>> client.login()
True
>>> pprint(client.sleepers())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/srv/homeassistant/venv/lib/python3.7/site-packages/sleepyq/__init__.py", line 130, in sleepers
r=self.__make_request('/sleeper')
File "/srv/homeassistant/venv/lib/python3.7/site-packages/sleepyq/__init__.py", line 101, in __make_request
retry = self.__make_request(url, mode, data, attempt+1)
File "/srv/homeassistant/venv/lib/python3.7/site-packages/sleepyq/__init__.py", line 101, in __make_request
retry = self.__make_request(url, mode, data, attempt+1)
File "/srv/homeassistant/venv/lib/python3.7/site-packages/sleepyq/__init__.py", line 101, in __make_request
retry = self.__make_request(url, mode, data, attempt+1)
File "/srv/homeassistant/venv/lib/python3.7/site-packages/sleepyq/__init__.py", line 104, in __make_request
r.raise_for_status()
File "/srv/homeassistant/venv/lib/python3.7/site-packages/requests/models.py", line 943, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 403 Client Error: Forbidden for url: https://prod-api.sleepiq.sleepnumber.com/rest/sleeper?_k=xxxxxxxxxxxxx
>>>
토론 #5
While using that user agent did allow the login to succeed, further API calls appear to fail: ...
나는 네가 매번 통화에서 제목을 설정해야 한다고 생각한다.
토론 #6
하하!어?네.테스트 좀 해볼게요...
토론 #7
세션 초기화 부분에 사용자 프록시 헤더만 추가하면 됩니다.HA에서 사용자 에이전트를 수동으로 변경하는 방법을 설명해 주실 수 있습니까?
편집: 그러면 사람들이 핵심에 통합될 때까지 그것을 잠시 복구할 수 있습니다.
토론 #8
@tagno25 감사합니다!나는python 프로그래머가 아니기 때문에 이것은 아주 좋은 도움말입니다. 마치 API를 복구한 것 같습니다.@Tower 방금 Tagno25의 설명에 따라 변경한 것을 테스트해야 합니다.
토론 #9
네, @tagno25에서 추천한 복구 방법으로 HA 문제를 해결했습니다.python venv를 실행하고 있기 때문에, 수동으로 복구하는 방법을 설명할 수 밖에 없습니다.만약 당신이 다른 스타일의 HA를 운행한다면, 당신은 반드시 이 라이브러리를 찾아야 합니다.나의 예에서, 나는
토론 #10
에서sleepyq 라이브러리를 찾았다.라이브러리 디렉터리를 자신의 차원 구조에서 찾아야 합니다.이 디렉터리에
~homeassistant/venv/lib/python3.7/site-packages/sleepyq
파일이 편집되어야 합니다.80행 근처에서 이 코드를 찾습니다....
self._session = requests.Session()
self._session.headers.update({'User-Agent': 'foo'})
self._api = "https://api.sleepiq.sleepnumber.com/rest"
...
__init__.py
다음에 다음 선을 삽입하여 위의 선과 정렬합니다.class Sleepyq:
def __init__(self, login, password):
self._login = login
self._password = password
self._session = requests.Session()
self._api = "https://prod-api.sleepiq.sleepnumber.com/rest"
결과는 다음과 같습니다.self._session.headers.update({'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36'})
self._session = requests.Session()
sleepyq 디렉터리토론 #11
테스트 작업.위에서 문제를 발견하고 수동 복구를 발표한 분들께 감사드립니다./usr/local/lib/python3.8/site-packages/sleepyq/__init__.py
나는 다른 방법을 발견했다.토론 #12
docker exec -it homeassistant vi /usr/local/lib/python3.8/site-packages/sleepyq/__init__.py
네, 빠른 복구에 감사드립니다. 저에게도 효과가 있는지 확인하세요.토론 #13
나는 내일 아침에 PR 한 부를 제출할 것이다. 그러면 우리는 합병하여 복원할 수 있고 다음 버전으로 들어갈 수 있기를 바란다.이와 동시에python 원본 파일의 로컬 복사본을 수동으로 업데이트하는 것이 좋은 해결책인 것 같습니다.토론 #14
복구 감사합니다!!!!토론 #15
Sleep numberIQ는 복구토론 #16
가 권한이 부여되지 않은 API 호출 부하로 인해 SleepIQ에 중대한 문제가 있음을 다시 한 번 중지했습니다.그들의 서비스는 믿을 수 없게 변했지만, 결국 효과를 보았다.현재 존재하는지 확인하는 데 몇 분(10분 이상)이 걸립니다.
Reference
이 문제에 관하여(Sleepyq 클라이언트가 로그인할 수 없습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://github.com/technicalpickles/sleepyq/issues/11텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)