|
@@ -12,6 +12,19 @@ from Object.TokenObject import TokenObject
|
|
from Ansjer.config import CONFIG_INFO, CONFIG_EUR
|
|
from Ansjer.config import CONFIG_INFO, CONFIG_EUR
|
|
|
|
|
|
|
|
|
|
|
|
+# 域名
|
|
|
|
+ALEXA_DOMAIN = 'smart.loocam2.com'
|
|
|
|
+AMAZON_API_DOMAIN = 'api.amazon.com'
|
|
|
|
+
|
|
|
|
+# Alexa loocam skill配置信息
|
|
|
|
+# https://developer.amazon.com/alexa/console/ask
|
|
|
|
+LOOCAM_SKILL_STAGE = 'development' # 开发中: development, 已上线: live
|
|
|
|
+LOOCAM_SKILL_ASIN = 'B0C94Q7H1L'
|
|
|
|
+LOOCAM_SKILL_ID = 'amzn1.ask.skill.ff5a5074-7ec7-442b-979b-cb57095f7a94'
|
|
|
|
+LOOCAM_CLIENT_ID = 'amzn1.application-oa2-client.98a01914518743e481d51115144dafb0',
|
|
|
|
+LOOCAM_CLIENT_SECRET = '43353cac67670aefd64a5f95309754ddd6bcfe8a087cc3cad1348b626f64b132'
|
|
|
|
+
|
|
|
|
+
|
|
class AppToAppView(View):
|
|
class AppToAppView(View):
|
|
def get(self, request, *args, **kwargs):
|
|
def get(self, request, *args, **kwargs):
|
|
request.encoding = 'utf-8'
|
|
request.encoding = 'utf-8'
|
|
@@ -44,16 +57,15 @@ class AppToAppView(View):
|
|
|
|
|
|
@staticmethod
|
|
@staticmethod
|
|
def get_alexa_app_url_and_lwa_fallback_url(response):
|
|
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
|
|
|
|
|
|
+ skill_stage = LOOCAM_SKILL_STAGE
|
|
redirect_uri = 'https://smart.loocam2.com'
|
|
redirect_uri = 'https://smart.loocam2.com'
|
|
alexa_app_url = 'https://alexa.amazon.com/spa/skill-account-linking-consent?' \
|
|
alexa_app_url = 'https://alexa.amazon.com/spa/skill-account-linking-consent?' \
|
|
'fragment=skill-account-linking-consent&client_id={}&' \
|
|
'fragment=skill-account-linking-consent&client_id={}&' \
|
|
'scope=alexa::skills:account_linking&skill_stage={}&response_type=code&' \
|
|
'scope=alexa::skills:account_linking&skill_stage={}&response_type=code&' \
|
|
- 'redirect_uri={}'.format(client_id, skill_stage, redirect_uri)
|
|
|
|
|
|
+ 'redirect_uri={}'.format(LOOCAM_CLIENT_ID, skill_stage, redirect_uri)
|
|
lwa_fallback_url = 'https://www.amazon.com/ap/oa?' \
|
|
lwa_fallback_url = 'https://www.amazon.com/ap/oa?' \
|
|
'client_id={}&scope=alexa::skills:account_linking&response_type=code&redirect_uri={}&'.\
|
|
'client_id={}&scope=alexa::skills:account_linking&response_type=code&redirect_uri={}&'.\
|
|
- format(client_id, redirect_uri)
|
|
|
|
|
|
+ format(LOOCAM_CLIENT_ID, redirect_uri)
|
|
res = {
|
|
res = {
|
|
'alexa_app_url': alexa_app_url,
|
|
'alexa_app_url': alexa_app_url,
|
|
'lwa_fallback_url': lwa_fallback_url
|
|
'lwa_fallback_url': lwa_fallback_url
|
|
@@ -69,14 +81,13 @@ class AppToAppView(View):
|
|
now_time = int(time.time())
|
|
now_time = int(time.time())
|
|
# 获取亚马逊访问令牌
|
|
# 获取亚马逊访问令牌
|
|
# https://developer.amazon.com/zh/docs/login-with-amazon/authorization-code-grant.html#access-token-request
|
|
# https://developer.amazon.com/zh/docs/login-with-amazon/authorization-code-grant.html#access-token-request
|
|
- amazon_base_uri = 'https://api.amazon.com'
|
|
|
|
- url = amazon_base_uri + '/auth/o2/token'
|
|
|
|
- redirect_uri = 'https://smart.loocam2.com'
|
|
|
|
|
|
+ url = 'https://{}/auth/o2/token'.format(AMAZON_API_DOMAIN)
|
|
|
|
+ redirect_uri = 'https://{}'.format(ALEXA_DOMAIN)
|
|
data = {
|
|
data = {
|
|
'grant_type': 'authorization_code',
|
|
'grant_type': 'authorization_code',
|
|
'code': amazon_authorization_code,
|
|
'code': amazon_authorization_code,
|
|
- 'client_id': 'amzn1.application-oa2-client.98a01914518743e481d51115144dafb0',
|
|
|
|
- 'client_secret': '43353cac67670aefd64a5f95309754ddd6bcfe8a087cc3cad1348b626f64b132',
|
|
|
|
|
|
+ 'client_id': LOOCAM_CLIENT_ID,
|
|
|
|
+ 'client_secret': LOOCAM_CLIENT_SECRET,
|
|
'redirect_uri': redirect_uri
|
|
'redirect_uri': redirect_uri
|
|
}
|
|
}
|
|
try:
|
|
try:
|
|
@@ -112,7 +123,7 @@ class AppToAppView(View):
|
|
res = eval(r.content)
|
|
res = eval(r.content)
|
|
user_authorization_code = res['res']['user_authorization_code']
|
|
user_authorization_code = res['res']['user_authorization_code']
|
|
data = {
|
|
data = {
|
|
- "stage": "development",
|
|
|
|
|
|
+ "stage": LOOCAM_SKILL_STAGE,
|
|
"accountLinkRequest": {
|
|
"accountLinkRequest": {
|
|
"redirectUri": redirect_uri,
|
|
"redirectUri": redirect_uri,
|
|
"authCode": user_authorization_code,
|
|
"authCode": user_authorization_code,
|
|
@@ -127,9 +138,8 @@ class AppToAppView(View):
|
|
'Authorization': 'Bearer {}'.format(amazon_access_token)
|
|
'Authorization': 'Bearer {}'.format(amazon_access_token)
|
|
}
|
|
}
|
|
alexa_api_endpoint_list = ['api.amazonalexa.com', 'api.eu.amazonalexa.com', 'api.fe.amazonalexa.com']
|
|
alexa_api_endpoint_list = ['api.amazonalexa.com', 'api.eu.amazonalexa.com', 'api.fe.amazonalexa.com']
|
|
- skill_id = 'amzn1.ask.skill.ff5a5074-7ec7-442b-979b-cb57095f7a94'
|
|
|
|
for alexa_api_endpoint in alexa_api_endpoint_list:
|
|
for alexa_api_endpoint in alexa_api_endpoint_list:
|
|
- url = 'https://{}/v1/users/~current/skills/{}/enablement'.format(alexa_api_endpoint, skill_id)
|
|
|
|
|
|
+ url = 'https://{}/v1/users/~current/skills/{}/enablement'.format(alexa_api_endpoint, LOOCAM_SKILL_ID)
|
|
r = requests.post(headers=headers, url=url, json=data, timeout=30)
|
|
r = requests.post(headers=headers, url=url, json=data, timeout=30)
|
|
if r.status_code == 201:
|
|
if r.status_code == 201:
|
|
AlexaOauth.objects.filter(user_id=user_id).\
|
|
AlexaOauth.objects.filter(user_id=user_id).\
|
|
@@ -180,9 +190,8 @@ class AppToAppView(View):
|
|
|
|
|
|
@staticmethod
|
|
@staticmethod
|
|
def get_skill_page_url(response):
|
|
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)
|
|
|
|
|
|
+ skill_page_url = 'https://alexa.amazon.com/spa/index.html#skills/dp/{}'.format(LOOCAM_SKILL_ASIN)
|
|
|
|
+ lwa_page_url = 'https://www.amazon.com/dp/{}'.format(LOOCAM_SKILL_ASIN)
|
|
res = {
|
|
res = {
|
|
'skill_page_url': skill_page_url,
|
|
'skill_page_url': skill_page_url,
|
|
'lwa_page_url': lwa_page_url
|
|
'lwa_page_url': lwa_page_url
|
|
@@ -202,13 +211,12 @@ class AppToAppView(View):
|
|
alexa_api_endpoint = alexa_oauth_qs[0]['alexa_api_endpoint']
|
|
alexa_api_endpoint = alexa_oauth_qs[0]['alexa_api_endpoint']
|
|
amazon_refresh_token = alexa_oauth_qs[0]['amazon_refresh_token']
|
|
amazon_refresh_token = alexa_oauth_qs[0]['amazon_refresh_token']
|
|
|
|
|
|
- amazon_base_uri = 'https://api.amazon.com'
|
|
|
|
- url = amazon_base_uri + '/auth/o2/token'
|
|
|
|
|
|
+ url = 'https://{}/auth/o2/token'.format(AMAZON_API_DOMAIN)
|
|
data = {
|
|
data = {
|
|
'grant_type': 'refresh_token',
|
|
'grant_type': 'refresh_token',
|
|
'refresh_token': amazon_refresh_token,
|
|
'refresh_token': amazon_refresh_token,
|
|
- 'client_id': 'amzn1.application-oa2-client.98a01914518743e481d51115144dafb0',
|
|
|
|
- 'client_secret': '43353cac67670aefd64a5f95309754ddd6bcfe8a087cc3cad1348b626f64b132'
|
|
|
|
|
|
+ 'client_id': LOOCAM_CLIENT_ID,
|
|
|
|
+ 'client_secret': LOOCAM_CLIENT_SECRET
|
|
}
|
|
}
|
|
r = requests.post(url=url, data=data, timeout=10)
|
|
r = requests.post(url=url, data=data, timeout=10)
|
|
assert r.status_code == 200
|
|
assert r.status_code == 200
|
|
@@ -224,8 +232,8 @@ class AppToAppView(View):
|
|
'Content-Type': 'application/json',
|
|
'Content-Type': 'application/json',
|
|
'Authorization': 'Bearer {}'.format(new_access_token)
|
|
'Authorization': 'Bearer {}'.format(new_access_token)
|
|
}
|
|
}
|
|
- skill_id = 'amzn1.ask.skill.ff5a5074-7ec7-442b-979b-cb57095f7a94'
|
|
|
|
- url = 'https://{}/v1/users/~current/skills/{}/enablement'.format(alexa_api_endpoint, skill_id)
|
|
|
|
|
|
+
|
|
|
|
+ url = 'https://{}/v1/users/~current/skills/{}/enablement'.format(alexa_api_endpoint, LOOCAM_SKILL_ID)
|
|
if request_method == 'get':
|
|
if request_method == 'get':
|
|
r = requests.get(headers=headers, url=url, timeout=30)
|
|
r = requests.get(headers=headers, url=url, timeout=30)
|
|
elif request_method == 'delete':
|
|
elif request_method == 'delete':
|