Остаток бюджета (Баланс) Яндекс Директа в Power BI по API

Остаток бюджета (Баланс) Яндекс Директа в Power BI по API

Клиенты часто спрашивали: как получать остаток бюджета (он же баланс) по Яндекс.Директ в отчёт 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...

Для получения остатков бюджета вставьте следующий код функции в 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
Комментарии