function fetchCampaigns() {
var apiToken = getApiToken(); // Получаем API токен
var advObjectType = 'SKU'; // Тип кампаний, например, трафареты
var desiredStates = 'CAMPAIGN_STATE_RUNNING'; // Берем только активные кампании
var url = 'https://performance.ozon.ru/api/client/campaign?' +
'advObjectType=' + encodeURIComponent(advObjectType);
var options = {
'method': 'get',
'headers': {
'Authorization': 'Bearer ' + apiToken,
'Accept': 'application/json'
}
};
try {
var response = UrlFetchApp.fetch(url, options);
if (response.getResponseCode() === 200) {
var data = JSON.parse(response.getContentText());
var campaignIds = data.list.map(campaign => campaign.id);
Logger.log('Получено ' + campaignIds.length + ' активных кампаний');
return campaignIds;
} else {
Logger.log('Ошибка получения кампаний: ' + response.getResponseCode());
return [];
}
} catch (e) {
Logger.log('Ошибка: ' + e.toString());
return [];
}
}
function getApiToken() {
var clientId = 'ВАШ_CLIENT_ID';
var clientSecret = 'ВАШ_CLIENT_SECRET';
var url = 'https://performance.ozon.ru/api/client/token';
var payload = {
'client_id': clientId,
'client_secret': clientSecret,
'grant_type': 'client_credentials'
};
var options = {
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify(payload)
};
try {
var response = UrlFetchApp.fetch(url, options);
if (response.getResponseCode() === 200) {
var responseData = JSON.parse(response.getContentText());
var accessToken = responseData['access_token'];
Logger.log('Получен новый API токен: ' + accessToken);
return accessToken;
} else {
Logger.log('Ошибка получения API токена: ' + response.getResponseCode());
return null;
}
} catch (e) {
Logger.log('Ошибка: ' + e.toString());
return null;
}
}
function fetchCampaignUUID(campaignId, apiToken) {
var url = 'https://performance.ozon.ru/api/client/statistics/json'; // URL для запроса статистики по рекламной кампании
var payload = JSON.stringify({
"campaigns": [campaignId], // можно передать список до 10 кампаний
"dateFrom": '2024-01-01', // дата начала сбора статистики в формате ГГГГ-ММ-ДД
"dateTo": '2024-01-31', // дата конца сбора статистики в том же формате
"groupBy": "DATE" // группировка данных в отчете по дате
});
var options = {
'method': 'post',
'headers': {
'Authorization': 'Bearer ' + apiToken, // Токен аутентификации
'Content-Type': 'application/json'
},
'payload': payload
};
try {
var response = UrlFetchApp.fetch(url, options);
if (response.getResponseCode() === 200) {
var data = JSON.parse(response.getContentText());
return data['UUID']; // Возвращаем UUID отчета
} else if (response.getResponseCode() === 429) { // Обработка ошибки превышения лимита запросов
Logger.log('Превышен лимит запросов. Максимум 1 запрос. Сервер OZON задумался (HTTP 429).');
return null; // Вернем null, чтобы попробовать снова
} else {
Logger.log('Ошибка получения UUID : ' + campaignId + ' . Код ответа: ' + response.getResponseCode());
return null;
}
} catch (e) {
Logger.log('Ошибка: ' + e.toString());
return null;
}
}
function downloadReport(UUID, apiToken) {
var url = 'https://performance.ozon.ru/api/client/statistics/report?UUID=' + UUID;
// URL для получения отчета по UUID
var headers = {
'Authorization': 'Bearer ' + apiToken, // Токен аутентификации
'Content-Type': 'application/json'
};
var options = {
'method': 'get',
'headers': headers
};
try {
var response = UrlFetchApp.fetch(url, options);
if (response.getResponseCode() === 200) {
Logger.log('Отчет успешно загружен для UUID: ' + UUID);
return response.getContentText(); // Возвращаем данные отчета
} else {
Logger.log('Ошибка загрузки отчета для UUID: ' + UUID);
return null;
}
} catch (e) {
Logger.log('Ошибка: ' + e.toString());
return null;
}
}
function main() {
var apiToken = getApiToken(); // Получаем токен доступа от OZON performance API
if (!apiToken) {
Logger.log('Ошибка: токен не был получен.');
return;
}
var campaignIds = fetchCampaigns(apiToken); // Получаем список активных кампаний из первого пункта
if (campaignIds.length === 0) {
Logger.log('Нет активных кампаний для обработки.');
return;
}
Logger.log('Получено кампаний: ' + campaignIds.length);
// Получение отчетов по каждому campaign_id
var maxRetries = 5; // Максимальное число попыток при ошибке 429
var sleepTime = 1000; // Начальное время ожидания в случае ошибки 429
// Цикл по обходу списка campaign_ids
for (var i = 0; i < campaignIds.length; i++) {
var campaignId = campaignIds[i];
Logger.log('Запрашиваем отчет для кампании ID: ' + campaignId);
for (var retry = 0; retry < maxRetries; retry++) {
var reportUUID = fetchCampaignReportUUID(campaignId, apiToken); // Получаем UUID отчета для текущей кампании
if (reportUUID) {
Logger.log('Получен UUID отчета для кампании: ' + campaignId + ' UUID: ' + reportUUID);
// Скачиваем и обрабатываем отчет по полученному UUID
var reportData = downloadReport(reportUUID, apiToken);
if (reportData) {
processReport(reportData); // Обрабатываем отчет и добавляем данные в Google Sheets
}
break; // Выходим из цикла попыток, так как отчет был успешно получен
} else {
Logger.log('Получена ошибка или пустой UUID, пробуем снова через ' + sleepTime + ' мс.');
Utilities.sleep(sleepTime); // Ждем перед повторной попыткой
sleepTime *= 2; // Увеличиваем время ожидания в два раза для экспоненциального backoff
}
if (retry === maxRetries - 1) {
Logger.log('Достигнуто максимальное количество попыток для кампании: ' + campaignId);
}
}
}
}
function processReport(reportData) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('raw data');
if (!sheet) {
sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet('raw data'); // Создаем лист, если его нет
sheet.appendRow(['Дата', 'Клики', 'Показы', 'CTR', 'Расход']); // Заголовки столбцов
}
var jsonData = JSON.parse(reportData); // Преобразуем данные отчета в JSON
var reportRows = jsonData.report.rows;
// Проходим по строкам отчета и добавляем данные в Google Sheets
reportRows.forEach(function(row) {
sheet.appendRow([
row.date, // Дата
row.clicks, // Количество кликов
row.views, // Количество показов
row.ctr.replace(',', '.'), // CTR с заменой запятой на точку
row.moneySpent.replace(',', '.') // Расход с заменой запятой на точку
]);
});
Logger.log('Отчет успешно обработан и добавлен в Google Sheets.');
}