Adobe Analytics

AdobeAnalytics: Adobe I/OのAPIを使ってSAINT分類データを取得する

こんにちは、エクスチュアの權泳東(権泳東/コン・ヨンドン)です。

今回はSAINT分類データをAdobe I/OのAPIを使って取得する方法についてです。

AAのUIからもSAINT分類データをTSV形式でダウンロードする事が可能です。
しかし、ファイルサイズが1MBを超えてしまう場合、FTPというレガシーなプロトコルを使ってAdobe指定のFTPサーバーからファイルをダウンロードするという残念なエクスペリエンスを強いられます。

というわけで、もっとモダンなエクスペリンスを求めるためにAdobe I/OのAPIを使ってSAINT分類データを取得する処理を実装しました。

 

Adobe I/Oプロジェクトを作成する

Adobe I/Oコンソールを開いて、「Create new project」からプロジェクトを作成します。

https://console.adobe.io/home

作成したら、「Add API」で「Adobe Analytics」を選んで追加します。
必要な権限を追加してから、キーペアをzipファイルでダウンロードします。

認証の作成では「JWT」を選択してください。

 

JWT認証を実装する

ここからが本題。

JWT認証をしてAPI実行に必要なトークンを生成する処理をNode.jsで実装します。
まずは簡単なプログラムを書きました。
これ↓です。

/* token.js */
const jwt = require('jsonwebtoken');
const fs = require('fs');
const request = require('request');

const expire = Math.round((Date.now() + 86400000) / 1000);

const payload = {
    "exp":expire,
    "iss":process.env.ADB_ORG_ID,
    "sub":process.env.ADB_TECH_ACC_ID,
    "https://ims-na1.adobelogin.com/s/ent_analytics_bulk_ingest_sdk":true,
    "aud":"https://ims-na1.adobelogin.com/c/"+process.env.ADB_CLIENT_ID
};

const client_id = process.env.ADB_CLIENT_ID;
const client_secret = process.env.ADB_CLIENT_SECRET;

const secret = fs.readFileSync('private.key');

const options = {
    algorithm: 'RS256'
};

const token = jwt.sign(payload, secret, options);

const  headers = {
    'Content-Type' : 'application/x-www-form-urlencoded'
};

let params = {
    url : 'https://ims-na1.adobelogin.com/ims/exchange/jwt',
    method : 'POST',
    headers : headers,
    form : {
        'client_id' : client_id,
        'client_secret' : client_secret,
        'jwt_token' : token
    },
    json : true
};
 
request(params, function (error, response, body) {
    let res = body.access_token;
    console.log(res);
});

JWTペイロードを生成して認証サーバーにPOST送信して24時間有効なトークンを取得する、という処理を実装しました。
このNode.jsプログラムの実行方法は後述します。

 

ClassificationsAPIを実装する

続いて、ClassificationsAPIを実装します。
これまたNode.jsでプログラムを作成しました。
これ↓です。

/* exec_saint_api.js */
const method = process.argv[2];
const token = process.env.TOKEN;

const Client = require('node-rest-client').Client;
const client = new Client();
const endpoint = 'https://api.omniture.com/admin/1.4/rest/';

const fs = require('fs');

let args = { 
    headers: {
        'Authorization' : 'Bearer ' + token,
        'Content-Type' : 'application/json'
    },
    parameters: {
        'method' : 'Classifications.' + method
    }
};

if (method == 'CreateExport') {
    args.data = {
        'rsid_list' : [process.env.RSID],
        'encoding' : 'UTF-8',
        'all_rows' : true,
        'element': process.env.VAR,
        'email_address' : process.env.EMAIL,
        'date_filter_start_date' : process.env.DATE_START,
        'date_filter_end_date' : process.env.DATE_END
    };
    client.post(endpoint, args, (data, response) => {
        console.log(data.job_id);
    });
} else if (method == 'GetStatus') {
    args.data = {
        'job_id' : process.env.JOB_ID
    };
    client.post(endpoint, args, (data, response) => {
        let timer = setInterval(() => {
            let job = data.find((x) => x.type == 'job_id');
            if (job.status == 'Completed') {
                let file = data.find((y) => y.type == 'file_id');
                let file_id = file.id;
                let page_num = file.viewable_pages;
                console.log(file_id + ',' + page_num);
                clearInterval(timer);
            }
        }, 60000);
    });
} else if (method == 'GetExport') {
    let file_id = process.env.FILE.split(',')[0];
    let page_num = parseInt(process.env.FILE.split(',')[1]);
    let saint_json = process.env.SAINT_JSON;
    for (let i=0; i<page_num; i++) {
        args.data = {
            'file_id' : file_id,
            'page' : i+1
        };
        client.post(endpoint, args, (data, response) => {
            fs.appendFileSync(saint_json, JSON.stringify(data));
        });
    }
}

SAINT分類データのエクスポートジョブを生成してからデータを取得するために、CreateExport, GetStatus, GetExportというメソッドを実行するための処理を実装しています。
このNode.jsプログラムの実行方法は以下で説明します。

 

プログラム実行のためのbashスクリプト

さて、ここまでに作成したtoken.jsとget_saint_api.jsを実行するためのbashスクリプトを書きます。

#!/bin/bash

set -eu
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

##設定ここから##
# API認証情報
export ADB_ORG_ID="123456789@AdobeOrg" #OrgID
export ADB_TECH_ACC_ID="abcdefg@techacct.adobe.com" #Tech Account ID
export ADB_CLIENT_ID="0987654321" #client ID
export ADB_CLIENT_SECRET="1234-5678-abcd-efgh" #client secret

# エクスポート設定
export RSID="exturexturecom"
export VAR="trackingcode"
export EMAIL="exture@example.com"
export DATE_START="2010-01-01"
export DATE_END="2020-12-31"

# ファイル名定義
export SAINT_JSON="saint.json"
export SAINT_TXT="saint.txt"
export LOAD_TXT="load.txt"
##設定ここまで##

# 空ファイル作成
: > ${SAINT_JSON}
: > ${SAINT_TXT}
: > ${LOAD_TXT}

export TOKEN=$(node token.js)

# job作成
export JOB_ID=$(node exec_saint_api.js "CreateExport")
echo "JOB_ID: ${JOB_ID}"

# status確認
sleep 60
export FILE=$(node exec_saint_api.js "GetStatus")
echo "FILE_ID: ${FILE%,*}"
echo "PAGE_NUM: ${FILE#*,}"

# download
node exec_saint_api.js "GetExport"

#jqでJSONをCSV変換
cat ${SAINT_JSON} |jq -r '.[]|.data[]|.row|@csv' > ${SAINT_TXT}

何をやってるかと言うと、まずAdobeI/Oのコンソールで作成したAPI実行に必要なJWT認証情報を環境変数として定義してます。
これらは全てAdobeI/Oコンソールから作成・取得出来ます。

続いて、SAINT分類データの取得に必要なAdobeAnalyticsのレポートスイートIDや変数名、通知先メアドなどを環境変数に持たせます。

出力するファイル名も環境変数で定義してあります。

そしてこのbashスクリプトを実行すると、まずはtoken.jsを使ってJWT認証を行ってトークンを取得します。

このトークンを使って、SAINT分類データのエクスポートジョブの作成から分類データの取得までをget_saint_api.jsが実行してます。

 

JSONファイルをCSV変換する

APIで取得した分類データはJSON形式になってます。
そのままではExcelやエディタで編集出来ないので、jqコマンドを使ってCSVに変換してます。

jqコマンドは以前↓の記事でも使いましたが、JSONを操作するためのLinuxコマンドです。

Linux Tips: コマンドラインでJSONをCSVに変換する

とても便利なので使い方を覚えると役に立ちます。

CSVに変換したSAINT分類データはExcelで編集したり、またはAdobeAnalyticsのDatafeedと一緒にBigQueryにロードしてBIツールで分析に使うのも良いでしょう。
もちろんBigQuery以外のデータウェアハウスに入れてもよいですし。

 

TL;DR

AdobeAnalyticsのSAINT分類データを取得するために、AdobeI/OのAPIを実装する方法について紹介しました。
AdobeI/OのAPIではJWT認証を使います。
また、APIで取得したJSONデータはCSVに変換すると扱いやすくなります。

あと、どうでも良いんですけど今はもう「SAINT」って言わずにただの「分類」って言うみたいですね。
どうでも良いです。

 
弊社では、Adobe Analytics認定エキスパート資格・Google Cloud認定プロフェショナルデータエンジニア資格・Linux Professional Institute認定資格を持ったエンジニア達が各種マーテックツールの導入実装コンサルティングサービスや、GCP/AWS/Azureなどのパブリッククラウドを使ったデータ分析基盤構築コンサルティングサービスを提供しております。

お問い合わせはこちらからどうぞ。

 

関連記事

  1. Adobe Analytics

    Adobe Analytics: VisitorAPIでSafariでもクロスドメイン計測をする

    この情報は2016年9月時点のものです。こんにちは、エクスチュ…

  2. Adobe Analytics

    Adobe Summit 2020レポート: Implementation Tips for Ado…

    こんにちは、エクスチュアの権泳東(コン・ヨンドン)です。Twitt…

  3. Adobe Analytics

    【実験してみた】CNAMEを使わずにAdobeAnalyticsを1stパーティクッキーで計測する

    こんにちは、エクスチュアの権泳東(權泳東/コン・ヨンドン)です。…

  4. Adobe Analytics

    Adobe Summit 2020レポート: Customer Journey Analytics:…

    こんにちは。エクスチュアインターン生の畝川(せがわ)です。今回…

  5. Adobe Analytics

    Adobe Analytics: AppMeasurement.jsの実装開発作業に使うツール Ja…

    こんにちは、エクスチュアの權泳東(権泳東/コン・ヨンドン)です。…

  6. Adobe Analytics

    Adobe Analytics: SegmentsAPIを使って大量のセグメント設定を作成・更新する…

    こんにちは、エクスチュアの權泳東(権泳東/コン・ヨンドン)です。…

最近の記事

  1. databricksのnotebookを使ってみよう その1…
  2. databricks:GCPで利用を開始する
  3. KARTE「オフラインデータをオンライン接客に活用する」
  4. ELB (ALB・NLB・CLB) をサクッと学ぶ
  5. Direct Connect vs Site to Site…
  1. Ad Hoc Analysis

    Adobe Analytics: Ad Hoc Analysisでセグメントの条…
  2. Adobe Analytics

    Adobe Mobile SDK 4.xからAEP SDKに移行する
  3. Google BigQuery

    GCP: 今月のGCP課金額をslackに自動的に書き込む
  4. Databricks

    Databricks: Spark RDDで使う主なメソッド
  5. Linux

    Linux Tips: コマンドラインでJSONをCSVに変換する
PAGE TOP