import
os
import
sys
from
miservice.miaccount
import
MiAccount
from
miservice.minaservice
import
MiNAService
from
aiohttp
import
ClientSession
from
requests.utils
import
cookiejar_from_dict
import
time
import
json
import
asyncio
import
logging
COMMAND
=
{
"投影仪对焦"
: [
"/root/projector.py focus"
,
"已对焦"
],
"投影仪音量加"
: [
"/root/projector.py volumn1"
,
"已增加音量"
],
"投影仪音量减"
: [
"/root/projector.py volumn2"
,
"已降低音量"
],
"投影仪关机"
: [
"/root/projector.py poweroff"
,
"已关机"
],
"打开主机"
: [
"wakeonlan xx:xx:xx:xx:xx:xx"
,
"已开启主机"
],
"关闭主机"
: [
"ssh -o ConnectTimeout=1 [email]root@192.168.123.60[/email] shutdown -h now"
,
"已关闭主机"
],
"打开桌面"
: [
"/root/tools/switch/switch.py on"
,
"已打开桌面电脑"
],
"关闭桌面"
: [
"ssh -o ConnectTimeout=1 [email]root@192.168.123.100[/email] shutdown -h now; sleep 30; /root/tools/switch/switch.py off"
,
"已关闭桌面电脑"
]
}
LATEST_ASK_API
=
"https://userprofile.mina.mi.com/device_profile/v2/conversation?source=dialogu&hardware={hardware}×tamp={timestamp}&limit=1"
logger
=
logging.getLogger(__name__)
logger.setLevel(logging.INFO)
handler
=
logging.StreamHandler(sys.stdout)
handler.setFormatter(logging.Formatter(
'%(asctime)s - %(levelname)s - %(message)s'
))
logger.addHandler(handler)
async
def
main():
username
=
"小米账号手机号"
password
=
"小米账号密码"
hardware
=
"L06A"
while
True
:
try
:
misession
=
ClientSession()
account
=
MiAccount(misession, username, password,
"mi.token"
)
await account.login(
"micoapi"
)
service
=
MiNAService(account)
device_list
=
await service.device_list()
deviceID
=
device_list[
0
][
'deviceID'
]
async with ClientSession() as session:
cookies
=
dict
(
deviceId
=
deviceID,
serviceToken
=
service.account.token[
'micoapi'
][
1
],
userId
=
service.account.token[
'userId'
]
)
misession.cookie_jar.update_cookies(cookiejar_from_dict(cookies))
session._cookie_jar
=
misession.cookie_jar
while
True
:
r
=
await session.get(
LATEST_ASK_API.
format
(hardware
=
hardware, timestamp
=
str
(
int
(time.time()
*
1000
))))
res
=
await r.json()
data
=
json.loads(res[
"data"
])
record
=
data[
'records'
][
0
]
query
=
record[
'query'
]
answer
=
""
if
len
(record[
'answers'
]) >
0
:
answer
=
record[
'answers'
][
0
][
'tts'
][
'text'
]
query_timestamp
=
record[
'time'
]
/
1000
query_time
=
time.strftime(
"%Y-%m-%d %H:%M:%S"
, time.localtime(query_timestamp))
logger.info(
"%s %s %s"
, query_time, query, answer)
if
abs
(query_timestamp
-
time.time()) <
3
and
COMMAND.get(query):
print
(f
"{query} 已执行命令"
)
os.popen(COMMAND.get(query)[
0
])
await service.text_to_speech(deviceID, COMMAND.get(query)[
1
])
time.sleep(
2
)
except
Exception as e:
logger.error(e)
time.sleep(
5
)
asyncio.run(main())