# @Author : Rocky # @File : AlexaController.py # @Time : 2023/12/25 10:46 import requests from django.views import View from Object.ResponseObject import ResponseObject from Object.TokenObject import TokenObject class AppToAppView(View): def get(self, request, *args, **kwargs): request.encoding = 'utf-8' operation = kwargs.get('operation') return self.validation(request.GET, operation, request) def post(self, request, *args, **kwargs): request.encoding = 'utf-8' operation = kwargs.get('operation') return self.validation(request.POST, operation, request) def validation(self, request_dict, operation, request): response = ResponseObject() token = TokenObject(request.META.get('HTTP_AUTHORIZATION')) if token.code != 0: return response.json(token.code) user_id = token.userID if operation == 'getAlexaAppURLAndLWAFallbackURL': # 获取Alexa App和LWA fallback URL return self.get_alexa_app_url_and_lwa_fallback_url(response) elif operation == 'accountLinkWithAmazonAuthorizationCode': # 通过亚马逊授权码连接账号 return self.account_link_with_amazon_authorization_code(user_id, request_dict, response) elif operation == 'getSkillPageURL': # 获取skill页面URL(取消链接) return self.get_skill_page_url(response) else: return response.json(414) @staticmethod def get_alexa_app_url_and_lwa_fallback_url(response): client_id = 'amzn1.application-oa2-client.98a01914518743e481d51115144dafb0' # Alexa Client Id skill_stage = 'development' # 开发中: development, 已上线: live redirect_uri = 'https://smart.loocam2.com' alexa_app_url = 'https://alexa.amazon.com/spa/skill-account-linking-consent?' \ 'fragment=skill-account-linking-consent&client_id={}&' \ 'scope=alexa::skills:account_linking&skill_stage={}&response_type=code&' \ 'redirect_uri={}'.format(client_id, skill_stage, redirect_uri) lwa_fallback_url = 'https://www.amazon.com/ap/oa?' \ 'client_id={}&scope=alexa::skills:account_linking&response_type=code&redirect_uri={}&'.\ format(client_id, redirect_uri) res = { 'alexa_app_url': alexa_app_url, 'lwa_fallback_url': lwa_fallback_url } return response.json(0, res) @staticmethod def account_link_with_amazon_authorization_code(user_id, request_dict, response): amazon_authorization_code = request_dict.get('amazon_authorization_code', None) if not amazon_authorization_code: return response.json(444) # 获取亚马逊访问令牌 url = 'https://api.amazon.com/auth/o2/token' base_uri = 'https://smart.loocam2.com' data = { 'grant_type': 'authorization_code', 'code': amazon_authorization_code, 'client_id': 'amzn1.application-oa2-client.98a01914518743e481d51115144dafb0', 'client_secret': '43353cac67670aefd64a5f95309754ddd6bcfe8a087cc3cad1348b626f64b132', 'redirect_uri': base_uri } try: r = requests.post(url=url, data=data, timeout=10) if r.status_code != 200: return response.json(10, '{}请求响应状态码错误:{}'.format(url, r.status_code)) res_data = eval(r.content) print(res_data) if res_data.get('access_token'): amazon_access_token = res_data['access_token'] else: return response.json(10, '{}请求响应缺失令牌:{}'.format(url, res_data)) # 获取用户授权码 url = base_uri + '/appToApp/oa2/getAuthCode' params = { 'user_id': user_id } r = requests.get(url=url, params=params, timeout=10) if r.status_code != 200: return response.json(10, '{}请求响应状态码错误:{}'.format(url, r.status_code)) res = eval(r.content) user_authorization_code = res['res']['user_authorization_code'] data = { "stage": "development", "accountLinkRequest": { "redirectUri": base_uri, "authCode": user_authorization_code, "type": "AUTH_CODE" } } # 请求连接skill headers = { 'Content-Type': 'application/json', 'Authorization': "Bearer {}".format(amazon_access_token) } skill_id = 'amzn1.ask.skill.ff5a5074-7ec7-442b-979b-cb57095f7a94' url = 'https://api.amazonalexa.com/v1/users/~current/skills/{}/enablement'.format(skill_id) get_token_res = requests.post(headers=headers, url=url, json=data, timeout=30) res_data = eval(get_token_res.content) print(res_data) return response.json(0) except Exception as e: print('error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e))) @staticmethod def get_skill_page_url(response): skill_asin = 'B0C94Q7H1L' skill_page_url = 'https://alexa.amazon.com/spa/index.html#skills/dp/{}'.format(skill_asin) lwa_page_url = 'https://www.amazon.com/dp/{}'.format(skill_asin) res = { 'skill_page_url': skill_page_url, 'lwa_page_url': lwa_page_url } return response.json(0, res)