m-response-api/api.py

119 строки
3.5 KiB
Python
Исходник Обычный вид История

2018-10-23 17:24:38 +03:00
import base64
import io
2018-10-23 17:41:11 +03:00
import os
from flask import Flask, make_response, request
from flask.json import jsonify
2018-10-23 17:24:38 +03:00
import boto3
import httplib2
from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
app = Flask(__name__)
2018-10-23 17:41:11 +03:00
app.config['SECRET_KEY'] = os.getenv('SECRET_KEY')
2018-10-23 17:24:38 +03:00
def get_credentials():
"""Fetch playstore credentials from SSM"""
# Fetch credentials from AWS SSM
ssm = boto3.client('ssm')
key_response = ssm.get_parameter(
Name='SumoPlaystoreReviewsKey', WithDecryption=True)
account_response = ssm.get_parameter(
Name='SumoPlaystoreReviewsAccount', WithDecryption=True)
# Parse SSM responses
account = account_response['Parameter']['Value']
key = io.BytesIO(base64.b64decode(key_response['Parameter']['Value']))
credentials = {
'key': key,
'account': account
}
return credentials
def get_reviews_service():
"""Create new instance of google play API service."""
2018-10-23 17:24:38 +03:00
scope = 'https://www.googleapis.com/auth/androidpublisher'
credentials = get_credentials()
service_credentials = ServiceAccountCredentials.from_p12_keyfile_buffer(
credentials['account'], credentials['key'], scopes=scope
)
http = httplib2.Http()
http = service_credentials.authorize(http)
service = build('androidpublisher', 'v2', http=http, cache_discovery=False)
return service.reviews()
@app.route('/reviews', methods=['GET'])
def get_reviews():
"""Get playstore reviews. Proxy playstore API requests."""
2018-10-23 17:24:38 +03:00
packageName = request.args.get('packageName', None)
nextPageToken = request.args.get('token', None)
if not packageName:
content = jsonify(msg='Missing `packageName` from request query')
return make_response(content, 400)
reviews_service = get_reviews_service()
2018-10-25 16:10:55 +03:00
app.logger.info('Playstore API: GET list')
query = reviews_service.list(packageName=packageName, token=nextPageToken)
return make_response(jsonify(query.execute()), 200)
@app.route('/reviews', methods=['POST'])
def post_reviews():
"""Post playstore reviews."""
# Flag to enable/disable playstore upload
UPLOADS_ENABLED = os.getenv('SUMO_PLAYSTORE_UPLOADS_ENABLED', False)
packageName = request.args.get('packageName', None)
reviewId = request.args.get('reviewId', None)
replyText = request.args.get('text', None)
if not packageName:
content = jsonify(msg='Missing `packageName` from request')
return make_response(content, 400)
if not reviewId:
content = jsonify(msg='Missing `review_id` from request')
return make_response(content, 400)
if not replyText:
content = jsonify(msg='Missing `text` from request')
return make_response(content, 400)
payload = {
'packageName': packageName,
'reviewId': reviewId,
'replyText': replyText
}
app.logger.info('Playstore API: POST')
app.logger.info('Playstore API - upload - call params: {}'.format(payload))
if UPLOADS_ENABLED:
reviews_service = get_reviews_service()
body = {
'replyText': replyText
}
query = reviews_service.reply(
packageName=packageName,
reviewId=reviewId,
body=body
)
response = query.execute()
app.logger.info('Playstore API - response: {}'.format(response))
return make_response(jsonify(response), 200)
return make_response(jsonify(msg='POST method not implemented'), 501)