Клиенты часто спрашивали: как получать остаток бюджета (он же баланс) по Яндекс.Директ в отчёт Power BI? Поскольку в directprotools.ru у нас всё для этого есть, пришлось решить вопрос;)
При разборе справки API Яндекс.Директа стало понятно несколько моментов:
- нам нужен POST-запрос
- мы будем отправлять данные в JSON
- запрос отправляем по ссылке "https://api.direct.yandex.ru/live/v4/json/"
- ответ тоже приходит в формате JSON
- для агентского аккаунта обязательно указывать логин, а для клиентского - нет
Сам JSON исходя из справки выглядит так:
{
"method": "AccountManagement",
"token": "yourToken",
"param": {
"Action": "Get",
"SelectionCriteria": {
"Logins": ["yourLogin"],
"AccountIDS": []
}
}
}
Давайте попробуем собрать этот несложный запрос на directprotools.ru:
Жмём на кнопку "PQ". Инструмент генерирует код с пустыми заголовками и пустой строкой get-параметров, но с полноценным телом запроса (jsondata):
let
headers=[],
querydata = [],
jsondata = Json.FromValue( Json.Document(Text.ToBinary("{
""method"": ""AccountManagement"",
""token"": ""yourToken"",
""param"": {
""Action"": ""Get"",
""SelectionCriteria"": {
""Logins"": [""yourLogin""],
""AccountIDS"": []
}
}
}"))),
web = Web.Contents("https://api.direct.yandex.ru/live/v4/json/", [Headers = headers, ManualStatusHandling = {404, 400}, Query =querydata, Content = jsondata]),
result = Json.Document(web)
in result
Конечно yourToken и yourLogin пока не настоящие, но это не проблема!
Добавляем параметры:
Чтобы получить токен для своего аккаунта, перейдите по ссылке и дайте Power Query разрешение на получение данных: получить_токен
Снова нажимаем на кнопку "PQ". Теперь прямо в коде у нас есть возможность задавать наши 2 параметра:
Подставляем свои логин и токен, вставляем код в Power Query.
В результате получим строку:
Чтобы добраться до остатка бюджета, добавляем вручную несколько шагов, разворачивая вложенные элементы. Эти шаги довольно просты, но их код нужно сохранить, они нам понадобятся далее. У меня конечно денег нет, но на вашем аккаунте вы увидите остатки в поле Amount:
Теперь запрос готов и работает, давайте создадим функцию.
1 нажатие и запрос превращается в функцию:
Остаётся вручную добавить шаги с разворачиванием строк и таблиц в конец функции. Это можно сделать прямо в расширенном редакторе Power Query:
Внесём маленькое изменение для агентских аккаунтов. Чтобы запрашивать по несколько клиентских аккаунтов, их нужно подавать как список значений в кавычках через запятую. Поскольку никому не захочется вписывать аккаунты в кавычках, мы делим строку аккаунтов по запятым и автоматом добавляем кавычки:
logins = if yourLogins = null then "" else Text.Replace(""""&Text.Combine(Text.Split(yourLogins ,","),""",""")&""""," ","")
Итак, функция запроса баланса Яндекс.Директ по API готова. Она работает как на клиентских, так и на агентских аккаунтах. Если у вас обычный аккаунт, логин можно не указывать. В случае получения остатков по агентству, вам придётся указать список получаемых клиентских аккаунтов через запятую: account-name1,account-name2...
Анонсы всех видео, статей и полезностей - в нашем Telegram-канале🔥
Присоединяйтесь, обсуждайте и автоматизируйте!
Для получения остатков бюджета вставьте следующий код функции в Power Query, а затем вызовите функцию, используя свой токен получить_токен (и укажите логин клиента если у вас агентский акк):
(yourToken, yourLogins as nullable text)=>
let
logins = if yourLogins =null then "" else Text.Replace(""""&Text.Combine(Text.Split(yourLogins ,","),""",""")&""""," ",""),
headers=[],
querydata = [],
jsondata = Json.FromValue( Json.Document(Text.ToBinary("{
""method"": ""AccountManagement"",
""token"": """& yourToken&""",
""param"": {
""Action"": ""Get"",
""SelectionCriteria"": {
""Logins"": ["&logins&"],
""AccountIDS"": []
}
}
}"))),
web = Web.Contents("https://api.direct.yandex.ru/live/v4/json/", [Headers = headers, ManualStatusHandling = {404, 400}, Query =querydata, Content = jsondata]),
result = Json.Document(web),
data = result[data],
Accounts = data[Accounts],
toTable = Table.FromList(Accounts, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
expand = Table.ExpandRecordColumn(toTable, "Column1", {"Currency", "Discount", "Amount", "AccountID", "AmountAvailableForTransfer", "AgencyName", "Login"}, {"Currency", "Discount", "Amount", "AccountID", "AmountAvailableForTransfer", "AgencyName", "Login"}),
chType = Table.TransformColumnTypes(expand, {{"Amount", type number}, {"AmountAvailableForTransfer", type number}}, "en-AU"),
finalChType = Table.TransformColumnTypes(chType,{{"Currency", type text}, {"Discount", Int64.Type}, {"AccountID", Int64.Type}, {"AgencyName", type text}, {"Login", type text}})
in
finalChType
Комментарии