LoginSignup
2
2

More than 5 years have passed since last update.

AdobeAnalyticsのAPIをpythonで使ってみる

Last updated at Posted at 2018-06-11

なぜ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の確認

構成

kousei.png

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数と売上げデータの取得

lambda_function.py

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から簡単に設定できる。デプロイが必要と知らずになかなか反映されないなと困りました。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2