123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- # @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)
|