PDA

Просмотр полной версии : Выгрузка данных в Excel через запрос Power Query



Елена_Fridman
27.10.2021, 05:57
Доброго дня!
Прошу помочь с запросом Power Query. Запрос для выгрузки данных "Получения последних данных с прибора - POST parameters/last-data" в таблицу Excel. Код запроса ниже. До этого подобные навыки не развивались, очень надеюсь на помощь, данные выводит - таблицу с пустыми значениями.

let

url = "https://api.owencloud.ru", //Ссылка на нужные нам данные

Login = "{""login"": ""*****"", ""password"": ""*******""}",
tabLogin = Json.Document(Login),

//И в бинарник
BinLogin = Uri.BuildQueryString(tabLogin),
BLogin = Text.ToBinary(BinLogin),

//Форма с данными которые передаются в запросе

ResHead = [

#"POST"="/v1/parameters/last-data/ HTTP/1.1",

#"28"="api.owencloud.ru", //НА ЭТОТ заголовок Host PQ ругался хз почему

#"Accept"="*/*",

#"Authorization"="Bearer G78Fv1AfWN5JHirEVfAFnO1gAap3gKBR",

#"11"="25", //НА ЭТОТ заголовок Content-Length PQ ругался хз почему

#"Content-Type"="application/x-www-form-urlencoded"],


Source = Json.Document(Web.Contents(url,[Headers = ResHead , Content = BLogin ]))

in
Source

A.Simonov
28.10.2021, 17:03
Доброго дня!
Прошу помочь с запросом Power Query. Запрос для выгрузки данных "Получения последних данных с прибора - POST parameters/last-data" в таблицу Excel. Код запроса ниже. До этого подобные навыки не развивались, очень надеюсь на помощь, данные выводит - таблицу с пустыми значениями.

let

url = "https://api.owencloud.ru", //Ссылка на нужные нам данные

Login = "{""login"": ""*****"", ""password"": ""*******""}",
tabLogin = Json.Document(Login),

//И в бинарник
BinLogin = Uri.BuildQueryString(tabLogin),
BLogin = Text.ToBinary(BinLogin),

//Форма с данными которые передаются в запросе

ResHead = [

#"POST"="/v1/parameters/last-data/ HTTP/1.1",

#"28"="api.owencloud.ru", //НА ЭТОТ заголовок Host PQ ругался хз почему

#"Accept"="*/*",

#"Authorization"="Bearer G78Fv1AfWN5JHirEVfAFnO1gAap3gKBR",

#"11"="25", //НА ЭТОТ заголовок Content-Length PQ ругался хз почему

#"Content-Type"="application/x-www-form-urlencoded"],


Source = Json.Document(Web.Contents(url,[Headers = ResHead , Content = BLogin ]))

in
Source

Добрый день.

Подготовил для вас пример 2-х запросов с помощью Power Query
57713

Первый запрос производит авторизацию в демо-аккаунт, и нужен чтобы получить актуальный токен.


let

url = "https://api.owencloud.ru/v1/auth/open", //Ссылка на нужные нам данные

Login = "{""login"":""demo@owen.ru"",""password"":""demo123""}",
BLogin = Text.ToBinary(Login), //Форма с данными которые передаются в запросе

ResHead = [

#"POST"="/v1/auth/open HTTP/1.1",

#"Accept"="*/*",

#"Content-Type"="application/x-www-form-urlencoded"],


Source = Json.Document(Web.Contents(url,[Headers = ResHead , Content = BLogin ]))
in
Source



Второй запрос использует токен, полученный первым запросом, и запрашивает актуальные данные 2-х параметров.
Токен, полученный через логин-пароль через 20 минут неактивности (отсутствия запросов) инвалидируется и удаляется из БД.
Поэтому его нужно обновить (выполнить первый запрос), перед тем как делать второй запрос.
Так как если токен "протухнет", то второй запрос выдаст ошибку авторизации.


let

url = "https://api.owencloud.ru/v1/parameters/last-data", //Ссылка на нужные нам данные

Content = "{""ids"":[5885163, 5885168]}",
BContent = Text.ToBinary(Content), //Форма с данными которые передаются в запросе

token = Excel.CurrentWorkbook(){[Name="Запрос_токена"]}[Content]{0}[Value],

ResHead = [

#"POST"="/v1/parameters/last-data HTTP/1.1",

#"Accept"="*/*",

#"Authorization"="Bearer "&token,

#"Content-Type"="application/x-www-form-urlencoded"],


Source = Json.Document(Web.Contents(url, [Headers=ResHead, Content=BContent])),
temp1 = Source{0}[values]{0}[v],
temp2 = Source{1}[values]{0}[v],

tempTable = Table.FromList(
{
[Type = "Прямая сетевая вода", Temp = temp1],
[Type = "Обратная сетевая вода", Temp = temp2]
},
Record.FieldValues,
{"Тип", "Температура"}
)
in
tempTable


В качестве примера был выбран прибор "Котельная (ПЛК160_1.2.2)", который находится на демо-аккаунте

Прибор: https://web.owencloud.ru/device/index/171772
Его мнемосхема: https://web.owencloud.ru/mimic-diagram/view/618

Для перехода по ссылкам выше нужно авторизоваться в демо-аккаунте.
Для этого нажмите кнопку "демо вход", чтобы войти в демо-аккаунт.
57712

С этого прибора я получаю значение двух параметров:
1) Температура обратной воды (id 5885168)
2) Температура прямой воды (id 5885163)

Id параметров используются во втором запросе (в соответствии с форматом запроса (https://api.owencloud.ru/#parameter)).
Эти айдишники можно получить через API, например, запросив список параметров у нужного прибора.
Но можно и проще, достаточно перейти в режим отладки, например, в браузере Chrome для этого нужно зажать сочетание клавиш Shift+ctrl+i
Затем выберете инструмент "указатель элементов" и наведите мышь на значение нужного параметра, см. скрин ниже.
После этого должна всплыть подсказка с информацией о элементе, там и будет нужный Id.
57714

Во вложении прикрепляю Excel файл, где можно посмотреть как это все работает.

P.S. До сегодняшнего дня я не знал о существовании Power Query, поэтому возможно что-то сделал не эффективно или криво, но по крайней мере это работает :).
И температуры благополучно вытаскиваются из облака OwenCloud и отображаются в таблице.

Елена_Fridman
29.10.2021, 07:32
Добрый день!
Спасибо! Это то, что надо, все работает!

MarySolo
12.01.2022, 18:18
Добрый день!

Большое спасибо за полезный пример.
Подскажите, пожалуйста, а если необходимо выгрузить значение параметра на дату?
Код выше прекрасно работает, но если необходимо использовать https://api.owencloud.ru/v1/parameters/data , в который на вход нужно подавать start и end временного промежутка, функция WebContents выдает ошибку (400) Bad Request.
Если на примере выше, делаю следующее:


let


url = "https://api.owencloud.ru/v1/parameters/data", //Ссылка на нужные нам данные


Content = "{""ids"":[5885163, 5885168],""start""=""2021-31-12 23:00:00"",""end""=""2022-01-01 01:00:00""}",
BContent = Text.ToBinary(Content), //Форма с данными которые передаются в запросе


token = Excel.CurrentWorkbook(){[Name="Запрос_токена"]}[Content]{0}[Value],

ResHead = [


#"POST"="/v1/parameters/last-data HTTP/1.1",

#"Accept"="*/*",


#"Authorization"="Bearer "&token,


#"Content-Type"="application/x-www-form-urlencoded"],




Source = Json.Document(Web.Contents(url, [Headers=ResHead, Content=BContent])),
temp1 = Source{0}[values]{0}[v],
temp2 = Source{1}[values]{0}[v],


tempTable = Table.FromList(
{
[Type = "Прямая сетевая вода", Temp = temp1],
[Type = "Обратная сетевая вода", Temp = temp2]
},
Record.FieldValues,
{"Тип", "Температура"}
),
Температура = tempTable{0}[Температура]
in
Температура