サーバー追跡パラメーターを取得する
管理コンソールに移動 --> 追跡情報 をクリック
プライマリドメイン:サーバー側の追跡データを報告するためのアドレス
セカンダリードメイン:デフォルトドメインはプライマリドメインと同じです。プライベートデプロイメントのお客様は、代替ドメインとしてセカンダリードメインを提供できます。
ServiceSecret と ServiceID は検証パラメーターです。シークレットを公開しないでください。
注:上記の情報はシステム セキュリティに関わるため、管理者権限を持つユーザーのみが表示できます!

リクエスト
API アドレス:https://<データ収集 エンドポイント + ポート>/server
リクエストパラメーター content-type:application/json
リクエストパラメーター
イベント報告リクエスト JSON パラメーター
JSON フィールド名 (大文字と小文字は一致している必要があります。) | データ型 | 必須 | フィールドの説明。 | 例 |
署名 | 文字列 | はい | 署名を検証する | f564cae6a8ad458648id9d607a124322 |
app_id | 文字列 | はい | 対応するサーバー トラッキングにおける serviceID | OA8kI9Jis7YJNh5uh |
アプリケーションキー | 文字列 | はい | アプリケーションキー。 QT 管理バックグラウンドから取得します。 | 9moqdsuia8hvxm7k8shf82n |
ID | 文字列 | はい | イベント エンコーディング。ユーザーが QT バックグラウンドでイベントを作成するときに設定するエンコーディング セットです。 | クリック |
umid | 文字列 | 2 つのうち少なくとも 1 つをアップロードする必要があります。分析中の ID マッピングがビジネス要件を満たすように、できるだけ puid をアップロードすることをお勧めします。 | デバイス ID。 | djajdjdk1 |
puid | 文字列 | ユーザーID。 | user_001 | |
page_name | 文字列 | いいえ | ページ名 | page_index |
ts | 文字列 | はい | ミリ秒単位で報告されるタイムスタンプです。 | 1659493170125 |
カスプ | オブジェクト | いいえ | パラメータ | {"foo": "bar"} |
gp | オブジェクト | いいえ | グローバル プロパティ | {"foo": "bar"} |
SDK タイプ | 文字列 | はい | SDKタイプ。静的フィールドは httpapi です。 | httpapi |
server_ts | 文字列 | いいえ、QT サーバーは自動的に生成できます。手動でファイルをアップロードする場合、QT サーバーにファイルがアップロードされた時間が優先されます。 QT サーバーにファイルがアップロードされた時間は、自動的に生成されなくなります。 | サーバー タイムスタンプ(ミリ秒) | 1659493170125 |
UUID | 文字列 | いいえ。 log_id の生成に使用される要素 (V2.4.17 でサポート) | log_id を一意にする場合は、ログエントリごとに一意の UUID を報告できます。 QT サーバーは、UUID を使用して log_id を生成します。 | 1234567890 |
ログID | 文字列 | いいえ、QT サーバーは自動的に生成します | ログ ID。デフォルトの生成モードは UUID 生成です。 UUID が報告されない場合は、タイムスタンプを使用してランダム ID が生成されます。 | 1234567890 |
イベント プロトコル
{
"sign":"27 c95768438645138cfb010ded871091", // 必須。署名。
"app_id":"xxxxxxxxx", // サーバー追跡情報内の サービス ID。
"appkey":"1344444", // 必須。アプリケーションの appkey。
"id" : "get_coupons", // 必須。イベント コード。
"umid" : "edfafs", // デバイスの ID。
"puid" : "123456", // ログイン ユーザーの ID。
// umid と puid の少なくとも 1 つをアップロードする必要があります。
"page_name":"home_page", // オプション。ページ エンコーディング。
"ts" : "1614667799165", // 必須。イベントが発生した時の タイムスタンプ。
"cusp" : { // カスタム イベント パラメーター
"p1" : "1",
"p2" : "2",
"p3" : "3"
},
"sdk_type":"httpapi", // 静的フィールド。追跡 サービスは、このフィールドを自動的に追加します。
"server_ts":"1614667799165", // このパラメーターを指定すると、パラメーターの値が使用されます。このパラメーターを指定しない場合、ログ追跡 サービスの タイムスタンプが自動的に使用されます。ログ追跡 サービスは、このパラメーターを自動的に追加します。
"_id":'123344' // ログの一意のコード。追跡 サービスは、このフィールドを自動的に追加します。
}レポートユーザープロパティリクエスト JSON パラメーター
JSON フィールド名 (大文字と小文字は一致している必要があります。) | データ型 | 必須 | フィールドの説明。 | 例 |
sign | string | はい | 署名を検証します | f564cae6a8ad458648id9d607a124322 |
app_id | string | はい | serviceID (対応するサーバー追跡内) | OA8kI9Jis7YJNh5uh |
appkey | string | はい | アプリケーションキー。 QT 管理バックグラウンドから取得します。 | 9moqdsuia8hvxm7k8shf82n |
id | string | はい | ユーザー属性を報告するためのイベントコード。値は $$_ user_profile に固定されています。 | $$_user_profile |
umid | string | いいえ | デバイス ID。 | djajdjdk1 |
puid | string | はい | ユーザー ID。 | user_001 |
ts | string | はい | ミリ秒単位で報告されるタイムスタンプ。 | 1659493170125 |
cusp | object | はい | ユーザー属性。 | {"name": "tom", "gender": "1"} |
sdk_type | string | はい | SDK タイプ。静的フィールドは httpapi です。 | httpapi |
server_ts | string | いいえ、QT サーバーは自動的に生成できます。手動でファイルをアップロードする場合、QT サーバーにファイルをアップロードした時間が優先されます。 QT サーバーへのファイルのアップロード時間は、自動的に生成されなくなります。 | サーバーのタイムスタンプ (ミリ秒単位) | 1659493170125 |
uuid | string | いいえ。 log_id の生成に使用される要素 (V2.4.17 でサポート) | log_id を一意にする場合は、ログエントリごとに一意の UUID を報告できます。 QT サーバーは、UUID を使用して log_id を生成します。 | 1234567890 |
log_id | string | いいえ、QT サーバーが自動的に生成します | ログ識別子。デフォルトの生成モードは uuid 生成です。 uuid が報告されない場合は、タイムスタンプを使用してランダム ID が生成されます。 | 1234567890 |
ユーザー属性 メッセージプロトコル
{
"sign":"27 c95768438645138cfb010ded871091", // 必須。署名。
"app_id":"xxxxxxxxx", // 必須。このパラメーターは、サーバータグ情報内のサービス ID に対応します。
"appkey":"1344444", // 必須。アプリケーションのアプリケーションキー。
"id" : "$$_user_profile", // 必須。ID はユーザー属性です。
"umid" : "edfafs", // オプション。デバイスの ID。
"puid" : "123456", // 必須。ログインユーザーのアカウント ID。
"ts" : "1614667799165", // 必須。イベントが発生したタイムスタンプ。
"cusp" : { // 必須。カスタムユーザー属性
"gender" : "1", // 性別。
"birthday" : "1988-12-24" // 生年月日
},
"sdk_type" : "httpapi", // 静的フィールド。トラッキングサービスによってこのフィールドが自動的に追加されます。
"server_ts":"1614667799165", // このパラメーターを指定した場合、パラメーターの値が使用されます。このパラメーターを指定しない場合、ログトラッキングサービスのタイムスタンプが自動的に使用されます。ログトラッキングサービスによってこのパラメーターが自動的に追加されます。
"_id":'123344' // ログの一意のコード。トラッキングサービスによってこのフィールドが自動的に追加されます。
}署名生成ルールの説明
まず、sign フィールドを除くすべてのリクエストフィールドのキーと値をマップオブジェクトにカプセル化します。
このマップオブジェクトを JSON 文字列にシリアル化するには、キーを自然順序付け、つまり ASCII コードに従ってソートする必要があります。Java では、jsonobject.tojsonstring(mapobject、SerializerFeature.mapsortfield)を使用できます。(注:JSON は、次のコードブロックのように、フィールド間のスペースを削除するために圧縮する必要があります)
serviceSecret を取得します。
sign = MD5(ソート後に生成された JSON 文字列 + serviceSecret)
計算された sign を元のマップオブジェクトに入れ、JSON 文字列にシリアル化します。これが最終的な完全な JSON リクエストメッセージです。
ユーザー プロパティ リクエスト JSON パラメーターを報告する

レスポンスパラメーター
詳細については、「WordPress REST API」をご参照ください。
応答 JSON 文字列には、code フィールドと message フィールドの 2 つのフィールドが含まれています。
コード | メッセージ | 説明 |
Httpapi_300_200 | レポート成功 | 成功 |
Httpapi_300_101 | 不正な署名 | 署名検証に失敗しました。詳細については、「署名生成ルール」をご参照ください。 |
Httpapi_300_102 | レポートされたデータ型は JSON 形式ではありません。 | データ形式リクエストパラメータは JSON 形式ではありません |
Httpapi_300_103 | 必須フィールドがありません | リクエストパラメータテーブルを参照して、必須パラメータが省略されているかどうかを確認してください |
Httpapi_300_104 | ユーザー属性に必須フィールドがありません | リクエストパラメータテーブルを参照して、必須パラメータが省略されているかどうかを確認してください |
Httpapi_300_105 | 無効なイベント ID | 不正なイベント ID |
Httpapi_300_106 | 不正な ak/sk |
Java デモ リファレンス
package com.aliyun.app.quickaplus.mock.once_mock;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.aliyun.app.quickaplus.mock.util.MD5Util;
import okhttp3.*;
import java.io.IOException;
/**
* サーバー ApiDemo
*
* @author chengtao
*/
public class ServiceApiDemo {
/**
* プライマリドメイン
*/
private static final String API_URL = "*****";
/**
* サーバートラッキング情報内の ServiceID に対応します。
*/
private static final String SERVICE_ID = "*******";
/**
* サーバートラッキング情報内の ServiceSecret に対応します。
*/
private static final String SERVICE_SECRET = "*******";
/**
* クライアントログ
*/
private static final OkHttpClient client = new OkHttpClient();
/**
* メイン関数
*
* @param args パラメーター
*/
public static void main(String[] args) {
String srcJsonString = getMockData();
JSONObject json = JSON.parseObject(srcJsonString);
// サービス ID をメッセージに追加します。
json.put("app_id",SERVICE_ID);
// ts をメッセージに追加します。
json.put("ts", String.valueOf(System.currentTimeMillis()));
//署名を計算する
String sign = MD5Util.md5(JSONObject.toJSONString(json,
SerializerFeature.MapSortField) + SERVICE_SECRET);
json.put("sign", sign);
String desJsonString = JSON.toJSONString(json,
SerializerFeature.DisableCircularReferenceDetect);
Request request = new Request.Builder()
.url(API_URL + "/server")
.post(RequestBody.create(desJsonString,
MediaType.parse("application/json")))
.build();
try {
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
System.out.printf("[DEMO] ログの送信に失敗しました %s%n", response);
} else {
System.out.printf("[DEMO] 送信に成功しました %s%n",
response.body().string());
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* MockData を取得します。
*
* @return 戻り値。
*/
private static String getMockData() {
return "{\n" +
" \"appkey\": \"1344444\",\n" +
" \"id\": \"get_coupons\",\n" +
" \"umid\": \"uuid()\",\n" +
" \"puid\": \"puid1\",\n" +
" \"page_name\": \"home_page\",\n" +
" \"cusp\": {\n" +
" \"p1\": \"1\",\n" +
" \"p2\": \"2\",\n" +
" \"p3\": \"3\"\n" +
" },\n" +
" \"gp\": {\n" +
" \"p1\": \"1\",\n" +
" \"p2\": \"2\",\n" +
" \"p3\": \"3\"\n" +
" },\n" +
" \"sdk_type\": \"httpapi\"\n" +
"}";
}
}Python デモ リファレンス
# 正しい署名形式。
{"appkey": "4b6G49PAkLUb4212","cusp":{"p1":"1","p2":"2","p3":"3"},"gp":{"p1":"1","p2":"2","p3":"3"},"id":"get_coupons","page_name":"home_page","puid":"puid1","sdk_type":"httpapi","umid":"uuid()"}tEkNnx8VDuR0mwEl3hXd7aozYh8Q2qS4
# 無効な署名形式。
{"appkey": "AppKey in your environment", "cusp": {"p1": "1", "p2": "2", "p3": "3"}, "gp": {"p1": "1", "p2": "2", "p3": "3"}, "id": "get_coupons", "page_name": "home_page", "puid": "puid1", "sdk_type": "httpapi", "umid": "uuid()"}tEkNnx8VDuR0mwEl3hXd7aozYh8Q2qS4 import json
import hashlib
import http.client
import ssl
import time
# service_id
service_id =service_id in your environment
# service_secret
service_secret =service_secret in your environment
# トラッキング サービスを構成します。
qlc_end_point =address of the receiving service in your environment
# Mock のメッセージ
def get_millisecond():
# 13 桁のタイムスタンプをミリ秒単位で取得します。
millis = int(round(time.time() * 1000))
return str(millis)
ts1 = get_millisecond()
print(ts1)
data = {
# 公開時にはコードを削除する必要があります。コードは、「トラッキング検証 - サーバー検証」に入力された DebugKey と同じである必要があります。
"dk":"",
# アプリケーションキー
"appkey":"",
"app_id": service_id,
"id": "get_coupons",
"umid": "uuid1",
"puid": "puid2",
"page_name": "home_page",
"ts": ts1,
"cusp": {
"card_type": "self-managed",
"scene": "Active purchase",
"card_level": "Experience member",
"carrier": "Enough apps",
"card_no": "d7tyk",
"user_id": "zsfMzsvHyA==",
"card_name": "7-day experience card",
"resource_id": "eedf17067cf64be299a844bbc8101426"
},
"gp": {
"p1": "1",
"p2": "2",
"p3": "3"
},
"sdk_type": "httpapi"
}
def sort_dict(d):
# ソート済み辞書のプライマリ キー。
sorted_dict = {k: sort_dict(v) if isinstance(v, dict) else v for k, v in sorted(d.items())}
return sorted_dict
# キーを辞書式順序でソートします。
sorted_data = sort_dict(data)
sorted_dict = dict(sorted_data)
#string = json.dumps(sorted_dict, separators=(',', ':')) + service_secret
string = json.dumps(sorted_dict,ensure_ascii=False, separators=(',', ':')) + service_secret
print(string)
data['sign'] = hashlib.md5(string.encode('utf-8')).hexdigest()
data = json.dumps(data)
protocl,domain = qlc_end_point.split('://')
if (protocl == 'http'):
conn = http.client.HTTPConnection(domain)
if (protocl == 'https'):
conn = http.client.HTTPSConnection(domain)
conn.request("POST", "/server", body=data, headers={"Content-Type": "application/json"})
response = conn.getresponse()
print(response.read().decode())
conn.close()JavaScript で REST API を使用する
package com.aliyun.app.quickaplus.mock.util;
import java.security.MessageDigest;
/**
* md5 暗号化ツール クラス
*
* @author 作成者:zheng.zhang
*/
public class MD5Util {
public static String md5(String s) {
char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
try {
byte[] btInput = s.getBytes();
// MD5 ダイジェスト アルゴリズムの MessageDigest オブジェクトを取得します。
MessageDigest mdInst = MessageDigest.getInstance("MD5");
// 指定されたバイトでダイジェストを更新します。
mdInst.update(btInput);
// 暗号文を取得します。
byte[] md = mdInst.digest();
// 暗号文を 16 進数文字列に変換します。
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
} catch (Exception e) {
return null;
}
}
/**
* 単体テスト
*/
public static void main(String[] args) {
StringBuilder dtskey = new StringBuilder("abc12390");
dtskey.append('\0').append("~!@#$%^&*()_+");
System.out.println(MD5Util.md5(dtskey.toString()));
System.out.println(MD5Util.md5("20121221"));
System.out.println(MD5Util.md5("Encryption"));
}
}