Changes.check в Яндекс.Директ API
Вчера ходил на очередную встречу разработчиков по API Директа. Андрей Кашин, он в Яндексе отвечает за API Директа, рассказывал про закрытие API версий 4 и 4 Live и про развитие 5-й версии.
Во время встречи из зала было задано множество вопросов по поводу метода Changes.check. Для меня это было странно, т.к. не для всех был понятен алгоритм работы с этим методом. В связи с этим решил написать небольшую документацию, ну и заодно рассказать про некоторые подводные камни, которые могут встретиться при работе с сервисом Changes.
Самое больное в переходе с 4-й ветки на 5-ю для меня заключалось в ужесточении ограничений и перевода всех методов на бальную систему. Если раньше при запросе кампаний клиента никаких ограничений не было (ну кроме 5-ти одновременных запросов), то теперь приходится учитывать баллы. Раньше мы запрашивали список кампаний для всех клиентов раз в 5 минут и обновляли данные в БД. Теперь так не получается. Теперь надо отслеживать изменения с помощью Changes.check и на основе ответа обновлять данные.
Итак. Для начала необходимо получить список кампаний, в которых произошли изменения с помощью метода Changes.checkCampaigns передав в параметрах дату с которой необходимо отследить изменения.
{ "method": "checkCampaigns", "params": { "Timestamp": "2015-02-02T10:08:22Z" } }
В случае, если изменения произошли после даты, переданной в параметрах, то API вернёт примерно такой результат:
{ "result": { "Campaigns": [{ "CampaignId": 13243, "ChangesIn": ["SELF"] }, { "CampaignId": 13326, "ChangesIn": ["SELF","CHILDREN"] }, { "CampaignId": 14742, "ChangesIn": ["CHILDREN", "STAT"] }], "Timestamp": "2015-02-02T12:24:31Z" } }
В ответе видно, что кампании 13243 и 13326 были обновлены и необходимо получить информацию об этих кампаниях с помощью метода Campaigns.get, а в кампаниях 13326 и 14742 произошли изменения внутри кампаний. Эти изменения необходимо получить с помощью метода Changes.check.
Теперь необходимо запросить изменения для тех кампаний, в которых произошли изменения:
{ "method": "check", "params": { "CampaignIds": [13326,14742], "FieldNames": ["AdGroupIds","AdIds","CampaignsStat"], "Timestamp": "2015-02-02T10:08:22Z" } }
Ответ API будет примерно таким:
{ "result": { "Modified": { "AdGroupIds": [23543,23544,23874], "AdIds": [33651,33921,34028,34106], "CampaignsStat": [ { "CampaignId": 14742, "BorderDate": "2015-01-28" } ] }, "NotFound": { "CampaignIds": [13326] }, "Timestamp": "2015-02-02T12:23:11Z" } }
Далее необходимо обновить данные для групп объявлений и ключевых слов в этих группах для идентификаторов указанных в массиве Modified.AdGroupIds с помощью методов AdGroups.get и Keywords.get.
Аналогично необходимо поступить с обновлением объявлений. Идентификаторы изменённых объявлений находятся в массиве Modified.AdIds.
В случае, если массив Modified.CampaignsStat не пуст, то для каждой кампании, указанной в массиве необходимо получить данные начиная с даты BorderDate.
В массиве NotFound перечислены идентификаторы сущностей, которые не найдены в базе Директа. Их можно удалить из вашего кеша (например, БД).
Теперь немного о подводных камнях.
Камень номер раз. В данный момент API 5 не поддерживает работу с кампаниями с типом «Смарт-баннеры», но методы сервиса Changes возвращают информацию о изменениях в этих кампаниях. При попытке получить информацию о кампании такого типа метод Campaigns.get не вернёт ничего, но метод для получения информации об объявлениях вернёт ошибку 1002. В связи с этим перед вызовом Changes.check необходимо свериться со списком кампаний, которые находятся у вас в кеше.
Камень номер два. Получение списка кампаний пока необходимо делать с помощью метода Campaigns.get, а не Changes.checkCampaigns, т.к. нет гарантии, что после внедрения поддержки кампаний с типом «Смарт-баннеры» метод Changes.checkCampaigns сообщит о том, что необходимо получить информацию о таких кампаниях.
Вот, собственно, и всё. Ничего сложного в сервисе Changes нет.
Все примеры (с минимальными изменениями) взяты из официальной документации API 5 Директа.
Где проходят встречи разработчиков по API Директа?