Страницы: 1
RSS
Автообновление Динамического источника данных (Яндекс API) Power BI
 
Подскажите как настроить автообновление отчета, использующего Яндекс API?

Ругается на Динамический источник данных, если действовать стандартным методом.

Так же происходит при настройке любого отчета с использованием api.

Лицензия Pro. шлюз к локальной машине подключен. Данные с локальных файлов, Кубов данных, сайтов, SQL серверов автообновляются без проблем.
В чем тут фишка, и как это обойти?
 
Попробуйте создать скрипт через Cron, который запрашивает данные из Яндекс API по расписанию.

Или вообще нечто похожее на Python с помощью requests и schedule оформите:
Код
import requests
import schedule
import time

def update_report():
    # Настройки API
    API_URL = 'https://api.example.com/data'
    API_token = 'your_token'

    # Параметры запроса
    params = {
        'date1': '6daysAgo',
        'date2': 'today',
        # Другие параметры
    }

    # Заголовки для авторизации
    headers = {'Authorization': API_token}

    # Отправка запроса
    response = requests.get(API_URL, params=params, headers=headers)

    # Обработка ответа
    if response.status_code == 200:
        # Обновление данных в отчете
        print("Данные обновлены успешно")
    else:
        print("Ошибка обновления данных")

# Настройка расписания
schedule.every(1).day.at("08:00").do(update_report)  # Обновлять каждый день в 8:00

while True:
    schedule.run_pending()
    time.sleep(1)
One tap - one kill
 
Также, ещё вспомнил насчёт Power BI.

В Power Query можно использовать функцию Web.Contents() с параметрами RelativePath и Query, чтобы динамически изменять URL запроса. Тогда получится обновлять данные, если используется базовый URL и динамические части URL передаются через эти параметры.
Вот сниппет:
Код
let
    Source = Web.Contents("https://api.example.com/baseurl",
        [RelativePath = "/path/to/resource",
         Query = "param1=value1¶m2=value2"])
in
    Source

Можно использовать REST API Power BI для обновления наборов данных. Тогда выйдет обновлять данные асинхронно (полезно для сложных моделей и больших данных).
Команда для Powershell:
Код
# Установите модуль Power BI
Install-Module -Name MicrosoftPowerBIMgmt

# Войдите в Power BI
Login-PowerBI

# Обновите набор данных
Invoke-PowerBIRestMethod -Url "https://api.powerbi.com/v1.0/myorg/groups/{groupId}/datasets/{datasetId}/refreshes" -Method Post
One tap - one kill
 
Цитата
написал:
В Power Query можно использовать функцию Web.Contents() с параметрами RelativePath и Query,
Вот, смотрите, нашел запрос, который работает на автообновление
Код
let
    CreateLog = 
        Json.Document(Web.Contents("https://api-metrika.yandex.net/management/v1/counter/{мой счётчик}/logrequests/evaluate", 
      [
       Headers=
         [Authorization="OAuth {мой ключ}", 
          #"Content-Type"="application/x-yametrika+json"], 
       Query=
         [#"date1" = "2025-02-10", 
                    #"date2" = "2025-02-15", 
                    #"fields" = {"ym:s:clientID", "ym:s:counterUserIDHash", "ym:s:eventsProductEventTime", "ym:s:eventsProductType"}, 
                    #"source" = "visits"], 
       IsRetry=true
      ]
       ))
in
   CreateLog
Вот не могу понять, как url изменить, чтобы не статус получить, а сформировать и скачать этот отчет.
 
Цитата
написал:
как url изменить, чтобы не статус получить, а сформировать и скачать этот отчет.
Вместо /evaluate, который только проверяет возможность создания отчета, нужно:
  1. Сначала создать запрос на формирование отчета.

  2. Проверить статус готовности отчета.

  3. Скачать готовый отчет.

Модификация запроса:
Код
let
    // 1. Создание запроса на формирование отчета
    CreateRequest = 
        Json.Document(Web.Contents("https://api-metrika.yandex.net/management/v1/counter/{мой счётчик}/logrequests", 
        [
            Headers=
                [Authorization="OAuth {мой ключ}", 
                #"Content-Type"="application/x-yametrika+json"], 
            Content = Text.ToBinary(Json.FromValue(
                [
                    date1 = "2025-02-10", 
                    date2 = "2025-02-15", 
                    fields = {"ym:s:clientID", "ym:s:counterUserIDHash", "ym:s:eventsProductEventTime", "ym:s:eventsProductType"}, 
                    source = "visits"
                ])),
            ManualStatusHandling = {400, 401, 403, 404, 429, 500, 502, 503, 504}
        ])),
    
    // Получаем ID запроса
    RequestId = CreateRequest[log_request][request_id],
    
    // 2. Проверка статуса запроса (в цикле, пока не будет готов)
    CheckStatus = Function.InvokeAfter(
        () => Json.Document(Web.Contents("https://api-metrika.yandex.net/management/v1/counter/{мой счётчик}/logrequest/" & RequestId,
        [
            Headers=[Authorization="OAuth {мой ключ}"],
            ManualStatusHandling = {400, 401, 403, 404, 429, 500, 502, 503, 504}
        ])),
        #duration(0, 0, 0, 5)
    ),
    
    // 3. Скачивание отчета
    DownloadReport = 
        if CheckStatus[log_request][status] = "processed" then
            Csv.Document(Web.Contents("https://api-metrika.yandex.net/management/v1/counter/{мой счётчик}/logrequest/" & RequestId & "/part/0/download",
            [
                Headers=[Authorization="OAuth {мой ключ}"],
                ManualStatusHandling = {400, 401, 403, 404, 429, 500, 502, 503, 504}
            ]))
        else
            "Отчет еще не готов"
in
    DownloadReport

Так же присутствуют важные моменты:
- Используется POST-запрос к /logrequests (без /evaluate)
- Параметры запроса передаются в теле самого запроса через Content
- После создания получаем request_id для дальнейшего отслеживания
- Проверяем статус запроса, ожидая значение "processed"
- Когда отчет готов, скачиваем его, указывая номер части (part/0)

Вот. И для работы с большими отчётами придётся модифицировать код, чтобы он чекал каждую часть датабазы.
One tap - one kill
 
Цитата
написал:
Content = Text.ToBinary(Json.FromValue(
               [
                   date1 = "2025-02-10",
                   date2 = "2025-02-15",
Спасибо, почти, но не пойму, именно Content нее верно указан
Код
Expression.Error: Не удается преобразовать значение типа Binary в тип Text.
Сведения:
    Value=[Binary]
    Type=[Type]

Вопрос так же не по теме:
Вы не подскажете, где можно query подтянуть в этой области - работа с api?
Столкнулись с необходимость, никто ничего не знает, как котята в потемках - очень непрягает) Прогеры тоже разводят руками.
А все "курсы" - это работа преобразованием данных.

 
Цитата
написал:
Expression.Error: Не удается преобразовать значение типа Binary в тип Text.
Сведения:
   Value=[Binary]
   Type=[Type]
Ошибка возникает потому, что функция Json.FromValue() уже возвращает значение типа Binary, но происходит попытка преобразовать его в Binary снова с помощью Text.ToBinary(). Это вызывает конфликт типов данных.

Нужно использовать только Json.FromValue() без Text.ToBinary():
Код
Content = Json.FromValue([
    date1 = "2025-02-10",
    date2 = "2025-02-15",
    fields = {"ym:s:clientID", "ym:s:counterUserIDHash", "ym:s:eventsProductEventTime", "ym:s:eventsProductType"},
    source = "visits"
])
Либо, если нужно использовать Text.ToBinary(), сначала преобразуйте JSON в текст:
Код
Content = Text.ToBinary(Text.FromBinary(Json.FromValue([
    date1 = "2025-02-10",
    date2 = "2025-02-15",
    fields = {"ym:s:clientID", "ym:s:counterUserIDHash", "ym:s:eventsProductEventTime", "ym:s:eventsProductType"},
    source = "visits"
])))

Что касается вопроса о том, где можно найти информацию о работе с API в Power BI, то, безусловно, рекомендую соответствующее сообщество на Reddit, потом можете чекнуть Chris Webb, ну и документацию Microsoft по работе с Web.Contents(), там вроде и динамические источники данных описываются, если память не изменяет :)
One tap - one kill
 
Цитата
написал:
Ошибка возникает потому, что функция Json.FromValue() уже возвращает значение типа Binary, но происходит попытка преобразовать его в Binary снова с помощью Text.ToBinary().
Да, я пробовал, но тогда не воспринимается параметр date1, хотя, насколько я понимаю, именно в таком формате нужно передавать в url.
Код
Required request parameter 'date1' is not present
Страницы: 1
Читают тему
Наверх