Автоматизация Яндекс.Директ. Язык R для программирования

Совместно с коллегами из ADF MediaАртемом Дурневым и Султаном Назаралиевым, мы решили выпустить цикл из 6 статей, посвященных автоматизации процессов в Яндекс.Директе. Мы уже ознакомились с теорией автоматизации процессов в первой статье. Во второй обсудили, как отправлять запросы без знаний программирования. Сегодня же мы поговорим про то, как использовать язык R для автоматизации, даже если вы совсем его не знаете.

Язык R

R — язык программирования изначально “заточенный” для работы со статистикой и таблицами. Для PPC специалистов R привлекателен своей философией работы со статистикой и таблицами, в нём даже есть отдельный тип данных — таблица, который понятен всем, кто работает с массивами данных в Excel или Google Таблицах.

Языком R пользуются и интернет-маркетологи, потому что под этот язык создано много дополнений для работы с рекламными системами и системами веб аналитики.

Установка R и среды RStudio

Чтобы извлечь данные из Директа, нам нужно нужно установить R и RStudio и создать скрипт. Шаги установки различны для операционных систем. Оставим инструкции для Windows , MacOS и Linux.

Так как у нас MacOS, разберем установку на его примере:

Автоматизация Яндекс.Директ. Язык R для программирования
  1. Заходим на R-project и устанавливаем последнюю версию.

  2. Устанавливаем RStudio. RStudio — это оболочка, и графический интерфейс, который упростит работу.

  3. Запускаем RStudio.
  4. Не пугаемся и читаем дальше. Самое главное, что первый шаг сделан, дальше будет проще. Мы поможем.

Как собрать данные из Директа в R

После установки, открываем RStudio и обучаем R тому, что мы от него хотим. Как обучают детей? Им читают и объясняют, как поступать правильно. В этом случае все то же самое. Мы должны установить библиотеки. Нам нужно, чтобы R умел следующее:

  • Отправлять GET/POST запросы,
  • Работать с JSON форматом,
  • Создавать Excel файлы.

Чтобы установить библиотеки, необходимо, в первую очередь, проверить, подключены ли они по умолчанию или нет. Этот код проверит есть ли библиотека в системе: если есть — подключит библиотеку, если нет — установит и подключит.

if(!'httr' %in% rownames(installed.packages())){ install.packages('httr') } if(!'jsonlite' %in% rownames(installed.packages())){ install.packages('jsonlite') } if(!'xlsx' %in% rownames(installed.packages())){ install.packages('xlsx') } library(httr) library(jsonlite) library(xlsx)
Автоматизация Яндекс.Директ. Язык R для программирования

Примечание: Для работы library(xlsx) библиотеки на компьютере должна стоять Java. Её очень легко и просто установить с официального сайта. У многих она может быть уже установлена т.к. Java требуется для многих приложений.

Наш код написан таким образом, что если Java стоит на ноутбуке, то данные из Директа выгрузятся в Excel. Если не установлена, то в .csv

Нажимаем enter.

Автоматизация Яндекс.Директ. Язык R для программирования

После этого, RStudio начинает скачивать библиотеки, добавляются новые функции в те, которые идут по умолчанию. После этого приступаем к работе с Яндекс.Директом.

1. Запишем данные авторизации: логин и токенy

andexToken <- 'ВАШ ЯНДЕКС ТОКЕН'​ clientLogin <- 'ЯНДЕКС ЛОГИН ВАШЕГО КЛИЕНТА'
Автоматизация Яндекс.Директ. Язык R для программирования

Про то, как получать токены, мы рассказывали в первой статье.

2. Сформируем заголовки запроса

YDCreateHeaders <- function(Token, ClientLogin = FALSE){ # Создаем объект со стандартными заголовками headers <- c( 'Authorization' = paste('Bearer', Token), 'Accept-Language' = 'ru', 'Content-Type' = 'application/json', 'Host' = 'api.direct.yandex.com', 'processingMode' = 'offline', 'returnMoneyInMicros' = 'false', 'skipReportHeader' = 'true', 'skipReportSummary' = 'true' ) # Добавляем заголовок Client-Login если указан аргумент if(ClientLogin != FALSE){ headers <- c(headers, 'Client-Login' = ClientLogin) } return(headers) }

Эта функция создает заголовки запроса, она является служебной и используется внутри другой функции.

3. Сформировать тело запроса, сделать запрос, проверить готовность отчета и перевести в табличный формат

YDGetReport <- function(ClientLogin, Fields, StartDate, EndDate, Token, Goals = FALSE){ Report <- data.frame() # Создаем таблицу куда запишем результат URL <- 'https://api.direct.yandex.com/json/v5/reports' # URL куда отправляем запрос Яндексу ReportName <- paste(ClientLogin, Sys.time()) # Формируем название отчёта # Создаем тело запроса RequestBody <- list( params = list( SelectionCriteria = list( DateFrom = StartDate, DateTo = EndDate ), FieldNames = Fields, ReportName = ReportName, ReportType = 'CUSTOM_REPORT', DateRangeType = 'CUSTOM_DATE', Format = 'TSV', IncludeVAT = 'YES', IncludeDiscount = 'NO' ) ) # Если в аргументах указаны id целей Яндекс Метрики - добавляем их к запросу if(Goals[[1]] != FALSE){ RequestBody$params$Goals = Goals } # Преобразуем запрос в JSON формат RequestBody <- toJSON(RequestBody, auto_unbox = T, pretty = TRUE) # Отправляем запрос Response <- POST(url = URL, body = RequestBody, add_headers(YDCreateHeaders(Token, ClientLogin))) i <- 0 iter <- 1 # Каждую секунду отправляем тот же самый запрос для проверки готовности отчета while(i == 0){ Response <- POST(url = URL, body = RequestBody, add_headers(YDCreateHeaders(Token, ClientLogin))) # Если код ответа 200 - возвращаем результат и завершаем выполнение if(Response$status_code == 200){ Report <- suppressMessages((as.data.frame(content(Response, type = Response$headers
content-type`)))) cat('Send', iter, 'request. Status', Response$status_code, ' \r') flush.console() i <- 1 } # Если код ответа начинается с 3, 4 или 5 - возвращаем сообщение об ошибке с кодом ответа и завершаем выполнение if(grepl('^[3-5].*', Response$status_code)){ cat('Error. Something went wrong in', iter, 'request. Status', Response$status_code, '\n') i <- 1 break() } cat('Send', iter, 'request. Status', Response$status_code, ' \r') flush.console() iter <- iter + 1 Sys.sleep(1) } return(Report) }

Это код функций, которые выполняют запрос к Яндексу. Теперь необходимо вызвать функцию YDGetReport и записать полученный результат в файл.

Пример выполнения функции:

yandexReport <- YDGetReport( clientLogin, list( 'CampaignName', 'CampaignId', 'Clicks', 'Cost', 'Conversions' ), '2020-01-01', '2020-02-02', yandexToken, list('33954660', '34523868') )

Как выглядит получение отчёта из Яндекс Директа по API:

Мы отправляем запрос к Яндексу. В этом запросе мы “говорим”, что мы хотим от Яндекса.

На этот запрос Яндекс отвечает как настоящий бюрократ — “ок, я понял что вам нужно. Я принял ваш запрос и начал его обрабатывать. Спросите у меня через N секунд готов ли ваш отчёт”.

В нашей функции мы опрашиваем Яндекс каждую секунду — готов ли наш отчёт или нет. Когда Яндекс нам отвечает, что отчет готов, мы получаем отчёт и прекращаем его спрашивать.

Более подробно об этом режиме написанно в блоге Яндекса.

Описание аргументов функции YDGetReport, которые можно менять:

ClientLogin — логин клиента в Яндекс.Директ. Если используется для агентского аккаунта, укажите логин клиента. Если ваш аккаунт представительский, логин представительского аккаунта.

Fields — поля отчета. Формат данных — массив.

StartDate — дата начала отчёта в формате ГГГГ-ММ-ДД.

EndDate — дата окончания отчёта в формате ГГГГ-ММ-ДД.

Token — токен Яндекса.

Goals — id целей Яндекс Метрики, по которым требуется получить статистику. Необязательное поле. Формат данных — массив.

4. Выгружаем данные

out <- tryCatch({ write.xlsx(yandexReport, 'yandexReport.xlsx') }, error=function(cond){ write.csv(yandexReport, 'yandexReport.csv') }, finally = { cat('Report file success write in', getwd(), 'directory') })

Если Java установлена, то данные выгрузятся в Excel. Если нет — то в csv.

А вот этот же скрипт, который можно целиком вставить и получить данные. Для удобства указали его целиком. Главное не забудьте указать аргументы функции YDGetReport, чтобы данные выгрузились корректно.

Вот так легко и просто можно выгрузить данные из Я.Директа, если знать токен. В следующей статье поговорим про то, как массово выгружать данные из множества аккаунтов Я.Директа. Например, если вы работаете маркетологом и ведете несколько десятков проектов.

Благодарим за прочтение!

Наши контакты:

1
2 комментария

Автоматизация Яндекс.Директ. Язык R для программирования

Совместно с коллегами из ADF MediaАртемом Дурневым и Султаном Назаралиевым, мы решили выпустить цикл из 6 статей, посвященных автоматизации процессов в Яндекс.Директе. Мы уже ознакомились с теорией автоматизации процессов в первой статье. Во второй обсудили, как отправлять запросы без знаний программирования. Сегодня же мы поговорим про то, как использовать язык R для автоматизации, даже если вы совсем его не знаете.

Язык R

R — язык программирования изначально “заточенный” для работы со статистикой и таблицами. Для PPC специалистов R привлекателен своей философией работы со статистикой и таблицами, в нём даже есть отдельный тип данных — таблица, который понятен всем, кто работает с массивами данных в Excel или Google Таблицах.

Языком R пользуются и интернет-маркетологи, потому что под этот язык создано много дополнений для работы с рекламными системами и системами веб аналитики.

Установка R и среды RStudio

Чтобы извлечь данные из Директа, нам нужно нужно установить R и RStudio и создать скрипт. Шаги установки различны для операционных систем. Оставим инструкции для Windows , MacOS и Linux.

Так как у нас MacOS, разберем установку на его примере:

Автоматизация Яндекс.Директ. Язык R для программирования
  1. Заходим на R-project и устанавливаем последнюю версию.

  2. Устанавливаем RStudio. RStudio — это оболочка, и графический интерфейс, который упростит работу.

  3. Запускаем RStudio.
  4. Не пугаемся и читаем дальше. Самое главное, что первый шаг сделан, дальше будет проще. Мы поможем.

Как собрать данные из Директа в R

После установки, открываем RStudio и обучаем R тому, что мы от него хотим. Как обучают детей? Им читают и объясняют, как поступать правильно. В этом случае все то же самое. Мы должны установить библиотеки. Нам нужно, чтобы R умел следующее:

  • Отправлять GET/POST запросы,
  • Работать с JSON форматом,
  • Создавать Excel файлы.

Чтобы установить библиотеки, необходимо, в первую очередь, проверить, подключены ли они по умолчанию или нет. Этот код проверит есть ли библиотека в системе: если есть — подключит библиотеку, если нет — установит и подключит.

if(!'httr' %in% rownames(installed.packages())){ install.packages('httr') } if(!'jsonlite' %in% rownames(installed.packages())){ install.packages('jsonlite') } if(!'xlsx' %in% rownames(installed.packages())){ install.packages('xlsx') } library(httr) library(jsonlite) library(xlsx)
Автоматизация Яндекс.Директ. Язык R для программирования

Примечание: Для работы library(xlsx) библиотеки на компьютере должна стоять Java. Её очень легко и просто установить с официального сайта. У многих она может быть уже установлена т.к. Java требуется для многих приложений.

Наш код написан таким образом, что если Java стоит на ноутбуке, то данные из Директа выгрузятся в Excel. Если не установлена, то в .csv

Нажимаем enter.

Автоматизация Яндекс.Директ. Язык R для программирования

После этого, RStudio начинает скачивать библиотеки, добавляются новые функции в те, которые идут по умолчанию. После этого приступаем к работе с Яндекс.Директом.

1. Запишем данные авторизации: логин и токенy

andexToken <- 'ВАШ ЯНДЕКС ТОКЕН'​ clientLogin <- 'ЯНДЕКС ЛОГИН ВАШЕГО КЛИЕНТА'
Автоматизация Яндекс.Директ. Язык R для программирования

Про то, как получать токены, мы рассказывали в первой статье.

2. Сформируем заголовки запроса

YDCreateHeaders <- function(Token, ClientLogin = FALSE){ # Создаем объект со стандартными заголовками headers <- c( 'Authorization' = paste('Bearer', Token), 'Accept-Language' = 'ru', 'Content-Type' = 'application/json', 'Host' = 'api.direct.yandex.com', 'processingMode' = 'offline', 'returnMoneyInMicros' = 'false', 'skipReportHeader' = 'true', 'skipReportSummary' = 'true' ) # Добавляем заголовок Client-Login если указан аргумент if(ClientLogin != FALSE){ headers <- c(headers, 'Client-Login' = ClientLogin) } return(headers) }

Эта функция создает заголовки запроса, она является служебной и используется внутри другой функции.

3. Сформировать тело запроса, сделать запрос, проверить готовность отчета и перевести в табличный формат

YDGetReport <- function(ClientLogin, Fields, StartDate, EndDate, Token, Goals = FALSE){ Report <- data.frame() # Создаем таблицу куда запишем результат URL <- 'https://api.direct.yandex.com/json/v5/reports' # URL куда отправляем запрос Яндексу ReportName <- paste(ClientLogin, Sys.time()) # Формируем название отчёта # Создаем тело запроса RequestBody <- list( params = list( SelectionCriteria = list( DateFrom = StartDate, DateTo = EndDate ), FieldNames = Fields, ReportName = ReportName, ReportType = 'CUSTOM_REPORT', DateRangeType = 'CUSTOM_DATE', Format = 'TSV', IncludeVAT = 'YES', IncludeDiscount = 'NO' ) ) # Если в аргументах указаны id целей Яндекс Метрики - добавляем их к запросу if(Goals[[1]] != FALSE){ RequestBody$params$Goals = Goals } # Преобразуем запрос в JSON формат RequestBody <- toJSON(RequestBody, auto_unbox = T, pretty = TRUE) # Отправляем запрос Response <- POST(url = URL, body = RequestBody, add_headers(YDCreateHeaders(Token, ClientLogin))) i <- 0 iter <- 1 # Каждую секунду отправляем тот же самый запрос для проверки готовности отчета while(i == 0){ Response <- POST(url = URL, body = RequestBody, add_headers(YDCreateHeaders(Token, ClientLogin))) # Если код ответа 200 - возвращаем результат и завершаем выполнение if(Response$status_code == 200){ Report <- suppressMessages((as.data.frame(content(Response, type = Response$headers
content-type`)))) cat('Send', iter, 'request. Status', Response$status_code, ' \r') flush.console() i <- 1 } # Если код ответа начинается с 3, 4 или 5 - возвращаем сообщение об ошибке с кодом ответа и завершаем выполнение if(grepl('^[3-5].*', Response$status_code)){ cat('Error. Something went wrong in', iter, 'request. Status', Response$status_code, '\n') i <- 1 break() } cat('Send', iter, 'request. Status', Response$status_code, ' \r') flush.console() iter <- iter + 1 Sys.sleep(1) } return(Report) }

Это код функций, которые выполняют запрос к Яндексу. Теперь необходимо вызвать функцию YDGetReport и записать полученный результат в файл.

Пример выполнения функции:

yandexReport <- YDGetReport( clientLogin, list( 'CampaignName', 'CampaignId', 'Clicks', 'Cost', 'Conversions' ), '2020-01-01', '2020-02-02', yandexToken, list('33954660', '34523868') )

Как выглядит получение отчёта из Яндекс Директа по API:

Мы отправляем запрос к Яндексу. В этом запросе мы “говорим”, что мы хотим от Яндекса.

На этот запрос Яндекс отвечает как настоящий бюрократ — “ок, я понял что вам нужно. Я принял ваш запрос и начал его обрабатывать. Спросите у меня через N секунд готов ли ваш отчёт”.

В нашей функции мы опрашиваем Яндекс каждую секунду — готов ли наш отчёт или нет. Когда Яндекс нам отвечает, что отчет готов, мы получаем отчёт и прекращаем его спрашивать.

Более подробно об этом режиме написанно в блоге Яндекса.

Описание аргументов функции YDGetReport, которые можно менять:

ClientLogin — логин клиента в Яндекс.Директ. Если используется для агентского аккаунта, укажите логин клиента. Если ваш аккаунт представительский, логин представительского аккаунта.

Fields — поля отчета. Формат данных — массив.

StartDate — дата начала отчёта в формате ГГГГ-ММ-ДД.

EndDate — дата окончания отчёта в формате ГГГГ-ММ-ДД.

Token — токен Яндекса.

Goals — id целей Яндекс Метрики, по которым требуется получить статистику. Необязательное поле. Формат данных — массив.

4. Выгружаем данные

out <- tryCatch({ write.xlsx(yandexReport, 'yandexReport.xlsx') }, error=function(cond){ write.csv(yandexReport, 'yandexReport.csv') }, finally = { cat('Report file success write in', getwd(), 'directory') })

Если Java установлена, то данные выгрузятся в Excel. Если нет — то в csv.

А вот этот же скрипт, который можно целиком вставить и получить данные. Для удобства указали его целиком. Главное не забудьте указать аргументы функции YDGetReport, чтобы данные выгрузились корректно.

Вот так легко и просто можно выгрузить данные из Я.Директа, если знать токен. В следующей статье поговорим про то, как массово выгружать данные из множества аккаунтов Я.Директа. Например, если вы работаете маркетологом и ведете несколько десятков проектов.

Благодарим за прочтение!

Наши контакты:

1
2 комментария
content-type`))))\n cat('Send', iter, 'request. Status', Response$status_code, ' \\r')\n flush.console()\n i <- 1\n }\n # Если код ответа начинается с 3, 4 или 5 - возвращаем сообщение об ошибке с кодом ответа и завершаем выполнение\n if(grepl('^[3-5].*', Response$status_code)){\n cat('Error. Something went wrong in', iter, 'request. Status', Response$status_code, '\\n')\n i <- 1\n break()\n }\n cat('Send', iter, 'request. Status', Response$status_code, ' \\r')\n flush.console()\n iter <- iter + 1\n Sys.sleep(1)\n }\n return(Report)\n}","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Это код функций, которые выполняют запрос к Яндексу. Теперь необходимо вызвать функцию YDGetReport и записать полученный результат в файл.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Пример выполнения функции:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"yandexReport <- YDGetReport(\n clientLogin,\n list(\n 'CampaignName',\n 'CampaignId',\n 'Clicks',\n 'Cost',\n 'Conversions'\n ),\n '2020-01-01', \n '2020-02-02',\n yandexToken,\n list('33954660', '34523868')\n)","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Как выглядит получение отчёта из Яндекс Директа по API:

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Мы отправляем запрос к Яндексу. В этом запросе мы “говорим”, что мы хотим от Яндекса.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

На этот запрос Яндекс отвечает как настоящий бюрократ — “ок, я понял что вам нужно. Я принял ваш запрос и начал его обрабатывать. Спросите у меня через N секунд готов ли ваш отчёт”.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

В нашей функции мы опрашиваем Яндекс каждую секунду — готов ли наш отчёт или нет. Когда Яндекс нам отвечает, что отчет готов, мы получаем отчёт и прекращаем его спрашивать.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Более подробно об этом режиме написанно в блоге Яндекса.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Описание аргументов функции YDGetReport, которые можно менять:

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

ClientLogin — логин клиента в Яндекс.Директ. Если используется для агентского аккаунта, укажите логин клиента. Если ваш аккаунт представительский, логин представительского аккаунта.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Fields — поля отчета. Формат данных — массив.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

StartDate — дата начала отчёта в формате ГГГГ-ММ-ДД.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

EndDate — дата окончания отчёта в формате ГГГГ-ММ-ДД.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Token — токен Яндекса.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Goals — id целей Яндекс Метрики, по которым требуется получить статистику. Необязательное поле. Формат данных — массив.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

4. Выгружаем данные

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"out <- tryCatch({\n write.xlsx(yandexReport, 'yandexReport.xlsx')\n}, error=function(cond){\n write.csv(yandexReport, 'yandexReport.csv')\n}, finally = {\n cat('Report file success write in', getwd(), 'directory')\n})","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Если Java установлена, то данные выгрузятся в Excel. Если нет — то в csv.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

А вот этот же скрипт, который можно целиком вставить и получить данные. Для удобства указали его целиком. Главное не забудьте указать аргументы функции YDGetReport, чтобы данные выгрузились корректно.

"}},{"type":"delimiter","cover":false,"hidden":false,"anchor":"","data":{"type":"default"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Вот так легко и просто можно выгрузить данные из Я.Директа, если знать токен. В следующей статье поговорим про то, как массово выгружать данные из множества аккаунтов Я.Директа. Например, если вы работаете маркетологом и ведете несколько десятков проектов.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Благодарим за прочтение!

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Наши контакты:

"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Сайт","Telegram-канал","Вконтакте"],"type":"UL"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":2,"favorites":18,"reposts":0,"views":21,"hits":1503,"reads":null,"online":0},"dateFavorite":0,"hitsCount":1503,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"isFavorited":false,"isPinned":false,"repostId":null,"repostData":null,"subscribedToTreads":false,"isEditorial":false,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"commentEditor":{"enabled":true,"who":null,"text":"","until":null,"reason":null,"type":"everybody"},"isBlur":false,"isPublished":true,"isDisabledAd":false,"withheld":[],"ogTitle":null,"ogDescription":null,"url":"https://vc.ru/marketing/142907-avtomatizaciya-yandeksdirekt-yazyk-r-dlya-programmirovaniya","author":{"id":482592,"name":"ZorbasMedia","nickname":null,"description":"Информационное медиа о партнерском маркетинге и арбитраже трафика.","uri":"","avatar":{"type":"image","data":{"uuid":"ca1aa446-cfe3-5d43-9dd7-2a8e664b517b","width":1400,"height":1400,"size":451955,"type":"jpg","color":"040a17","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"0e5f13e2-2451-552e-a062-d687265713ff","width":1920,"height":1080,"size":354952,"type":"png","color":"cf2213","hash":"","external_service":[]}},"cover_y":52},"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4946102,"userId":482592,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4946102"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":1322015,"userId":482592,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1322015"},{"title":"5 лет на vc.ru","code":"registration_5_years","description":"Провёл 5 лет вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"a9140d54-73b8-5f40-afa8-449fbaafd42b","formats":{"glb":"https://static.vc.ru/achievements/whale.glb","usdz":"https://static.vc.ru/achievements/whale.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.533203125,"textY":0.658203125,"logoX":0.533203125,"logoY":0.77734375,"logoXNoText":0.4375,"logoYNoText":0.66015625},"id":95307,"userId":482592,"count":0,"shareImage":"https://api.vc.ru/achievements/share/95307"}],"lastModificationDate":1765016012,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":199113,"name":"Маркетинг","description":"Рекламные кейсы из России и других стран, советы по продвижению, маркетинг и digital.","uri":"/marketing","avatar":{"type":"image","data":{"uuid":"d66009fe-9bf0-52da-bdbf-4c758eba39e7","width":2400,"height":2400,"size":841299,"type":"jpg","color":"f97373","hash":"0c1cf06cf0d010","external_service":[]}},"cover":{"type":"image","data":{"uuid":"5488a646-f32d-57a6-a31f-d290afc4388a","width":960,"height":280,"size":177,"type":"png","color":"fc7c7c","hash":"","external_service":[]}},"lastModificationDate":1661337194,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":false,"isDisabledAd":false,"nickname":"marketing","isUnsubscribable":true,"badge":null,"badgeId":null,"isDonationsEnabled":false,"isOnline":false,"isPlus":false,"isUnverifiedBlogForCompanyWithoutPro":false,"isVerified":false,"isRemovedByUserRequest":false,"isFrozen":false,"isPro":false,"type":2,"subtype":"community"},"reactions":{"counters":[{"id":1,"count":1}],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null,"keywords":[],"media":{"type":"image","data":{"uuid":"b1352ab1-72ab-ae40-d00a-ae9fcd6fdc9c","width":1236,"height":884,"size":1325432,"type":"png","color":"d7d9db","hash":"","external_service":[]}},"customCover":null,"robotsTag":"noindex","categories":[],"isAnonymized":true}};