MiService icon indicating copy to clipboard operation
MiService copied to clipboard

无法获取userid 但通过.mi.token 可以

Open 201692929 opened this issue 11 months ago • 4 comments

输入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文件也会自动删除 求大佬修复

201692929 avatar May 01 '25 03:05 201692929

浏览器打开网址

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,可以看到passTokenuserId以及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):

之后就可以成功登录正常使用了。

suzixin avatar May 11 '25 09:05 suzixin

浏览器打开网址

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,可以看到passTokenuserId以及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): 之后就可以成功登录正常使用了。

感谢大佬的回复及教程,我改完之后确实可以正常登录了,但是我输入micli list 之后没有数据了,返回了一个[] 空白,请问大佬这是怎么回事

201692929 avatar May 13 '25 08:05 201692929

点赞

wilddogqi avatar Oct 30 '25 03:10 wilddogqi

浏览器打开网址

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,可以看到passTokenuserId以及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): 之后就可以成功登录正常使用了。

大佬, 我怎么还是不行

  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 

yangrudan avatar Oct 30 '25 12:10 yangrudan