deviceStatus.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. """
  5. import json
  6. import time, datetime
  7. import requests
  8. import uuid
  9. import logging
  10. from django.views.generic import TemplateView
  11. from django.http import JsonResponse
  12. import http.client
  13. from urllib.parse import urlencode
  14. from object.ResObject import ResObject
  15. import subprocess
  16. # from gevent.pool import Pool
  17. from model.models import UserModel, UidRtspModel, SwitchModel
  18. from object.ResponseObject import ResponseObject
  19. from object.tkObject import tkObject
  20. from service.CommonService import CommonService
  21. from model.models import AlexaAuthModel
  22. from object.RedisObject import RedisObject
  23. from django.utils.decorators import method_decorator
  24. from django.views.decorators.csrf import csrf_exempt
  25. from azoauth.config import *
  26. class deviceStatus(TemplateView):
  27. @method_decorator(csrf_exempt)
  28. def dispatch(self, *args, **kwargs):
  29. return super(deviceStatus, self).dispatch(*args, **kwargs)
  30. def get(self, request, *args, **kwargs):
  31. request.encoding = 'utf-8'
  32. operation = kwargs.get('operation')
  33. return self.validation(request.GET, request, operation)
  34. def post(self, request, *args, **kwargs):
  35. request.encoding = 'utf-8'
  36. operation = kwargs.get('operation')
  37. return self.validation(request.POST, request, operation)
  38. def validation(self, request_dict, request, operation):
  39. response = ResponseObject()
  40. if operation == 'saveAccessToken':
  41. return self.saveAccessToken(request_dict)
  42. elif operation == 'addOrUpdateV2':
  43. return self.addOrUpdateV2(request_dict)
  44. elif operation == 'addOrUpdateSwitch':
  45. return self.addOrUpdateSwitch(request_dict)
  46. elif operation == 'delete':
  47. return self.delete(request_dict)
  48. elif operation == 'stateReport':
  49. return self.StateReport(request_dict)
  50. elif operation == 'deleteSwitch':
  51. return self.deleteSwitch(request_dict)
  52. def saveAccessToken(self, request_dict):
  53. token = request_dict.get("token", '')
  54. alexa_region = request_dict.get("region", '')
  55. skill_name = request_dict.get("skill_name", '')
  56. access_token = request_dict.get("access_token", '')
  57. refresh_token = request_dict.get("refresh_token", '')
  58. logger = logging.getLogger('django')
  59. logger.info('认证登录,参数: {}'.format(request_dict))
  60. try:
  61. alex_auth_qs = AlexaAuthModel.objects.filter(token=token, skill_name=skill_name)
  62. nowTime = int(time.time())
  63. if not alex_auth_qs.exists():
  64. AlexaAuthModel.objects.create(
  65. token=token,
  66. addTime=nowTime,
  67. updTime=nowTime,
  68. alexa_region=alexa_region,
  69. access_token=access_token,
  70. refresh_token=refresh_token,
  71. expiresTime=nowTime + 3200,
  72. skill_name=skill_name
  73. )
  74. else:
  75. alex_auth_qs.update(
  76. token=token,
  77. updTime=nowTime,
  78. alexa_region=alexa_region,
  79. access_token=access_token,
  80. refresh_token=refresh_token,
  81. expiresTime=nowTime + 3200,
  82. )
  83. # 更新业务服务器的token
  84. user_qs = UserModel.objects.filter(access_token=token).values('userID')
  85. if user_qs.exists():
  86. user_id = user_qs[0]['userID']
  87. if alexa_region == 'US':
  88. base_url = SERVER_PREFIX_TEST # SERVER_PREFIX
  89. else:
  90. base_url = SERVER_PREFIX_EU
  91. url = '{}/alexaApi/appToApp/updateToken'.format(base_url)
  92. data = {
  93. 'user_id': user_id,
  94. 'access_token': access_token,
  95. 'refresh_token': refresh_token
  96. }
  97. r = requests.post(url=url, data=data, timeout=10)
  98. logger.info('请求更新token状态码: {}'.format(r.status_code))
  99. return JsonResponse({'code': 200, 'msg': 'success'})
  100. except Exception as e:
  101. logger.info('授权登录接口异常: error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  102. return JsonResponse({'code': 500, 'msg': 'error'})
  103. # 向alexa事件网关发送更新设备操作V2接口
  104. def addOrUpdateV2(self, request_dict):
  105. logger = logging.getLogger('django')
  106. logger.info('--------添加/更新设备信息V2--------')
  107. region = request_dict.get("region", 'EN')
  108. data_list = request_dict.get("data_list", '')
  109. logger.info('data_list: {}'.format(data_list))
  110. data_list = json.loads(data_list) # 多通道设备才传 channel 键值对
  111. if not data_list:
  112. return JsonResponse({'code': 101, 'msg': 'Parameter error'})
  113. try:
  114. UID = data_list[0]['UID']
  115. userID = data_list[0]['userID']
  116. password = data_list[0]['password']
  117. password = CommonService().decode_pwd(password)
  118. # 获取alexa授权信息
  119. alexAuth = AlexaAuthModel.objects.filter(userID=userID). \
  120. values('expiresTime', 'access_token', 'refresh_token', 'alexa_region', 'skill_name')
  121. if not alexAuth.exists():
  122. logger.info('UID为 {} 的用户不存在'.format(UID))
  123. return JsonResponse({'code': 102, 'msg': 'not found user'})
  124. skill_name = alexAuth[0]['skill_name']
  125. expiresTime = alexAuth[0]['expiresTime']
  126. access_token = alexAuth[0]['access_token']
  127. refresh_token = alexAuth[0]['refresh_token']
  128. alexa_region = alexAuth[0]['alexa_region']
  129. if alexa_region not in ALEXA_EVENT_API.keys():
  130. logger.info('alexa区域信息错误,alexa_region: {}'.format(alexa_region))
  131. return JsonResponse({'code': 102, 'msg': 'alexa_region error'})
  132. # 更新alexa token
  133. now_time = int(time.time())
  134. if now_time > expiresTime:
  135. logger.info(refresh_token)
  136. res = self.getRefreshToken(refresh_token, skill_name)
  137. logger.info(res)
  138. if 'error' not in res:
  139. alexAuth.update(
  140. updTime=now_time,
  141. expiresTime=now_time + 3000,
  142. access_token=res['access_token'],
  143. refresh_token=res['refresh_token'],
  144. )
  145. access_token = res['access_token']
  146. else:
  147. logger.info('get refresh_token fail')
  148. return JsonResponse({'code': 102, 'msg': 'get refresh_token fail'})
  149. # 添加rtsp记录
  150. channel = len(data_list) # 列表的元素个数即通道数量
  151. rtsp_url = tkObject(rank=1).encrypt(data=UID)
  152. uid_rtsp_qs = UidRtspModel.objects.filter(uid__contains=UID)
  153. if not uid_rtsp_qs.exists():
  154. # 创建UidRtsp数据
  155. if channel == 1:
  156. # 单通道设备
  157. UidRtspModel.objects.create(user_id=userID, uid=UID, nick=data_list[0]['uid_nick'], region=region,
  158. rtsp_url=rtsp_url, password=password, addTime=now_time,
  159. updTime=now_time)
  160. else:
  161. # 多通道设备
  162. bulk = []
  163. for data in data_list:
  164. uid = UID + '_' + str(data['channel']) # 多通道设备: uid_通道号
  165. uidRtsp = UidRtspModel(user_id=userID, uid=uid, nick=data['uid_nick'], region=region,
  166. rtsp_url=rtsp_url, password=password, addTime=now_time, updTime=now_time)
  167. bulk.append(uidRtsp)
  168. UidRtspModel.objects.bulk_create(bulk)
  169. else:
  170. # 更新UidRtsp数据
  171. count = len(uid_rtsp_qs)
  172. if count != channel:
  173. return JsonResponse({'code': 103, 'msg': '通道数不匹配'})
  174. if count == 1:
  175. uid_rtsp_qs.update(nick=data_list[0]['uid_nick'], region=region, password=password, user_id=userID)
  176. else:
  177. # 多通道设备
  178. for data in data_list:
  179. uid = UID + '_' + str(data['channel']) # 多通道设备: uid_通道号
  180. UidRtspModel.objects.filter(uid=uid).update(nick=data['uid_nick'], region=region,
  181. user_id=userID, password=password)
  182. api_uri = ALEXA_EVENT_API[alexa_region]
  183. messageId = str(uuid.uuid4()).strip()
  184. bearer_access_token = "Bearer {access_token}".format(access_token=access_token)
  185. headers = {"content-type": "application/json", "Authorization": bearer_access_token}
  186. endpoints = self.append_endpoint(data_list, channel)
  187. payload_json = {
  188. "event": {
  189. "header": {
  190. "namespace": "Alexa.Discovery",
  191. "name": "AddOrUpdateReport",
  192. "payloadVersion": "3",
  193. "messageId": messageId,
  194. },
  195. "payload": {
  196. "endpoints": endpoints,
  197. "scope": {
  198. "type": "BearerToken",
  199. "token": 'sdf',
  200. },
  201. },
  202. }
  203. }
  204. logger.info('--------Alexa AddOrUpdateReport请求: url:{},data:{}--------'.format(api_uri, payload_json))
  205. response = requests.post(api_uri, json=payload_json, headers=headers)
  206. logger.info('--------Alexa AddOrUpdateReport响应: {}--------'.format(response))
  207. return JsonResponse({'res': 'success'})
  208. except Exception as e:
  209. logger.info('--------添加/更新设备信息V2异常--------:error_line:{}, error_msg:{}'.
  210. format(e.__traceback__.tb_lineno, repr(e)))
  211. # 向alexa事件网关发送更新设备操作接口
  212. def addOrUpdateSwitch(self, request_dict):
  213. logger = logging.getLogger('django')
  214. logger.info('--------添加/更新插座信息--------')
  215. region = request_dict.get("region", 'US')
  216. nick_name = request_dict.get("nick_name", '')
  217. serial_number = request_dict.get("serial_number", '')
  218. user_id = request_dict.get("user_id", '')
  219. logger.info('region: {}, nick_name: {}, serial_number: {}, user_id: {}'.format(region, nick_name, serial_number,
  220. user_id))
  221. skill_name = 'loocam'
  222. if not all([nick_name, serial_number, user_id]):
  223. return JsonResponse({'code': 101, 'msg': 'Parameter error'})
  224. try:
  225. # 获取alexa授权信息
  226. alexAuth = AlexaAuthModel.objects.filter(userID=user_id, skill_name=skill_name). \
  227. values('expiresTime', 'access_token', 'refresh_token', 'alexa_region')
  228. if not alexAuth.exists():
  229. logger.info('serial_number {} 的用户不存在'.format(serial_number))
  230. return JsonResponse({'code': 102, 'msg': 'not found user'})
  231. expiresTime = alexAuth[0]['expiresTime']
  232. access_token = alexAuth[0]['access_token']
  233. refresh_token = alexAuth[0]['refresh_token']
  234. alexa_region = alexAuth[0]['alexa_region']
  235. if alexa_region not in ALEXA_EVENT_API.keys():
  236. logger.info('alexa区域信息错误,alexa_region: {}'.format(alexa_region))
  237. return JsonResponse({'code': 102, 'msg': 'alexa_region error'})
  238. # 更新alexa token
  239. now_time = int(time.time())
  240. if now_time > expiresTime:
  241. logger.info(refresh_token)
  242. res = self.getRefreshToken(refresh_token, skill_name)
  243. logger.info(res)
  244. if 'error' not in res:
  245. alexAuth.update(
  246. updTime=now_time,
  247. expiresTime=now_time + 3000,
  248. access_token=res['access_token'],
  249. refresh_token=res['refresh_token'],
  250. )
  251. access_token = res['access_token']
  252. else:
  253. logger.info('get refresh_token fail')
  254. return JsonResponse({'code': 102, 'msg': 'get refresh_token fail'})
  255. # 添加rtsp记录
  256. switch_qs = SwitchModel.objects.filter(serial_number=serial_number, userID=user_id)
  257. if switch_qs.exists():
  258. switch_qs.update(nick=nick_name, updTime=now_time)
  259. else:
  260. data = {
  261. 'nick': nick_name,
  262. 'serial_number': serial_number,
  263. 'userID': user_id,
  264. 'region': region,
  265. 'addTime': now_time,
  266. 'updTime': now_time,
  267. }
  268. SwitchModel.objects.create(**data)
  269. api_uri = ALEXA_EVENT_API[alexa_region]
  270. messageId = str(uuid.uuid4()).strip()
  271. bearer_access_token = "Bearer {access_token}".format(access_token=access_token)
  272. headers = {"content-type": "application/json", "Authorization": bearer_access_token}
  273. endpoints = [{
  274. "endpointId": serial_number,
  275. "manufacturerName": skill_name,
  276. "friendlyName": nick_name,
  277. "description": 'Plug connected via {}'.format(skill_name),
  278. "displayCategories": ['SMARTPLUG'],
  279. "cookie": {},
  280. "capabilities": [
  281. {
  282. "type": 'AlexaInterface',
  283. "interface": 'Alexa.PowerController',
  284. "version": '3',
  285. "properties": {
  286. "supported": [
  287. {
  288. "name": "powerState"
  289. }
  290. ],
  291. "proactivelyReported": True,
  292. "retrievable": True
  293. },
  294. },
  295. {
  296. "type": 'AlexaInterface',
  297. "interface": 'Alexa',
  298. "version": '3'
  299. }
  300. ]
  301. }]
  302. payload_json = {
  303. "event": {
  304. "header": {
  305. "namespace": "Alexa.Discovery",
  306. "name": "AddOrUpdateReport",
  307. "payloadVersion": "3",
  308. "messageId": messageId,
  309. },
  310. "payload": {
  311. "endpoints": endpoints,
  312. "scope": {
  313. "type": "BearerToken",
  314. "token": 'sdf',
  315. },
  316. },
  317. }
  318. }
  319. response = requests.post(api_uri, json=payload_json, headers=headers)
  320. logger.info('--------Alexa AddOrUpdateReport响应: {}--------'.format(response))
  321. return JsonResponse({'res': 'success'})
  322. except Exception as e:
  323. logger.info('--------添加/更新插座信息异常--------:error_line:{}, error_msg:{}'.
  324. format(e.__traceback__.tb_lineno, repr(e)))
  325. return JsonResponse({'res': 'error'})
  326. # 向alexa事件网关发送插座状态操作接口
  327. def StateReport(self, request_dict):
  328. logger = logging.getLogger('django')
  329. logger.info('--------alexa智能插座状态上报--------')
  330. serial_number = request_dict.get("serial_number", None)
  331. access_token = request_dict.get("access_token", None)
  332. logger.info('请求参数: {}'.format(request_dict))
  333. response = ResObject()
  334. if not all([serial_number, access_token]):
  335. return response.json(10, res={'msg': 'Parameter error'})
  336. user_qs = UserModel.objects.filter(access_token=access_token)
  337. if not user_qs.exists():
  338. return response.json(10, res={'msg': '用户数据不存在'})
  339. user_id = user_qs.first().userID
  340. switch_qs = SwitchModel.objects.filter(serial_number=serial_number).values('region')
  341. if not switch_qs.exists():
  342. return response.json(10, res={'msg': '设备不存在'})
  343. try:
  344. region = switch_qs[0]['region']
  345. if region == 'EU':
  346. domain_name = SERVER_PREFIX_EU
  347. elif region == 'CN':
  348. domain_name = SERVER_PREFIX_TEST
  349. else:
  350. domain_name = SERVER_PREFIX
  351. auth_request_url = '{}/api/loocam/open/socket/getSocketState'.format(domain_name)
  352. requests_data = {'serial_number': serial_number, 'alexa_user_id': user_id}
  353. res = requests.post(url=auth_request_url, data=requests_data)
  354. res_json = res.json()
  355. logger.info('{}正式服务器响应: {}'.format(region, res_json))
  356. if res_json['result_code'] != 0:
  357. return response.json(10, res={'msg': 'error'})
  358. power_state = res_json['result']['power_state']
  359. if power_state:
  360. res = {'state': 'ON'}
  361. else:
  362. res = {'state': 'OFF'}
  363. return response.json(0, res=res)
  364. except Exception as e:
  365. logger.info('--------上传插座状态异常--------:error_line:{}, error_msg:{}'.
  366. format(e.__traceback__.tb_lineno, repr(e)))
  367. return response.json(10, res={'msg': '上报状态异常'})
  368. def append_endpoint(self, data_list, channel):
  369. # 组织 endpoints 数据
  370. endpoints = []
  371. for data in data_list:
  372. endpointId = data['UID'] if channel == 1 else data['UID'] + '_' + str(data['channel'])
  373. endpoint = {
  374. "endpointId": endpointId,
  375. "manufacturerName": "zosi smart",
  376. "modelName": "P1425-LE",
  377. "friendlyName": data['uid_nick'],
  378. "description": "Camera connected via zosi smart",
  379. "displayCategories": ["CAMERA"],
  380. "capabilities": [
  381. {
  382. "type": "AlexaInterface",
  383. "interface": "Alexa.CameraStreamController",
  384. "version": "3",
  385. "cameraStreamConfigurations": [
  386. {
  387. "protocols": ["RTSP"],
  388. "resolutions": [{"width": 1280, "height": 720}],
  389. "authorizationTypes": ["NONE"],
  390. "videoCodecs": ["H264"],
  391. "audioCodecs": ["ACC"],
  392. }
  393. ],
  394. }
  395. ],
  396. }
  397. endpoints.append(endpoint)
  398. return endpoints
  399. # 向alexa事件网关发送删除设备操作
  400. def delete(self, request_dict):
  401. UID = request_dict.get("UID", '')
  402. userID = request_dict.get("userID", '')
  403. logger = logging.getLogger('django')
  404. logger.info('--------删除设备--------')
  405. logger.info('userID: {}, UID: {}'.format(userID, UID))
  406. if not all([UID, userID]):
  407. return JsonResponse({'code': 111, 'msg': 'fail'})
  408. try:
  409. alexAuth = AlexaAuthModel.objects.filter(userID=userID). \
  410. values('expiresTime', 'refresh_token', 'access_token', 'alexa_region', 'skill_name')
  411. if not alexAuth.exists():
  412. logger.info('UID为 {} 的用户不存在'.format(UID))
  413. return JsonResponse({'code': 102, 'msg': 'not found user'})
  414. skill_name = alexAuth[0]['skill_name']
  415. expiresTime = alexAuth[0]['expiresTime']
  416. refresh_token = alexAuth[0]['refresh_token']
  417. access_token = alexAuth[0]['access_token']
  418. alexa_region = alexAuth[0]['alexa_region']
  419. if alexa_region not in ALEXA_EVENT_API.keys():
  420. logger.info('alexa区域信息错误,alexa_region: {}'.format(alexa_region))
  421. return JsonResponse({'code': 102, 'msg': 'alexa_region error'})
  422. now_time = int(time.time())
  423. if now_time > expiresTime:
  424. res = self.getRefreshToken(refresh_token, skill_name)
  425. if 'error' not in res:
  426. alexAuth.update(
  427. access_token=res['access_token'],
  428. refresh_token=res['refresh_token'],
  429. expiresTime=now_time + 300,
  430. updTime=now_time,
  431. )
  432. access_token = res['access_token']
  433. else:
  434. return JsonResponse({'code': 102, 'msg': 'get refresh_token fail'})
  435. uidRtsp_qs = UidRtspModel.objects.filter(uid__contains=UID).values('uid')
  436. if not uidRtsp_qs.exists():
  437. return JsonResponse({'code': 103, 'msg': '不存在uidRtsp数据'})
  438. endpoints = []
  439. for uidRtsp in uidRtsp_qs:
  440. endpointId = {"endpointId": uidRtsp['uid']}
  441. endpoints.append(endpointId)
  442. headers = {
  443. "Authorization": "Bearer " + access_token,
  444. "Content-Type": "application/json;charset=UTF-8",
  445. "Cache-Control": "no-cache"
  446. }
  447. payload = {
  448. "event": {
  449. "header": {
  450. "namespace": "Alexa.Discovery",
  451. "name": "DeleteReport",
  452. "messageId": str(uuid.uuid4()),
  453. "payloadVersion": "3"
  454. },
  455. "payload": {
  456. "endpoints": endpoints,
  457. "scope": {
  458. "type": "BearerToken",
  459. "token": access_token
  460. }
  461. }
  462. }
  463. }
  464. api_uri = ALEXA_EVENT_API[alexa_region]
  465. response = requests.post(api_uri, json=payload, headers=headers)
  466. logger.info('--------Alexa DeleteReport响应: {}--------'.format(response))
  467. return JsonResponse({'res': 'success'})
  468. except Exception as e:
  469. logger.info('--------删除设备异常--------:error_line:{}, error_msg:{}'.
  470. format(e.__traceback__.tb_lineno, repr(e)))
  471. # 向alexa事件网关发送删除插座操作
  472. def deleteSwitch(self, request_dict):
  473. serial_number = request_dict.get("serial_number", '')
  474. logger = logging.getLogger('django')
  475. logger.info('--------删除插座--------')
  476. logger.info('serial_number: {}'.format(serial_number))
  477. if not all([serial_number]):
  478. return JsonResponse({'code': 111, 'msg': '参数异常'})
  479. skill_name = 'loocam'
  480. try:
  481. switch_qs = SwitchModel.objects.filter(serial_number=serial_number)
  482. if not switch_qs.exists():
  483. return JsonResponse({'code': 103, 'msg': '不存在socket数据'})
  484. userID = switch_qs[0].userID
  485. alexAuth = AlexaAuthModel.objects.filter(userID=userID, skill_name=skill_name). \
  486. values('expiresTime', 'refresh_token', 'access_token', 'alexa_region')
  487. if not alexAuth.exists():
  488. logger.info('序列号为 {} 的用户不存在'.format(serial_number))
  489. return JsonResponse({'code': 102, 'msg': 'not found user'})
  490. expiresTime = alexAuth[0]['expiresTime']
  491. refresh_token = alexAuth[0]['refresh_token']
  492. access_token = alexAuth[0]['access_token']
  493. alexa_region = alexAuth[0]['alexa_region']
  494. if alexa_region not in ALEXA_EVENT_API.keys():
  495. logger.info('alexa区域信息错误,alexa_region: {}'.format(alexa_region))
  496. return JsonResponse({'code': 102, 'msg': 'alexa_region error'})
  497. now_time = int(time.time())
  498. if now_time > expiresTime:
  499. res = self.getRefreshToken(refresh_token, skill_name)
  500. if 'error' not in res:
  501. alexAuth.update(
  502. access_token=res['access_token'],
  503. refresh_token=res['refresh_token'],
  504. expiresTime=now_time + 300,
  505. updTime=now_time,
  506. )
  507. access_token = res['access_token']
  508. else:
  509. return JsonResponse({'code': 102, 'msg': 'get refresh_token fail'})
  510. endpoints = []
  511. for switch in switch_qs:
  512. endpointId = {"endpointId": switch.serial_number}
  513. endpoints.append(endpointId)
  514. switch_qs.delete()
  515. headers = {
  516. "Authorization": "Bearer " + access_token,
  517. "Content-Type": "application/json;charset=UTF-8",
  518. "Cache-Control": "no-cache"
  519. }
  520. payload = {
  521. "event": {
  522. "header": {
  523. "namespace": "Alexa.Discovery",
  524. "name": "DeleteReport",
  525. "messageId": str(uuid.uuid4()),
  526. "payloadVersion": "3"
  527. },
  528. "payload": {
  529. "endpoints": endpoints,
  530. "scope": {
  531. "type": "BearerToken",
  532. "token": access_token
  533. }
  534. }
  535. }
  536. }
  537. api_uri = ALEXA_EVENT_API[alexa_region]
  538. response = requests.post(api_uri, json=payload, headers=headers)
  539. logger.info('--------Alexa DeleteReport响应: {}--------'.format(response))
  540. return JsonResponse({'res': 'success'})
  541. except Exception as e:
  542. logger.info('--------删除设备异常--------:error_line:{}, error_msg:{}'.
  543. format(e.__traceback__.tb_lineno, repr(e)))
  544. return JsonResponse({'res': 'error'})
  545. def getRefreshToken(self, refresh_token, skill_name):
  546. # 请求更新token
  547. logger = logging.getLogger('django')
  548. logger.info('--------{}请求更新token--------'.format(skill_name))
  549. if skill_name not in CLIENT_CONFIG.keys():
  550. # skill_name = 'Anlapus' # 应对UL测试,后期改回
  551. logger.info('--------技能名称错误,skill_name: {}--------'.format(skill_name))
  552. return JsonResponse({'code': 111, 'msg': 'skill_name error'})
  553. payload = {
  554. 'grant_type': 'refresh_token',
  555. 'refresh_token': refresh_token,
  556. 'client_id': CLIENT_CONFIG[skill_name]['client_id'],
  557. 'client_secret': CLIENT_CONFIG[skill_name]['client_secret'],
  558. }
  559. auth_request_url = 'https://api.amazon.com/auth/o2/token'
  560. headers = {
  561. 'content-type': "application/x-www-form-urlencoded",
  562. 'cache-control': "no-cache"
  563. }
  564. res = requests.post(auth_request_url, payload, headers)
  565. request_json = res.json()
  566. return request_json