无法获取userid 但通过.mi.token 可以
输入set MI_USER= 以及 set MI_PASS= 后报错 Exception on login : 'userId' Traceback (most recent call last): File "D:\Python\Lib\site-packages\miservice\miaccount.py", line 71, in login self.token["userId"] = resp["userId"] KeyError: 'userId' Error https://api.io.mi.com/app/home/device_list: Login failed
但是输入完账号及密码后再执行一个 micli play 会生成 .mi.token文件 有了.mi.token之后 才能继续使用,隔一段时间,再去使用 micli list 登录会失效 .mi.token文件也会自动删除 求大佬修复
浏览器打开网址
https://account.xiaomi.com/pass/serviceLogin?sid=xiaomiio&_json=true
登陆成功后可以看到类似如下的信息
&&&START&&&{
"notificationUrl": "",
"code": 0,
"description": "成功",
"securityStatus": 0,
"userId": "***",
"cUserId": "***",
"result": "ok",
"psecurity": "***",
"captchaUrl": null,
"location": "https://sts.api.io.mi.com/sts?d=***&ticket=***&pwd=***&p_ts=***&fid=***&p_lm=***&auth=***&m=***&_group=***&tsl=***&p_ca=***&p_ur=***&p_idc=***&nonce=***&_ssign=***",
"pwd": 1,
"child": 0,
"desc": "成功"
}
通过google浏览器的F12开发者工具,切换到Application选项卡,找到Cookies,找到https://account.xiaomi.com,可以看到passToken和userId以及passToken的值。
把他们复制到代码中,修改如下:
diff --git a/miservice/miaccount.py b/miservice/miaccount.py
index 3d3c499..b47f5a5 100644
--- a/miservice/miaccount.py
+++ b/miservice/miaccount.py
@@ -101,16 +101,25 @@ class MiAccount:
return False
async def _serviceLogin(self, uri, data=None):
- headers = {'User-Agent': 'APP/com.xiaomi.mihome APPV/6.0.103 iosPassportSDK/3.9.0 iOS/14.4 miHSTS'}
- cookies = {'sdkVersion': '3.9', 'deviceId': self.token['deviceId']}
- if 'passToken' in self.token:
- cookies['userId'] = self.token['userId']
- cookies['passToken'] = self.token['passToken']
+ headers = {
+ 'User-Agent': 'APP/com.xiaomi.mihome APPV/6.0.103 iosPassportSDK/3.9.0 iOS/14.4 miHSTS'
+ }
+ cookies = {
+ 'sdkVersion': '3.9',
+ 'deviceId': "your_device_id",
+ 'userId': "your_user_id",
+ 'passToken': "your_pass_token",
+ }
url = 'https://account.xiaomi.com/pass/' + uri
- async with self.request(url, 'GET' if data is None else 'POST', data=data, cookies=cookies, headers=headers) as r:
+ async with self.request(
+ url,
+ 'GET' if data is None else 'POST',
+ data=data,
+ cookies=cookies,
+ headers=headers
+ ) as r:
raw = await r.read()
resp = loads(raw[11:])
- # _LOGGER.debug("%s: %s", uri, resp)
return resp
async def _securityTokenService(self, location, nonce, ssecurity):
之后就可以成功登录正常使用了。
浏览器打开网址
https://account.xiaomi.com/pass/serviceLogin?sid=xiaomiio&_json=true
登陆成功后可以看到类似如下的信息
&&&START&&&{ "notificationUrl": "", "code": 0, "description": "成功", "securityStatus": 0, "userId": "***", "cUserId": "***", "result": "ok", "psecurity": "***", "captchaUrl": null, "location": "https://sts.api.io.mi.com/sts?d=***&ticket=***&pwd=***&p_ts=***&fid=***&p_lm=***&auth=***&m=***&_group=***&tsl=***&p_ca=***&p_ur=***&p_idc=***&nonce=***&_ssign=***", "pwd": 1, "child": 0, "desc": "成功" }通过google浏览器的F12开发者工具,切换到Application选项卡,找到Cookies,找到
https://account.xiaomi.com,可以看到passToken和userId以及passToken的值。把他们复制到代码中,修改如下:
diff --git a/miservice/miaccount.py b/miservice/miaccount.py index 3d3c499..b47f5a5 100644 --- a/miservice/miaccount.py +++ b/miservice/miaccount.py @@ -101,16 +101,25 @@ class MiAccount: return False
async def _serviceLogin(self, uri, data=None):
headers = {'User-Agent': 'APP/com.xiaomi.mihome APPV/6.0.103 iosPassportSDK/3.9.0 iOS/14.4 miHSTS'}cookies = {'sdkVersion': '3.9', 'deviceId': self.token['deviceId']}if 'passToken' in self.token:cookies['userId'] = self.token['userId']cookies['passToken'] = self.token['passToken']
headers = {'User-Agent': 'APP/com.xiaomi.mihome APPV/6.0.103 iosPassportSDK/3.9.0 iOS/14.4 miHSTS'}cookies = {'sdkVersion': '3.9','deviceId': "your_device_id",'userId': "your_user_id",'passToken': "your_pass_token",} url = 'https://account.xiaomi.com/pass/' + uri
async with self.request(url, 'GET' if data is None else 'POST', data=data, cookies=cookies, headers=headers) as r:
async with self.request(url,'GET' if data is None else 'POST',data=data,cookies=cookies,headers=headers) as r: raw = await r.read() resp = loads(raw[11:])
async def _securityTokenService(self, location, nonce, ssecurity): 之后就可以成功登录正常使用了。# _LOGGER.debug("%s: %s", uri, resp) return resp
感谢大佬的回复及教程,我改完之后确实可以正常登录了,但是我输入micli list 之后没有数据了,返回了一个[] 空白,请问大佬这是怎么回事
点赞
浏览器打开网址
https://account.xiaomi.com/pass/serviceLogin?sid=xiaomiio&_json=true
登陆成功后可以看到类似如下的信息
&&&START&&&{ "notificationUrl": "", "code": 0, "description": "成功", "securityStatus": 0, "userId": "***", "cUserId": "***", "result": "ok", "psecurity": "***", "captchaUrl": null, "location": "https://sts.api.io.mi.com/sts?d=***&ticket=***&pwd=***&p_ts=***&fid=***&p_lm=***&auth=***&m=***&_group=***&tsl=***&p_ca=***&p_ur=***&p_idc=***&nonce=***&_ssign=***", "pwd": 1, "child": 0, "desc": "成功" }通过google浏览器的F12开发者工具,切换到Application选项卡,找到Cookies,找到
https://account.xiaomi.com,可以看到passToken和userId以及passToken的值。把他们复制到代码中,修改如下:
diff --git a/miservice/miaccount.py b/miservice/miaccount.py index 3d3c499..b47f5a5 100644 --- a/miservice/miaccount.py +++ b/miservice/miaccount.py @@ -101,16 +101,25 @@ class MiAccount: return False
async def _serviceLogin(self, uri, data=None):
headers = {'User-Agent': 'APP/com.xiaomi.mihome APPV/6.0.103 iosPassportSDK/3.9.0 iOS/14.4 miHSTS'}cookies = {'sdkVersion': '3.9', 'deviceId': self.token['deviceId']}if 'passToken' in self.token:cookies['userId'] = self.token['userId']cookies['passToken'] = self.token['passToken']
headers = {'User-Agent': 'APP/com.xiaomi.mihome APPV/6.0.103 iosPassportSDK/3.9.0 iOS/14.4 miHSTS'}cookies = {'sdkVersion': '3.9','deviceId': "your_device_id",'userId': "your_user_id",'passToken': "your_pass_token",} url = 'https://account.xiaomi.com/pass/' + uri
async with self.request(url, 'GET' if data is None else 'POST', data=data, cookies=cookies, headers=headers) as r:
async with self.request(url,'GET' if data is None else 'POST',data=data,cookies=cookies,headers=headers) as r: raw = await r.read() resp = loads(raw[11:])
async def _securityTokenService(self, location, nonce, ssecurity): 之后就可以成功登录正常使用了。# _LOGGER.debug("%s: %s", uri, resp) return resp
大佬, 我怎么还是不行
mi micli.py list
Exception on login 18813073094: GET
Traceback (most recent call last):
File "/Users/eva/workspace/mi/myenv/lib/python3.9/site-packages/miservice/miaccount.py", line 56, in login
resp = await self._serviceLogin(f'serviceLogin?sid={sid}&_json=true')
File "/Users/eva/workspace/mi/myenv/lib/python3.9/site-packages/miservice/miaccount.py", line 102, in _serviceLogin
async with self.session.request(
File "/Users/eva/workspace/mi/myenv/lib/python3.9/site-packages/aiohttp/client.py", line 1510, in __aenter__
self._resp: _RetType = await self._coro
File "/Users/eva/workspace/mi/myenv/lib/python3.9/site-packages/aiohttp/client.py", line 639, in _request
raise err_exc_cls(url)
aiohttp.client_exceptions.InvalidUrlClientError: GET
Error https://api.io.mi.com/app/home/device_list: Login failed
(myenv) ➜ mi