Страницы: 1 2 След.
RSS
Запрос WEB API через Power Qwery, Надо получить ответ по API в формате JSON
 
Добрый день. Поискал на форуме и ничего похожего не нашел, прошу помощи.

Есть потребность подключится к источнику данных, в документации запрос выглядит так:

GET / HTTP/1.1
Host: api-seller.ozon.ru
Client-Id: <Client-Id>
Api-Key: <Api-Key>
Content-Type: application/json

Но вот куда вводить Client-Id? совсем не понятно.

выдает следующее:

Где можно посмотреть примеры интеграции такой API с EXCEL?

Документация здесь - Документация Ozon Seller API

Изменено: Максим - 28.07.2021 15:52:57
 

Здравствуйте! Создайте пустой запрос в PQ и в расширенном редакторе вставьте код из примера ниже подставив нужные значение в поля Client-id и Apikey
изменяйте переменную url чтобы получить данные из других методов API Ozon

Код
url = "https://api-seller.ozon.ru/v1/product/info/prices",
    body  = "{ ""page"": ""1"",  ""page_size"": ""500""}", //постранично - не более 1000 записей на страницу
    Parsed_JSON = Json.Document(body),
    BuildQueryString = Uri.BuildQueryString(Parsed_JSON),
    Source = Json.Document(Web.Contents(url,[Headers = [#"Content-Type"="application/json",#"Client-Id"="XXXX",#"Api-Key"="XXXXXXXXX"], Content = Text.ToBinary(body) ] )),
    result = Source[result],
    items = result[items],
 
Попробуйте удалить последнюю запятую
 
А ругается на запятую в первой строке, не подскажете, как исправить код выше, что бы заработало?
Изменено: Newsky13 - 27.10.2022 14:29:30
 
Цитата
Newsky13 написал:
ругается на запятую
в let in завернули код?
 
Никита К, пробовала ваш код, но PQ выдает ошибку. Сможете подсказать, в чем кроется проблема?
Изменено: Shameless - 28.11.2022 02:30:46
 
Цитата
написал:
Никита К, пробовала ваш код, но PQ выдает ошибку. Сможете подсказать, в чем кроется проблема?
Если я правильно понял, Вы не подставили API ключ из админки OZON
 
Никита К, для удобства создала переменные client_id и api_key (они подтягиваются автоматически с листа, чтобы в случае смены ключа не перебивать каждый код). Если в код прямо вставить ID и ключ, то такая же ошибка возникает. У вас код работает?
 
Техподдержка Ozon написала следующее:
Вам необходимо отправлять POST запрос. В данном примере вы отправляете GET.
Изменено: Shameless - 28.11.2022 12:00:57
 
Уважаемые, если у кого заработает, пожалуйста, поделитесь рабочим вариантом, очень актуальная тема
 
Всем привет! В PQ запрос передается как POST если заполнены данные в Content
Если Вы подставляете данные из переменных, обратите внимание на количество и закрывание кавычек. Я уже не работаю с озон но вот пример работающего кода из апи запроса к алиэкспресс:
Код
Content = Text.ToBinary("{""products"":[{""product_id"":""" & Id & """,""skus"":[{""sku_code"": """ & Sku_code & """,""inventory"": """ & Inventory & """}]}]}""") ] ))
 Обратите внимание, значение переменных с обоих сторон облачено в " х 3 или (""")

Я побежал апи озон  около полугода тк нигде ни видел нормальной инфы как это делается через PQ, и когда победил моему ликованию не было предела. Запаситесь терпением и метод тыка поможет Вам
 
Очень надеюсь, что содержание данного сообщения не нарушит никаких правил.
В продолжении темы данного топика (Ozon API + Excel) есть предложение к заинтересованным к данной теме. Как то наткнулся в поисках решения, на такую реализацию (Ozon API + Google таблицы) Обратился к автору, но он что то как то непонятно (мне) ответил, в итоге, обратился на один из сайтов фрилансеров. За (неприлично в итоге большие для данной задачи)  деньги мне написали скрипт с абсолютно идентичным функционалом из ссылкb выше. Забирает данные о заказах, о ценах и остатках, если нужно изменить или остатки или цены, то вносятся новые данные, лист определяет изменения и только их можно из этого же листа отправить на Озон. Так вот, суть сообщения. Готов даром поделиться этим скриптом для Гугл таблиц с целью адаптировать всё это для Excel. Я конечно не знаю, насколько родственны скрипты от Гугл таблиц с Excel и не выйдет ли это каша из топора, но если на осове скрипта, его можно без особых затруднений переделать для Excel и в итоге получить функционал как на ссылке выше, только в Excel, стучите в лс, с радостью поделюсь исхдниками (только для реализации под Excel).

Если данное сообщение противоречит правилам, прошу снести его и не применять санкций, ибо финансовой корысти не исытываю, просто очень хочется удобно работать с Озон по API именно через Excel.
 
Я подружил Power Query и Ozon!!!!!!
Делаете пустой запрос. В расширенном редакторе вставляете тест ниже. Client-Id"="ХХХХХХХХ" и "Api-Key"="ХХХХХХХХХХХ" меняете на свои.

let
   Запрос = let

url = "https://api-seller.ozon.ru/v3/finance/transaction/list&quot;,
   body  = "{""filter"": {
       ""date"": {
           ""from"": ""2023-01-01T00:00:00.000Z"",
           ""to"": ""2023-01-20T00:00:00.000Z""
       },
       ""operation_type"": [],
       ""posting_number"": """",
       ""transaction_type"": ""all""
   },
   ""page"": 1,
   ""page_size"": 1000
}",


   Parsed_JSON = Json.Document(body),
   BuildQueryString = Uri.BuildQueryString(Parsed_JSON),
   Source = Json.Document(Web.Contents(url,[Headers = [#"Content-Type"="application/json",#"Client-Id"="ХХХХХХХХ",#"Api-Key"="ХХХХХХХХХХХ"], Content = Text.ToBinary(body) ] )),
   result = Source[result],
   items = result[items]

in
   Source,
   #"Преобразовано в таблицу" = Record.ToTable(Запрос),
   #"Развернутый элемент Value" = Table.ExpandRecordColumn(#"Преобразовано в таблицу", "Value", {"operations", "page_count", "row_count"}, {"Value.operations", "Value.page_count", "Value.row_count"}),
   #"Развернутый элемент Value.operations" = Table.ExpandListColumn(#"Развернутый элемент Value", "Value.operations"),
   #"Развернутый элемент Value.operations1" = Table.ExpandRecordColumn(#"Развернутый элемент Value.operations", "Value.operations", {"operation_id", "operation_type", "operation_date", "operation_type_name", "delivery_charge", "return_delivery_charge", "accruals_for_sale", "sale_commission", "amount", "type", "posting", "items", "services"}, {"Value.operations.operation_id", "Value.operations.operation_type", "Value.operations.operation_date", "Value.operations.operation_type_name", "Value.operations.delivery_charge", "Value.operations.return_delivery_charge", "Value.operations.accruals_for_sale", "Value.operations.sale_commission", "Value.operations.amount", "Value.operations.type", "Value.operations.posting", "Value.operations.items", "Value.operations.services"})
in
   #"Развернутый элемент Value.operations1"
 
Максим, А у меня, что то не хочет, ругается...
 
Newsky13, такая же фигня
 
Ну Вы же не просто копируете? :) Написать с 0, вероятно, сложно, но чуть-чуть понимать же код нужно.
Что если закрыть кавычки у текстового значения url? :)
Код
url = "https://api-seller.ozon.ru/v3/finance/transaction/list&quot;,",
Изменено: surkenny - 28.03.2023 10:28:06
 
Цитата
написал:
Ну Вы же не просто копируете?  Написать с 0, вероятно, сложно, но чуть-чуть понимать же код нужно.
Что если закрыть кавычки у текстового значения url?
Код
    [URL=#]?[/URL]       1      url =   " https://api-seller.ozon.ru/v3/finance/transaction/list" ,"  ,   
 
На базе вашего запроса, который у меня работает, сделал другой запрос но PQ упорно выдаёт 400 ошибку Bad request. Причем в Postman всё отлично пашет. Я уже голову сломал. Что не так? Памагити!


let
 Запрос = let

url = "https://api-seller.ozon.ru/v2/posting/fbo/list",
body  = "{
""dir"": ""ASC"",
""filter"": {
         ""since"": ""2023-05-01T00:00:00.000Z"",
         ""status"": """",
         ""to"": ""2024-07-05T10:44:12.828Z""
             },
""limit"": 1000,
""offset"": 0,
""translit"": ""true"",
 ""with"": {
         ""analytics_data"": ""true"",
         ""financial_data"": ""true""
          }
}",


Apikey = "xxxxx",
Clientid = "xxxxx",

  Parsed_JSON = Json.Document(body),
  BuildQueryString = Uri.BuildQueryString(Parsed_JSON),
  Source = Json.Document(Web.Contents(url, [Headers = [#"Client-id"=Clientid, #"Api-key"=Apikey,#"Content-Type"="application/json"], Content = Text.ToBinary(body) ] )),
  result = Source[result],
  items = result[items]

in

Source,
 #"Converted to table" = Record.ToTable(Запрос),
 #"Expanded Value" = Table.ExpandListColumn(#"Converted to table", "Value"),
 #"Expanded Value 1" = Table.ExpandRecordColumn(#"Expanded Value", "Value", {"order_id", "order_number", "posting_number", "status", "cancel_reason_id", "created_at", "in_process_at", "products", "analytics_data", "financial_data", "additional_data"}, {"order_id", "order_number", "posting_number", "status", "cancel_reason_id", "created_at", "in_process_at", "products", "analytics_data", "financial_data", "additional_data"})
in
 #"Expanded Value 1"
 
Иван, удалось решить проблему?
 
Ошибка 400 обычно означает неверно переданные параметры. Вот в них и надо искать причину. Может быть тип данных, переданных через JSON не тот, что ожидался. Например, здесь:
Код
""analytics_data"": ""true"",
true или false вполне возможно должны быть без кавычек, т.к. это булево значение, а не текст:
Код
""analytics_data"": true,
Но это все надо смотреть по спецификации API.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, Вы абсолютно правы! Это и была причина ) Спасибо
 
Цитата
написал:
Иван , удалось решить проблему?
Да, в итоге true false действительно в данном запросе нужно было писать без кавычек. Удивительно, что в других некоторых запросах с кавычками на true false работает.
 
(удалено)
Изменено: Partizano _pl - 12.07.2023 16:00:41
 
Дмитрий(The_Prist) Щербаков, а не подскажете еще как в исходном коде текстовые даты заменить на формулы:

значение ""to"": ""2024-07-05T10:44:12.828Z""  заменить на СЕГОДНЯ()

и

значение ""since"": ""2023-05-01T00:00:00.000Z"" заменить на СЕГОДНЯ() минус 6 месяцев назад

?
 
Иван, а как вы обошли лимит в 1000 строк? Ведь это не так много заказов высвечивается, в моем случае всего за 10 дней. По методу API больше 1000 строк из одного запроса нельзя получить. Предполагаю, что нужно как-то организовывать несколько запросов в диапазоне выбранных дат и складывать их результаты в одну таблицу. Если делали так, поделитесь опытом, пожалуйста, как это прописать в коде?
 
Кто-нибудь может подсказать дальше как загрузить отчеты.
К примеру я с помощью метода /v1/report/postings/create создал отчет, далее получил код этого отчета. Как его теперь загрузить?
Изменено: timi11 - 08.02.2024 20:24:43
 
Все таки получилось у кого-нибудь заменить даты на формулы?
Изменено: timi11 - 09.02.2024 00:09:10
 
Если кому-то поможет, адаптированный код для Отчёта по остаткам и товарам OZON
Код
let
   Запрос = let

url = "https://api-seller.ozon.ru/v2/analytics/stock_on_warehouses",
   body  = 
"{
    ""limit"": 1000,
    ""offset"": 0,
    ""warehouse_type"": ""ALL""
}",

   Parsed_JSON = Json.Document(body),
   BuildQueryString = Uri.BuildQueryString(Parsed_JSON),
   Source = Json.Document(Web.Contents(url,[Headers = [#"Content-Type"="application/json",#"Client-Id"="XXXXXX",#"Api-Key"="XXXXXXXXXXXXXXXX"], Content = Text.ToBinary(body) ] )),
   result = Source[result],
   items = result[items]

in
   Source,
    result = Запрос[result],
    rows = result[rows],
    #"Преобразовано в таблицу" = Table.FromList(rows, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Развернутый элемент Column1" = Table.ExpandRecordColumn(#"Преобразовано в таблицу", "Column1", {"sku", "warehouse_name", "item_code", "item_name", "promised_amount", "free_to_sell_amount", "reserved_amount"}, {"sku", "warehouse_name", "item_code", "item_name", "promised_amount", "free_to_sell_amount", "reserved_amount"})
in
    #"Развернутый элемент Column1"
Изменено: Татьяна - 19.05.2024 11:26:34
 
Коллеги, в Power Query рекурсия Ваш лучший друг
Внутри кода создаёте функцию (или отдельно) далее через Table.Combine вызываете её по условию,
1) Считаем кол-во страниц уже выгруженных (или просто суммируем каждый раз как 1+1 и т.д.
2) если общее кол-во страниц (есть в ответе на запрос) больше, чем выгружено сейчас, то рекурсивная функция
Код
if #"Value page_count" > page_count then 
                let
                    nextPage = page_count + 1,
                    nextTable = @ЗапросРекурсия(nextPage),
                    combinedTable = Table.Combine({table, nextTable})
                in
                    combinedTable
    else
                table,
Цитата
Цитата
написал:
Ведь это не так много заказов высвечивается, в моем случае всего за 10 дней. По методу API больше 1000 строк из одного запроса нельзя получить.
DateFrom = DateTime.ToText(Date1, "yyyy-MM-ddT00:00:00.000Z"),    
DateTo = DateTime.ToText(Date2, "yyyy-MM-ddT00:00:00.000Z"),
Цитата
написал:
Все таки получилось у кого-нибудь заменить даты на формулы?
 
У меня вот другой вопрос, по базовому отчёту из Начислений по товарам можно сделать фактическую Юнитку, однако по API сервисные операции (да и не только они) суммируются на строку и при разворачивании List и Record, он просто дублирует суммы, может кто знает, как их выгружать непосредственно на товар?
 
Кто-нибудь может подсказать что я делаю не так?

Я пытаюсь сделать так, чтобы даты в запрос попадали из таблицы в экселе.
Создала таблицу с датами и к датам сделала запрос. (скрин прикладываю)

= """"""&DateTime.ToText(Excel.CurrentWorkbook(){[Name="dates"]}[Content]{[Имя="account_date_from"]}[дата],"yyyy-mm-ddT00:00:00.000Z")&""""""  

Пробовала и без кавычек и с одинарными кавычками  и с двойными.  и кавычке в запросе пробовала ставить...
Потом подставляю  этот запрос вместо дат  в коде и получаю ошибку: DataSource.Error: Web.Contents не удалось получить содержимое из "https://api-seller.ozon.ru/v3/finance/transaction/totals"(400): Bad Request.

Если подставить даты в виде ""2024-00-01T00:00:00.000Z"", то код работает. Но это не удобно. Надо лезть в код и менять даты
Цитата
let
 Запрос = let

url = "https://api-seller.ozon.ru/v3/finance/transaction/totals"

body="{
  ""date"": {
           ""from"": date_from,
           ""to"": date_to
             },
  ""posting_number"":"""",
  ""transaction_type"":""all""
    }",

Apikey="XXXX",
Clientid= "XXXX",

Parsed_JSON = Json.Document(body),
BuildQueryString = Uri.BuildQueryString(Parsed_JSON),
Source =Json.Document(Web.Contents(url,[Headers=[#"Client-id"=Clientid, #"Api-key"=Apikey, #"Content-Type"="application/json"], Content=Text.ToBinary(body)])),
result=Sourse[result],
items=result[items]


in
   Source,
   #"Converted to table" = Record.ToTable(Запрос)
in
   #"Converted to table"
Страницы: 1 2 След.
Читают тему
Наверх