AlexaController.py 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. from Ansjer.config import SERVER_DOMAIN_SSL
  9. class AppToAppView(View):
  10. def get(self, request, *args, **kwargs):
  11. request.encoding = 'utf-8'
  12. operation = kwargs.get('operation')
  13. return self.validation(request.GET, operation, request)
  14. def post(self, request, *args, **kwargs):
  15. request.encoding = 'utf-8'
  16. operation = kwargs.get('operation')
  17. return self.validation(request.POST, operation, request)
  18. def validation(self, request_dict, operation, request):
  19. response = ResponseObject()
  20. token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
  21. if token.code != 0:
  22. return response.json(token.code)
  23. if operation == 'getAlexaAppURLAndLWAFallbackURL': # 获取Alexa App和LWA fallback URL
  24. return self.get_alexa_app_url_and_lwa_fallback_url(response)
  25. elif operation == 'exchangesTheAmazonAuthorizationCode': # 根据亚马逊验证码获取亚马逊访问令牌
  26. return self.exchanges_the_amazon_authorization_code(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'
  32. skill_stage = 'development' # 开发中: development, 已上线: live
  33. """
  34. Alexa Redirect URLs
  35. https://pitangui.amazon.com/api/skill/link/M1GQ2T9YG53MFV
  36. https://alexa.amazon.co.jp/api/skill/link/M1GQ2T9YG53MFV
  37. https://layla.amazon.com/api/skill/link/M1GQ2T9YG53MFV
  38. """
  39. redirect_uri = 'https://pitangui.amazon.com/api/skill/link/M1GQ2T9YG53MFV'
  40. alexa_app_url = 'https://alexa.amazon.com/spa/skill-account-linking-consent?' \
  41. 'fragment=skill-account-linking-consent&client_id={}&' \
  42. 'scope=alexa::skills:account_linking&skill_stage={}&response_type=code&' \
  43. 'redirect_uri={}'.format(client_id, skill_stage, redirect_uri)
  44. lwa_fallback_url = 'https://www.amazon.com/ap/oa?' \
  45. 'client_id={}&scope=alexa::skills:account_linking&response_type=code&redirect_uri={}&'.\
  46. format(client_id, redirect_uri)
  47. res = {
  48. 'alexa_app_url': alexa_app_url,
  49. 'lwa_fallback_url': lwa_fallback_url
  50. }
  51. return response.json(0, res)
  52. @staticmethod
  53. def exchanges_the_amazon_authorization_code(request_dict, response):
  54. amazon_authorization_code = request_dict.get('amazon_authorization_code', None)
  55. if not amazon_authorization_code:
  56. return response.json(444)
  57. url = 'https://api.amazon.com/auth/o2/token'
  58. data = {
  59. 'grant_type': 'authorization_code',
  60. 'code': amazon_authorization_code,
  61. 'client_id': 'amzn1.application-oa2-client.98a01914518743e481d51115144dafb0',
  62. 'client_secret': '43353cac67670aefd64a5f95309754ddd6bcfe8a087cc3cad1348b626f64b132',
  63. 'redirect_uri': amazon_authorization_code,
  64. }
  65. requests.post(url=url, data=data)
  66. return response.json(0)