import json
import requests
import os,re,random,string
import hashlib
import time
import base64
import hass_frontend
from urllib import parse
from threading import Thread,Event
import logging
_LOGGER = logging.getLogger(__name__)
class xiaomi_tts:
def __init__(self,hass,config , user=None,password=None):
requests.packages.urllib3.disable_warnings()
self.login_resutl=False
self.config = config
self.hass = hass
self._CONFIGURING = {}
self._user=user
self._password=password
self.Service_Token=None
self.deviceIds=None
self.userId=None
self._cookies={}
self._request=requests.session()
self._headers={'Host': 'account.xiaomi.com',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9'}
self._LoginByPassord()
# else:
# self._LoginByPassord()#No write permission
@property
def Service_Token_Cookie(self):
return self.Service_Token
@property
def Login_resutl(self):
return self.login_resutl
@property
def deviceIds_miai(self):
return self.deviceIds
def request_app_setup(self,image_name):
"""Assist user with configuring the Fitbit dev application."""
configurator = self.hass.components.configurator
try:
self.hass.components.configurator.request_done(self._CONFIGURING.pop("MIAI"))
except:
pass
def fitbit_configuration_callback(callback_data):
self._serviceLoginAuth2(callback_data.get('code'))
if self._serviceLoginAuth2_json['code']==0:
if not self._login_miai():
_LOGGER.warning('login miai Failed')
else:
if not self._get_deviceId():
_LOGGER.warning('get_deviceId Failed')
elif self._serviceLoginAuth2_json['code']==70016:
_LOGGER.warning('incorrect password')
elif self._serviceLoginAuth2_json['code']==87001:
_LOGGER.warning('incorrect codes')
self._LoginByPassord()
else:
_LOGGER.error(self._serviceLoginAuth2_json)
if self.Service_Token != None and self.deviceIds != None:
self.hass.components.configurator.request_done(self._CONFIGURING.pop("MIAI"))
self.login_resutl = True
description = """请输入验证码"""
submit = "登录"
self._CONFIGURING['MIAI'] = configurator.request_config(
'MIAI', fitbit_configuration_callback,
description=description, submit_caption=submit,
description_image="/static/images/miai{}.jpg".format(image_name),
fields=[{'id': 'code', 'name': '验证码', 'type': ''}]
)
def _LoginByPassord(self):
if not self._get_sign():
_LOGGER.warning("get_sign Failed")
else:
if not self._serviceLoginAuth2():
_LOGGER.warning('Request Login_url Failed')
else:
if self._serviceLoginAuth2_json['code']==0:
#logon success,run self._login_miai()
if not self._login_miai():
_LOGGER.warning('login miai Failed')
else:
if not self._get_deviceId():
_LOGGER.warning('get_deviceId Failed')
if self.Service_Token != None and self.deviceIds != None:
self.login_resutl = True
elif self._serviceLoginAuth2_json['code']==87001:
self._headers['Cookie']=self._headers['Cookie']+'; pwdToken={}'.format(self._cookies['pwdToken'])
path = os.path.dirname(hass_frontend.__file__)
try:
current_time= int(round(time.time() * 1000))
r= self._request.get('https://account.xiaomi.com/pass/getCode?icodeType=login&{}'.format(current_time),headers=self._headers,timeout=3,cookies=self._cookies,verify=False)
self._cookies['ick']=self._request.cookies.get_dict()['ick']
if os.access(path+'/images',os.W_OK):
with open(path+'/images'+'/miai{}.jpg'.format(current_time),'wb') as f:
f.write(r.content)
f.close()
self.request_app_setup(current_time)
except IOError as e:
_LOGGER.warning(e)
except BaseException as e:
_LOGGER.warning(e)
elif self._serviceLoginAuth2_json['code']==70016:
_LOGGER.error('incorrect password')
def _get_sign(self):
url = 'https://account.xiaomi.com/pass/serviceLogin?sid=micoapi'
pattern = re.compile(r'_sign":"(.*?)",')
try:
r = self._request.get(url,headers=self._headers,timeout=3,verify=False)
self._cookies['pass_trace']=self._request.cookies.get_dict()['pass_trace']
self._sign=pattern.findall(r.text)[0]
return True
except BaseException as e:
_LOGGER.warning(e)
return False
def _serviceLoginAuth2(self,captCode=None):
url='https://account.xiaomi.com/pass/serviceLoginAuth2'
self._headers['Content-Type']='application/x-www-form-urlencoded'
self._headers['Accept']='*/*'
self._headers['Origin']='https://account.xiaomi.com'
self._headers['Referer']='https://account.xiaomi.com/pass/serviceLogin?sid=micoapi'
# self._headers['Cookie']='pass_ua={}; deviceId={}; pass_trace={}; uLocale={}; JSESSIONID={}'.format(self._cookies['pass_ua'],self._cookies['deviceId'],self._cookies['pass_trace'],self._cookies['uLocale'],self._cookies['JSESSIONID'])
self._headers['Cookie']='pass_trace={};'.format(self._cookies['pass_trace'])
auth_post_data={'_json':'true',
'_sign':self._sign,
'callback':'https://api.mina.mi.com/sts',
'hash':hashlib.md5(self._password.encode('utf-8')).hexdigest().upper(),
'qs':'%3Fsid%3Dmicoapi',
'serviceParam':'{"checkSafePhone":false}',
'sid':'micoapi',
'user':self._user}
try:
if captCode!=None:
url='https://account.xiaomi.com/pass/serviceLoginAuth2?_dc={}'.format(int(round(time.time() * 1000)))
auth_post_data['captCode']=captCode
self._headers['Cookie']=self._headers['Cookie']+'; ick={}'.format(self._cookies['ick'])
r= self._request.post(url,headers=self._headers,data=auth_post_data,timeout=3,cookies=self._cookies,verify=False)
self._cookies['pwdToken']=self._request.cookies.get_dict()['passToken']
self._serviceLoginAuth2_json=json.loads(r.text[11:])
return True
except BaseException as e:
return False
_LOGGER.warning(e)
def _login_miai(self):
serviceToken = "nonce={}&{}".format(self._serviceLoginAuth2_json['nonce'],self._serviceLoginAuth2_json['ssecurity'])
serviceToken_sha
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
hello_miai_2020_天睿Tera.7z (3个子文件)
hello_miai
services.yaml 1KB
manifest.json 183B
__init__.py 19KB
共 3 条
- 1
资源评论
杨天睿TeraYang
- 粉丝: 438
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功