AlexaController.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. # @Author : Rocky
  2. # @File : AlexaController.py
  3. # @Time : 2023/12/25 10:46
  4. import requests
  5. from django.views import View
  6. from Object.ResponseObject import ResponseObject
  7. from Object.TokenObject import TokenObject
  8. class AppToAppView(View):
  9. def get(self, request, *args, **kwargs):
  10. request.encoding = 'utf-8'
  11. operation = kwargs.get('operation')
  12. return self.validation(request.GET, operation, request)
  13. def post(self, request, *args, **kwargs):
  14. request.encoding = 'utf-8'
  15. operation = kwargs.get('operation')
  16. return self.validation(request.POST, operation, request)
  17. def validation(self, request_dict, operation, request):
  18. response = ResponseObject()
  19. token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
  20. if token.code != 0:
  21. return response.json(token.code)
  22. user_id = token.userID
  23. if operation == 'getAlexaAppURLAndLWAFallbackURL': # 获取Alexa App和LWA fallback URL
  24. return self.get_alexa_app_url_and_lwa_fallback_url(response)
  25. elif operation == 'accountLinkWithAmazonAuthorizationCode': # 通过亚马逊授权码连接账号
  26. return self.account_link_with_amazon_authorization_code(user_id, request_dict, response)
  27. else:
  28. return response.json(414)
  29. @staticmethod
  30. def get_alexa_app_url_and_lwa_fallback_url(response):
  31. client_id = 'amzn1.application-oa2-client.98a01914518743e481d51115144dafb0' # Alexa Client Id
  32. skill_stage = 'development' # 开发中: development, 已上线: live
  33. redirect_uri = 'https://smart.loocam2.com'
  34. alexa_app_url = 'https://alexa.amazon.com/spa/skill-account-linking-consent?' \
  35. 'fragment=skill-account-linking-consent&client_id={}&' \
  36. 'scope=alexa::skills:account_linking&skill_stage={}&response_type=code&' \
  37. 'redirect_uri={}'.format(client_id, skill_stage, redirect_uri)
  38. lwa_fallback_url = 'https://www.amazon.com/ap/oa?' \
  39. 'client_id={}&scope=alexa::skills:account_linking&response_type=code&redirect_uri={}&'.\
  40. format(client_id, redirect_uri)
  41. res = {
  42. 'alexa_app_url': alexa_app_url,
  43. 'lwa_fallback_url': lwa_fallback_url
  44. }
  45. return response.json(0, res)
  46. @staticmethod
  47. def account_link_with_amazon_authorization_code(user_id, request_dict, response):
  48. amazon_authorization_code = request_dict.get('amazon_authorization_code', None)
  49. if not amazon_authorization_code:
  50. return response.json(444)
  51. # 获取亚马逊访问令牌
  52. url = 'https://api.amazon.com/auth/o2/token'
  53. base_uri = 'https://smart.loocam2.com'
  54. data = {
  55. 'grant_type': 'authorization_code',
  56. 'code': amazon_authorization_code,
  57. 'client_id': 'amzn1.application-oa2-client.98a01914518743e481d51115144dafb0',
  58. 'client_secret': '43353cac67670aefd64a5f95309754ddd6bcfe8a087cc3cad1348b626f64b132',
  59. 'redirect_uri': base_uri
  60. }
  61. r = requests.post(url=url, data=data)
  62. if r.status_code != 200:
  63. return response.json(10, '{}请求响应状态码错误:{}'.format(url, r.status_code))
  64. res_data = eval(r.content)
  65. print(res_data)
  66. if res_data.get('access_token'):
  67. amazon_access_token = res_data['access_token']
  68. else:
  69. return response.json(10, '{}请求响应缺失令牌:{}'.format(url, res_data))
  70. # 获取用户授权码
  71. url = base_uri + '/appToApp/oa2/getAuthCode'
  72. params = {
  73. 'user_id': user_id
  74. }
  75. r = requests.get(url=url, params=params)
  76. if r.status_code != 200:
  77. return response.json(10, '{}请求响应状态码错误:{}'.format(url, r.status_code))
  78. res = eval(r.content)
  79. user_authorization_code = res['res']['user_authorization_code']
  80. data = {
  81. "stage": "development",
  82. "accountLinkRequest": {
  83. "redirectUri": base_uri,
  84. "authCode": user_authorization_code,
  85. "type": "AUTH_CODE"
  86. }
  87. }
  88. # 请求连接skill
  89. headers = {
  90. 'Content-Type': 'application/json',
  91. 'Authorization': "Bearer {}".format(amazon_access_token)
  92. }
  93. skill_id = 'amzn1.ask.skill.ff5a5074-7ec7-442b-979b-cb57095f7a94'
  94. url = 'https://api.amazonalexa.com/v1/users/~current/skills/{}/enablement'.format(skill_id)
  95. get_token_res = requests.post(headers=headers, url=url, json=data)
  96. res_data = eval(get_token_res.content)
  97. print(res_data)
  98. return response.json(0)