#なぜpython?なぜlambda?
特に理由はなく、サーバーレスを試してみたかったので、pythonで作ってみました。
OAuthで問題なくtoken取得できていますが、そのtokenを使用するとtokenエラーが出てしまうため、今回はwsseでの使用方法を紹介します。
phpでのAPIは下記が参考になります。
Adobe AnalyticsのReporting APIを使うシンプルなPHPコード ← OAuth
AdobeAnalytics ReportAPIの使い方メモ ← wsse
前準備 (管理者にお願いする)
(1)ユーザーID、暗号鍵の作成。
(2)ユーザーにWeb Service Accessへのアクセス権の付与。
(3)レポートスイートIDの確認
構成
ajaxでAPI GatewayのURLにアクセスし、chart.jsを使用してデータをグラフ化しています。
APIの値が返ってくるのに3秒以上かかっているので、1日に1回API実行、それ以外はDynamoDBから取得することを考えています。
このあと記載するプログラムではやってませんが・・・・
使用するAPI
・Report.Queue → jsonに作ってほしいレポート内容を記載してリクエストすると、reportIDが返ってくる
・Report.Get → Queueで取得したreportIDを使用してreport内容を取得(まだできてないとエラーが返ってくることも・・・)
APIのrequestの項目とresponseの値を確認するにはこれが便利
上記でもわからない項目があれば、こちらのページ上部にあるPDFから確認
WEBサイトがカオスなので、非常にわかりにくいです・・・・・
ReportをQueueしてGetするpythonコード
日別のサイトセクション毎のPV数と売上げデータの取得
import os
import json
import time
import uuid
import requests
import hashlib
import base64
aa_endpoint = os.environ['aa_endpoint']
aa_username = os.environ['aa_username']
aa_password = os.environ['aa_password']
def lambda_handler(event, context):
data = {"reportDescription":{"reportSuiteID":aa_rsid,"dateGranularity":"day","metrics":[{"id":"pageviews"},{"id":"revenue"}],"elements":[{"id":"sitesection"]}]}}
return get_report_data(data)
def generate_xwsse_header():
timestamp = datetime.datetime.utcnow().isoformat()[:-4] + 'Z'
nonce = str(uuid.uuid4())
password_digest = hashlib.sha1((nonce + timestamp + aa_password).encode('utf8')).digest()
password_digest_base64 = str(base64.encodebytes(password_digest), 'utf8').rstrip()
nonce_base64 = str(base64.encodebytes(nonce.encode('utf8')), 'utf8').rstrip()
return {'X-WSSE': 'UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"' %
(aa_username, password_digest_base64, nonce_base64, timestamp)}
def get_report_data(data):
url = aa_endpoint + '?method=Report.Queue'
body = requests.post(url,data=json.dumps(data),headers=generate_xwsse_header()).json()
reportID = body['reportID']
return get_summarydata(reportID,0)
def get_summarydata(reportID,cnt=0):
url = aa_endpoint + '?method=Report.Get'
body = requests.post(url,data=json.dumps({"reportID": reportID}),headers=generate_xwsse_header()).json()
if 'error' in body:
if cnt==3:
return {"error":"get_summarydata()"}
else:
time.sleep(2)
cnt+=1
return get_summarydata(reportID,cnt)
else:
return body
Report.Queue後、Getした際にnot readyのエラーが返ってきた場合は、2秒間隔で最大4回実行するようにしています。
困った点
・ajaxでアクセス → クロスドメインになるのでAccess-Control-Allow-OriginをHTTPヘッダに追加しないといけない。
API Gatewayから簡単に設定できる。デプロイが必要と知らずになかなか反映されないなと困りました。