Перейти к содержанию

Отправка данных🔗

Получив ключ, настройте загрузку данных с сервера или клиента.

Какие данные можно отправить🔗

Логи🔗

Логи — это события, необходимые для аналитики: события внутри игры, логи покупок в магазине и так далее.

Данные отправляются в виде JSON. Одно сообщение может содержать несколько событий. Лог состоит из обязательных полей (eventName и eventTime) и дополнительных. Дополнительные поля - это просто набор параметров в формате ключ : значение. Что хранить в дополнительных полях каждого события, решает аналитик проекта. Всего может быть не более 50 числовых и 50 строковых дополнительных параметров.

Пример событий

[
    {
        "eventName": "offer",
        "eventTime": 1663225354,
        "offerName": "crystals",
        "offerValue": 12345
    },
    {
        "eventName": "offer_accepted",
        "eventTime": 1663225359,
        "offerName": "crystals",
        "offerValue": 12345,
        "hero": "barbarian"
    }
]

Важно

Имена событий (поле eventName) должны содержать только прописные и строчные буквы латинского алфавита, цифры и символы подчеркивания ([a-zA-Z0-9_]). Любые другие символы будут автоматически заменены на символ подчеркивания. Рекомендуем, все же, отправлять имена событий в указанном формате.

Авторизация🔗

Для отправки данных с использованием серверного API, необходимо указывать токен в заголовке запроса

Authorization: Bearer {access token}

Для получения 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()}
});
// Setting default params for all events
[MRGSTracker setDefaultEventParameters:@{
    @"level": @(1),
    @"screen": @"Main view"
}];

// Sending event
[MRGSTracker trackEvent:@"mrgs_testapp_event_add" parameters:@{
    @"level" : @(6),
    @"someFloat" : @(1.23f),
    @"someString" : @"test",
    @"someInt" : @(555),
}];
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-20
  • profileInt1-10
  • profileFloat1-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-20
  • customInt1-10
  • customFloat1-10
  • level
Отправка данных через серверное 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);

Что важно учитывать при отправке данных🔗

  1. Ограничение размера сообщения. Размер запроса не должен превышать 128 KB. Исключение — файлы для справочников.
  2. Соблюдение формата JSON. Требуется строго соблюдать формат данных в SDK и API. Данные, не прошедшие валидацию, не загружаются в DWH
  3. Заливка тестовых данных в отдельный проект. Мы рекомендуем использовать разные приложения в MRGS для тестирования загрузки и отправки реальных данных, чтобы избежать появления некорректных данных в боевом проекте
  4. Валидация времени события. Если время события с клиента более чем на сутки отличается от текущего, оно заменяется на текущее серверное время

Последнее обновление: 2025-01-21
Дата создания: 2021-12-16