Отправка данных🔗
Получив ключ, настройте загрузку данных с сервера или клиента.
Какие данные можно отправить🔗
Логи🔗
Логи — это события, необходимые для аналитики: события внутри игры, логи покупок в магазине и так далее.
Данные отправляются в виде JSON. Одно сообщение может содержать несколько событий. Лог состоит из обязательных полей (eventName и eventTime) и дополнительных. Дополнительные поля - это просто набор параметров в формате ключ : значение. Что хранить в дополнительных полях каждого события, решает аналитик проекта. Всего может быть не более 50 числовых и 50 строковых дополнительных параметров.
Пример событий
Важно
Имена событий (поле eventName) должны содержать только прописные и строчные буквы латинского алфавита, цифры и символы подчеркивания ([a-zA-Z0-9_]). Любые другие символы будут автоматически заменены на символ подчеркивания. Рекомендуем, все же, отправлять имена событий в указанном формате.
Авторизация🔗
Для отправки данных с использованием серверного API, необходимо указывать токен в заголовке запроса
Для получения access и refresh токенов, оправьте POST запрос по адресу https://mrgs.astrum.team/oauth/token/, указав в теле запроса параметры: grant_type=client_credentials, scope=server, client_id={appId} (где {appId} - id вашего приложения в MRGS) и client_secret={server secret} (где {server secret} - серверный ключ вашего приложения в MRGS, полученный на предыдущем шаге)
curl -k -X POST https://mrgs.astrum.team/oauth/token/ \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials&client_id=38&client_secret={server_key}&scope=server"
В случае успеха в ответ вы получите JSON вида:
{
"access_token":"****",
"token_type":"bearer",
"expires_in":3600,
"refresh_token":"****",
"scope":"server",
"access_token_expire":1640035236,
"refresh_token_expire":1640118036
}
Для обновления access token отправьте POST запрос по адресу https://mrgs.astrum.team/oauth/token/, указав в теле запроса параметры: grant_type=refresh_token и refresh_token={refresh_token} (где {refresh_token} - refresh token полученный на предыдущем шаге)
curl -k -X POST https://mrgs.astrum.team/oauth/token/ \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=refresh_token&refresh_token={refresh_token}"
Время жизни refresh token: 24 часа. Время жизни access token: 1 час.
Отправка данных🔗
Отправка данных с использованием серверного API Для отправки логов воспользуйтесь API /event/custom/.
Пример создания и отправки события
curl -X 'POST' \
'https://mrgs-api.my.games/api/38/event/custom/' \
-H 'accept: application/json' \
-H 'Authorization: Bearer ******' \
-H 'Content-Type: application/json' \
-d '[
{
"eventTime": 1642259585,
"eventName": "product_buy",
"deviceId": "E2A44A7B-C339-4A35-839C-DC13FD0D2628",
"userId": "3e9460433475b5b39d40972e496dbde3",
"mygamesUserId": "",
"idfa": "E25B2BC6-1A5F-4FB1-88A7-6B31D01D2BEF",
"idfv": "878F7D70-86D1-4F1E-8B96-AEECCC49EC3F",
"userAgent": "Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405",
"cookies": "enwikiwmE-sessionTickLastTickTime=1622129237785; enwikiwmE-sessionTickTickCount=6; enwikiel-sessionId=04c634a1433975e42a91; enwikimwuser-sessionId=56e6e7b8e21d636590c0; GeoIP=RU:MOW:Moscow:55.75:37.62:v4",
"country": "US",
"language": "en"
}
]'
Отправка данных через SDK
Для создания и отправки события воспользуйтесь классом MRGSTracker. Ниже приведен пример создания и отправки события:
// Setting default params
MRGSTracker.SetDefaultEventParameters(new Dictionary<string, object>()
{
{"character", "tiger"},
{"level", 10}
});
// Sending event
MRGSTracker.TrackEvent("userInfo", new Dictionary<string, object>()
{
{"crystalBalance", 101},
{"goldBalance", 50},
{"user_name", "test_user_name"},
{"registrationDate", DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}
});
import games.my.mrgs.tracker.MRGSTracker;
import java.util.HashMap;
// Setting default params for all events
Map<String, Object> defaultParams = new HashMap<>();
defaultParams.put("level", 10);
MRGSTracker.setDefaultEventParameters(MRGSJson.toHashMap(jsonParams));
// Creating event params
Map<String, Object> userEventParams = new HashMap<>();
userEventParams.put("crystalBalance", 101);
userEventParams.put("goldBalance", 50);
userEventParams.put("user_name", "test_user_name");
userEventParams.put("registrationDate", System.currentTimeMillis());
// Send event
MRGSTracker.trackEvent("userInfo", userEventParams);
Внимание
Исторические данные загружайте только через серверное API. Мы исправляем время с мобильного клиента на текущее, если оно сильно от него отличается.
Универсальные Профили🔗
Универсальные профили — это состояние игровых сущностей. Например, профиль игрока, где содержится набор его достижений, уровня, активности и т.п. Или же это может быть профиль группы, клана, любой другой сущности. Их можно анализировать вместе с логами: балансы остатков валют пользователей, их внутриигровые идентификаторы и так далее.
Совет
Не все параметры стоит слать таким образом:
- Если нужно знать параметр пользователя на момент внутриигрового события, лучше отправить его параметром в логах
- Типовые идентификаторы и параметры пользователя (почта, атрибуция, гео и тд) можно в DWH получать не из игровых данных, а из данных общих систем MyGames (MRGS, 1Link и так далее)
Важно
Профили проекта появляются в DWH раз в сутки
Данные отправляются в виде JSON. Одно сообщение может содержать несколько профилей. Профиль состоит из обязательных полей (названия сущности (entity), id сущности (entityId) и время изменения (updateTime)) и дополнительных. Что хранить в дополнительных полях, решает аналитик проекта.
Доступные дополнительные параметры
profileString1-20profileInt1-10profileFloat1-10
Авторизация🔗
Для отправки запросов вам потребуется указать в заголовке access token. Его получение описано в разделе отправки игровых логов.
Отправка данных🔗
Отправка данных с использованием серверного API
Для отправки профилей воспользуйтесь API /event/custom/profile/.
Пример создания и отправки профилей:
[
{
"entity": "user"
"entiyId": "37793724",
"updateTime": 1345216017,
"profileString_1": "",
"profileString_2": "",
"profileString_3": "",
"profileString_4": "",
"profileString_5": "",
"profileString_6": "",
"profileString_7": "",
"profileString_8": "",
"profileString_9": "",
"profileString_10": "",
"profileString_11": "",
"profileString_12": "",
"profileString_13": "",
"profileString_14": "",
"profileString_15": "",
"profileString_16": "",
"profileString_17": "",
"profileString_18": "",
"profileString_19": "",
"profileString_20": "",
"profileInt_1": 0,
"profileInt_2": 0,
"profileInt_3": 0,
"profileInt_4": 0,
"profileInt_5": 0,
"profileInt_6": 0,
"profileInt_7": 0,
"profileInt_8": 0,
"profileInt_9": 0,
"profileInt_10": 0,
"profileFloat_1": 0,
"profileFloat_2": 0,
"profileFloat_3": 0,
"profileFloat_4": 0,
"profileFloat_5": 0,
"profileFloat_6": 0,
"profileFloat_7": 0,
"profileFloat_8": 0,
"profileFloat_9": 0,
"profileFloat_10": 0
}
]
Отправка данных через SDK
Для создания и отправки события воспользуйтесь классом MRGSTracker. Ниже приведен пример создания и отправки события:
var profile = new MRGSTrackerProfile("user", MRGSUsers.Instance.GetCurrentUserId() ?? "unknown")
{
// You can use additional fields for the event if needed
ProfileString1 = "some str 1",
ProfileString3 = "3_string_mrgs",
ProfileInt2 = 1234,
ProfileFloat2 = 123.456f,
};
// Send event
MRGSTracker.TrackProfile(profile);
// Profile sending variant 1
MRGSTrackerProfile* profile = [[MRGSTrackerProfile alloc] init];
profile.profileInt2 = 222;
profile.profileFloat1 = 222.333f;
profile.profileString2 = @"test_str";
profile.profileString3 = @"mrgs sdk test profile";
[MRGSTracker trackProfile:profile];
// Profile sending variant 2
[MRGSTracker trackProfile:[MRGSTrackerProfile profileWithParametersSettingBlock:^(MRGSTrackerProfile * _Nonnull pr) {
pr.profileInt1 = 123;
pr.profileFloat3 = 123.45f;
pr.profileString1 = @"mrgs";
pr.profileString4 = @"test_profile";
pr.profileString5 = [MRGSJson stringWithObject:@{@"testKey": @"for_json"}];
}]];
import games.my.mrgs.tracker.MRGSTracker;
import games.my.mrgs.tracker.MRGSTrackerProfile;
final MRGSTrackerProfile profile = new MRGSTrackerProfile("user", userId);
// You can use additional fields for the event if needed
profile.setProfileString1("Jon"); // set user's name.
profile.setProfileString3("2021.11.11"); // set user's login time.
profile.setProfileInt1(29); // set user's age and etc
profile.setProfileFloat1(123.4f);
// Send event
MRGSTracker.trackProfile(profile);
В случае, если событие содержит много дополнительных полей, вы можете создать собственные классы-события через наследования, для придания дополнительным полям читаемости и удобного сопоставления:
// Create your own event with mapping
public class CustomUserProfile : MRGSTrackerProfile
{
public string UserName
{
get { return ProfileString1;}
set { ProfileString1 = value; }
}
public int? GoldBalance
{
get { return ProfileInt1;}
set { ProfileInt1 = value; }
}
public int? CrystalBalance
{
get { return ProfileInt2;}
set { ProfileInt2 = value; }
}
public string CurrentServer
{
get { return ProfileString2;}
set { ProfileString2 = value; }
}
public string GameLocale
{
get { return ProfileString3;}
set { ProfileString3 = value; }
}
private DateTime _registrationDate;
public DateTime RegistrationDate
{
get { return _registrationDate;}
set
{
_registrationDate = value;
var unixTime = ((value - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds / 1000L);
ProfileFloat1 = Convert.ToSingle(unixTime);
}
}
}
// Send the event
MRGSTracker.TrackProfile(new CustomUserProfile()
{
CrystalBalance = 101,
GoldBalance = 50,
CurrentServer = "test_server_1",
GameLocale = "en",
UserName = "mrgs_mrgs_mrgs",
RegistrationDate = DateTime.Now
});
////////////////////////////////
// In GameProfile.h
////////////////////////////////
@interface GameProfile : MRGSTrackerProfile
@property (nonatomic) NSString* userName;
@property (nonatomic) int goldBalance;
@property (nonatomic) int crystalBalance;
@property (nonatomic) NSString* currentServer;
@property (nonatomic) NSString* gameLocale;
@property (nonatomic) float registrationDate;
-(instancetype)init;
+ (instancetype)eventWithConfigurationBlock:(void (^)(GameProfile* ev))block;
@end
////////////////////////////////
// In GameProfile.m
////////////////////////////////
@implementation GameProfile
+ (instancetype)eventWithConfigurationBlock:(void (^)(GameProfile* ev))block{
GameProfile* event = [[self alloc] init];
if(block) block(event);
return event;
}
- (void)setUserName:(NSString *)userName {
_userName = userName;
self.profileString1 = userName;
}
- (void)setGoldBalance:(int)goldBalance {
_goldBalance = goldBalance;
self.profileInt1 = goldBalance;
}
- (void)setCrystalBalance:(int)crystalBalance {
_crystalBalance = crystalBalance;
self.profileInt2 = crystalBalance;
}
- (void)setCurrentServer:(NSString *)currentServer {
_currentServer = currentServer;
self.profileString2 = currentServer;
}
- (void)setGameLocale:(NSString *)gameLocale {
_gameLocale = gameLocale;
self.profileString3 = gameLocale;
}
- (void)setRegistrationDate:(float)registrationDate {
_registrationDate = registrationDate;
self.profileFloat1 = registrationDate;
}
@end
////////////////////////////////
// Custom mapped sending variant 1
GameProfile* mapped = [[GameProfile alloc] init];
mapped.crystalBalance = 101;
mapped.goldBalance = 50;
mapped.currentServer = @"test_server_1";
mapped.gameLocale = @"en";
mapped.userName = @"mrgs_mrgs_mrgs";
mapped.registrationDate = [NSDate date].timeIntervalSince1970;
[MRGSTracker trackUserProfile:mapped];
// Custom mapped sending variant 2
[MRGSTracker trackProfile:[GameProfile eventWithConfigurationBlock:^(GameProfile * _Nonnull ev) {
ev.crystalBalance = 456;
ev.goldBalance = 123;
ev.currentServer = @"test_server_2";
ev.gameLocale = @"ru";
ev.userName = @"mrgs_mrgs";
ev.registrationDate = [NSDate date].timeIntervalSince1970;
}]];
import games.my.mrgs.tracker.MRGSTracker;
import games.my.mrgs.tracker.MRGSTrackerProfile;
// Create your own event
class CustomUserProfile extends MRGSTrackerProfile {
public void setUserName(String userName) {
setProfileString1(userName);
}
public void setUserAge(int age) {
setProfileInt1(age);
}
public void setLoginTime(String time) {
setProfileString2(time);
}
}
// Send the event
final CustomUserProfile profile = new CustomUserProfile();
profile.setUserName("Jon");
profile.setUserAge(29);
profile.setLoginTime("11.11.2021");
MRGSTracker.trackProfile(profile);
Отправка данных о доходах от рекламы🔗
Вы можете отправить данные дохода от рекламы специализированным методом
Отправка данных через серверное API
Для отправки данных дохода от рекламы воспользуйтесь API /event/adRevenue/.
Пример:
[
{
"eventTime": 1642259585,
"monetizationNetwork": "ironsource",
"mediationNetwork": "google",
"eventRevenueCurrency": "USD",
"eventRevenue": 0.99,
"adUnit": "43a59750f495dec3",
"adUnitName": "Default",
"adType": "rewarded_video",
"auctionId": "rewarded_video",
"customParams": "{\"country\":\"US\",\"placement\":\"place\",\"ecpm_payload\":\"encrypt\",\"foo\":\"test1\",\"bar\":\"test2\"}",
"deviceId": "3ADF86D6-2F97-437F-B7EC-A423BA289BAF",
"userId": "37793724",
"mygamesUserId": "",
"sessionId": "",
"idfa": "E25B2BC6-1A5F-4FB1-88A7-6B31D01D2BEF",
"idfv": "878F7D70-86D1-4F1E-8B96-AEECCC49EC3F",
"ip": "192.168.1.1",
"userAgent": "Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405",
"cookies": "enwikiwmE-sessionTickLastTickTime=1622129237785; enwikiwmE-sessionTickTickCount=6; enwikiel-sessionId=04c634a1433975e42a91; enwikimwuser-sessionId=56e6e7b8e21d636590c0; GeoIP=RU:MOW:Moscow:55.75:37.62:v4",
"systemVersion": "13.3.1",
"country": "RU",
"language": "en",
"level": 5,
"appVersion": "1.3.4",
"appBuild": "123456",
"mrgsSDKVersion": "1.3.4"
}
]
Отправка данных через SDK
Для создания и отправки события воспользуйтесь классом MRGSTracker. Ниже приведен пример создания и отправки события:
MRGSTracker.TrackAdRevenue("ironsource",
MRGSTrackerMediationNetwork.IronSource,
0.00123f,
"USD");
//Sending ad revenue impression with payload
MRGSTracker.TrackAdRevenue("vungle",
MRGSTrackerMediationNetwork.IronSource,
0.00123f,
"USD",
new Dictionary<string, string>
{
{ MRGSTrackerEventParams.Country, "US" } ,
{ MRGSTrackerEventParams.AdUnit, "12345" } ,
{ MRGSTrackerEventParams.AdUnitName, "Default" } ,
{ MRGSTrackerEventParams.AdType, "video" } ,
{ MRGSTrackerEventParams.Placement, "place" } ,
{ MRGSTrackerEventParams.ECPMPayload, "code" } ,
{ MRGSTrackerEventParams.AuctionId, "abc-def" } ,
{ "test_param_1", "test_value_1" }
});
//Sending ad revenue impression with payload
[MRGSTracker trackAdRevenueWithMonetizationNetwork:@"vungle"
mediationNetwork:MRGSTrackerMediationNetworkIronSource
revenue:@(0.00123)
currency:@"USD"
parameters:@{
MRGSTrackerEventParamCountry: @"US",
MRGSTrackerEventParamAdUnit: @"12345",
MRGSTrackerEventParamAdUnitName: @"Default",
MRGSTrackerEventParamAdType: @"video",
MRGSTrackerEventParamPlacement: @"place",
MRGSTrackerEventParamECPMPayload: @"code",
MRGSTrackerEventParamAuctionId: @"abc-def",
@"test_param_1": @"test_value_1",
}];
import games.my.mrgs.tracker.MRGSTracker;
MRGSTracker.trackAdRevenue("ironsource",
MRGSMediationNetwork.GOOGLE_AD_MOB,
0.99,
Currency.getInstance(Locale.US).currencyCode);
//Sending ad revenue impression with payload
Map<String, String> payload = new HashMap<>();
payload.put("country", "US");
payload.put("ad_unit", "89b8c0159a50ebd1");
payload.put("ad_type", "banner");
payload.put("placement", "place");
payload.put("ecpm_payload", "encrypt");
payload.put("foo", "test1");
payload.put("bar", "test2");
MRGSTracker.trackAdRevenue("ironsource",
MRGSMediationNetwork.GOOGLE_AD_MOB,
0.99,
Currency.getInstance(Locale.US).currencyCode,
payload);
Справочники🔗
Справочники — это таблицы для расшифровки логов: категории товаров в игровом магазине, характеристики миссий, квестов, карт и так далее.
Важно
С помощью этого API можно загрузить любую таблицу для исследований. Например, список пользователей, участвовавших в акции. Для логов этот API не предназначен.
Загрузка справочника состоит из двух частей:
- Загрузка файлов на файловый сервер MRGS
- Отправка метаданных.
Авторизация🔗
Для отправки запросов вам потребуется указать в заголовке access token. Его получение описано в разделе отправки игровых логов.
Загрузка файлов🔗
Поддерживаются файлы в формате CSV со следующими параметрами:
- Обязательно наличие строки заголовка
- Разделитель полей — «;»
- Экранирование — «\»
- Для использования «;» внутри значения, оборачиваем поле в «"»
Пример валидного CSV файла
dtm;id;currency;amount;active;comment
020-01-01 22:00:01;1;EUR;69.3777;true;Initial rate
020-01-01;2;USD;61.9057;false;"Wrapped string with ; character"
020-01-02 05:06:07;3;EUR;69.3777;true;"Escaped \"quotes\""
020-01-02 03:00:00;4;USD;61.9057;-1;
020-01-03;5;EUR;69.3777;false;Wow!
020-01-03;6;USD;61.9057;;
020-01-04;7;EUR;69.3777;true;
020-01-04;8;USD;61.9057;false;
020-01-05;9;EUR;69.3777;false;
020-01-05;10;USD;61.9057;false;
020-01-06;11;EUR;69.3777;false;
020-01-06;12;USD;61.9057;true;
020-01-07;13;EUR;69.3777;false;
020-01-07;14;USD;61.9057;false;
Загрузка файлов справочников
Для загрузки файлов на файловый сервер используется API: event/dictionary/uploadFile.
Пример POST-запроса для отправки файла:
curl -X 'POST' \
'https://mrgs-api.my.games/api/38/event/dictionary/uploadFile/' \
-H 'accept: application/json' \
-H 'Authorization: Bearer bb48fd78e92bbcfd442c4e1fb9f10fb7cd214e4455eb3cc408ddc07859336ffa' \
-H 'Content-Type: multipart/form-data' \
-F 'dictionary=@currencies.csv;type=text/csv'
Пример успешного ответа:
{
"status": 200,
"fromCache": false,
"serverTimeUnix": 1640009580,
"serverTime": "2021-12-20 17:13:00",
"action": "event_dictionary_uploadFile",
"response": {
"url": "https://mrgs.astrum.team/uploads/dictionary/38_1640009580.1926.csv"
}
}
В поле response.url вернётся адрес загруженного файла, он будет использоваться для формирования сообщения отправки метаданных.
Отправка метаданных🔗
Метаданные загружаемого справочника отправляются с помощью API: /event/dictionary/add.
Правила игры:
- Справочник может формироваться из нескольких исходных файлов.
- Поддерживаются следующие типы данных:
int— знаковое целочисленное число в диапазоне от -264 до 264.float— число с плавающей запятой двойной точности.timestamp— дата и время в форматеYYYY-MM-DD HH:mm:ssилиYYYY-MM-DD.bool— булев тип с допустимыми значениями true и false (без учета регистра, прочие воспринимаются какNULL).string— текстовое поле.
- Порядок и имена полей в файлах должны совпадать с информацией в метаданных.
Пример метаданных справочников
{
// Значимая часть имени таблицы
"tableSuffix": "currencies",
// Ссылки на файлы для загрузки
"files": [
"https://mrgs.astrum.team/uploads/dictionary/currencies_part0.csv"
"https://mrgs.astrum.team/uploads/dictionary/currencies_part1.csv"],
// Сопоставление колонок файлов и типов данных в создаваемой таблице
"columns": [
{
"name": "dtm",
"type": "timestamp"
}, {
"name": "id",
"type": "int"
}, {
"name": "currency",
"type": "string"
}, {
"name": "amount",
"type": "float"
}, {
"name": "active",
"type": "bool"
}, {
"name": "comment",
"type": "string"
}],
}
Внимание
Справочники отправляются только по серверному API
Другие специализированные логи🔗
Для решения типовых задач MyGames реализованы выделенные виды загрузки данных Унифицированных логов.
Логи Рекомендательных систем🔗
Рекомендательные системы — это инструмент для показа пользователю наиболее релевантного для него товара. В рамках интеграции в систему нужно настроить загрузку необходимых данных. Детали описаны в отдельном разделе документации.
Логи чатов для закона Яровой🔗
Согласно закону Яровой, который вступил в силу в 2018 году, интернет-компании и операторы связи обязаны хранить все телефонные разговоры, текстовые сообщения, изображения, аудио, видеозаписи и другую информацию от полугода до года в зависимости от типа информации.
Внимание
Можно слать логи чатов только для пользователей из РФ
Данные отправляются в виде JSON. Одно сообщение может содержать несколько событий. Логи чатов состоят из обязательных полей (сообщение и его время) и дополнительных. Что хранить в дополнительных полях, решает аналитик проекта.
Доступные дополнительные параметры
customString1-20customInt1-10customFloat1-10level
Отправка данных через серверное API
Для отправки сообщения, воспользуйтесь API /event/chat/add/.
Пример создания и отправки события:
[
{
"message": "Hello, my friend!",
"recipients": [
{
"deviceId": "3ADF86D6-2F97-437F-B7EC-A423BA289BAF",
"userId": "37793724",
"mygamesUserId": "",
"idfa": "E25B2BC6-1A5F-4FB1-88A7-6B31D01D2BEF",
"idfv": "878F7D70-86D1-4F1E-8B96-AEECCC49EC3F"
}
],
"eventTime": 1345216017,
"deviceId": "3ADF86D6-2F97-437F-B7EC-A423BA289BAF",
"userId": "37793724",
"mygamesUserId": "",
"sessionId": "",
"idfa": "E25B2BC6-1A5F-4FB1-88A7-6B31D01D2BEF",
"idfv": "878F7D70-86D1-4F1E-8B96-AEECCC49EC3F",
"ip": "192.168.1.1",
"userAgent": "Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405",
"cookies": "enwikiwmE-sessionTickLastTickTime=1622129237785; enwikiwmE-sessionTickTickCount=6; enwikiel-sessionId=04c634a1433975e42a91; enwikimwuser-sessionId=56e6e7b8e21d636590c0; GeoIP=RU:MOW:Moscow:55.75:37.62:v4",
"systemVersion": "13.3.1",
"country": "RU",
"language": "en",
"level": 5,
"appVersion": "1.3.4",
"appBuild": "123456",
"mrgsSDKVersion": "1.3.4",
"customString_1": "",
"customString_2": "",
"customString_3": "",
"customString_4": "",
"customString_5": "",
"customString_6": "",
"customString_7": "",
"customString_8": "",
"customString_9": "",
"customString_10": "",
"customString_11": "",
"customString_12": "",
"customString_13": "",
"customString_14": "",
"customString_15": "",
"customString_16": "",
"customString_17": "",
"customString_18": "",
"customString_19": "",
"customString_20": "",
"customInt_1": 0,
"customInt_2": 0,
"customInt_3": 0,
"customInt_4": 0,
"customInt_5": 0,
"customInt_6": 0,
"customInt_7": 0,
"customInt_8": 0,
"customInt_9": 0,
"customInt_10": 0,
"customFloat_1": 0,
"customFloat_2": 0,
"customFloat_3": 0,
"customFloat_4": 0,
"customFloat_5": 0,
"customFloat_6": 0,
"customFloat_7": 0,
"customFloat_8": 0,
"customFloat_9": 0,
"customFloat_10": 0
}
]
Отправка данных через SDK
MRGSTracker.TrackEvent(MRGSTrackerEvents.ChatMessage, new Dictionary<string, object>()
{
{MRGSTrackerEventParams.Message, "test_message"},
{MRGSTrackerEventParams.Recipients, new List<object>()
{
new Dictionary<string, object>()
{
{MRGSTrackerEventParams.UserId, "test_user_1"},
{MRGSTrackerEventParams.DeviceId, "test_device_id_1"},
{MRGSTrackerEventParams.Idfa, "test_idfa_1"},
{MRGSTrackerEventParams.Idfv, "test_idfv_1"},
{MRGSTrackerEventParams.MyGamesUserId, "12345"},
},
new Dictionary<string, object>()
{
{MRGSTrackerEventParams.UserId, "test_user_2"},
{MRGSTrackerEventParams.DeviceId, "test_device_id_2"},
{MRGSTrackerEventParams.Idfv, "test_idfv_2"},
},
}},
});
NSString* message = @"User's message";
[MRGSTracker trackEvent:MRGSTrackerEventChatMessage parameters:@{
MRGSTrackerEventParamMessage : message,
MRGSTrackerEventParamRecipients: @[
@{
MRGSTrackerEventParamUserId: @"test_user_1",
MRGSTrackerEventParamDeviceId: @"test_device_id_1",
MRGSTrackerEventParamIdfa: @"test_idfa_1",
MRGSTrackerEventParamIdfv: @"test_idfv_1",
MRGSTrackerEventParamMyGamesUserId: @"12345",
},
@{
MRGSTrackerEventParamUserId: @"test_user_2",
MRGSTrackerEventParamDeviceId: @"test_device_id_2",
MRGSTrackerEventParamIdfv: @"test_idfv_2",
}
]
}];
import java.util.HashMap;
import java.util.ArrayList;
import games.my.mrgs.tracker.MRGSTracker;
import games.my.mrgs.tracker.MRGSTrackerEventParams;
import games.my.mrgs.tracker.MRGSTrackerEvents;
final String message = "User's message";
Map<String, Object> recipient1 = new HashMap<>();
recipient1.put(MRGSTrackerEventParams.USER_ID, "test_user_1");
recipient1.put(MRGSTrackerEventParams.DEVICE_ID, "test_device_id_1");
recipient1.put(MRGSTrackerEventParams.IDFA,"test_idfa_1");
recipient1.put(MRGSTrackerEventParams.IDFV, "test_idfv_1");
recipient1.put(MRGSTrackerEventParams.MY_GAMES_USER_ID, "test_my_games_user_id_1");
Map<String, Object> recipient2 = new HashMap<>();
recipient2.put(MRGSTrackerEventParams.USER_ID, "test_user_2");
recipient2.put(MRGSTrackerEventParams.DEVICE_ID, "test_device_id_2");
List<Map<String, Object>> recipientsList = new ArrayList<>();
recipientsList.add(recipient1);
recipientsList.add(recipient2);
Map<String, Object> chatParams = new HashMap<>();
chatParams.put(MRGSTrackerEventParams.LEVEL, 6);
chatParams.put(MRGSTrackerEventParams.MESSAGE, message);
chatParams.put(MRGSTrackerEventParams.RECIPIENTS, recipientsList);
chatParams.put("test_additional_param", "test_param");
MRGSTracker.trackEvent(MRGSTrackerEvents.CHAT_MESSAGE, chatParams);
Что важно учитывать при отправке данных🔗
- Ограничение размера сообщения. Размер запроса не должен превышать 128 KB. Исключение — файлы для справочников.
- Соблюдение формата JSON. Требуется строго соблюдать формат данных в SDK и API. Данные, не прошедшие валидацию, не загружаются в DWH
- Заливка тестовых данных в отдельный проект. Мы рекомендуем использовать разные приложения в MRGS для тестирования загрузки и отправки реальных данных, чтобы избежать появления некорректных данных в боевом проекте
- Валидация времени события. Если время события с клиента более чем на сутки отличается от текущего, оно заменяется на текущее серверное время
Дата создания: 2021-12-16