@arsenaljek

Как вывести больше 100 номенклатур посредством curl в php?

Подскажите как заставить curl выполнятся несколько раз?
Есть код
$chphoto = curl_init('https://suppliers-api.wildberries.ru/content/v2/get/cards/list');
curl_setopt($chphoto, CURLOPT_HTTPHEADER, array('Content-Type: application/json',
        'Host: suppliers-api.wildberries.ru',
        'Authorization: '.$GLOBALS['TokenWBContent']));
curl_setopt($chphoto, CURLOPT_POST, 1);
curl_setopt($chphoto, CURLOPT_POSTFIELDS, '{
          "settings": {
        "cursor": {
            "limit": 100
          },
          "filter": {
            "withPhoto": -1
            }
          }
        }');
curl_setopt($chphoto, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chphoto, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($chphoto, CURLOPT_HEADER, false);
$resultWB3photo1 = curl_exec($chphoto);
curl_close($chphoto);
$resultWB3photo1 = json_decode(json_encode(json_decode($resultWB3photo1)), True);

Он выводит только 100 номенклатур WB. По факту номенклатур больше 1000. В инструкции API Wildberries сказано

spoiler
Порядок работы с get/cards/list:
Чтобы получить полный список номенклатур, если их больше 100, необходимо воспользоваться пагинацией.

Cделать первый запрос (все указанные ниже параметры обязательны):

{
              "settings": {
                "cursor": {
                  "limit": 100
                },
                "filter": {
                  "withPhoto": -1
                }
              }
            }


Пройти в конец полученного списка номенклатур, скопировать из cursor две строки:
"updatedAt": "***",
"nmID": ***,
Вставить скопированные строки в cursor запроса, повторить вызов метода.
Повторять пункты 2 и 3, пока total в ответе не станет меньше чем limit в запросе.
Это будет означать, что Вы получили все карточки.


Как заставить curl отработать в цикле нужно кол-во раз? Можете привести хотя бы пример на php?
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
Adamos
@Adamos
Рабочий код:
public function getCards2024(): array
    {
        $cards = [];
        $limit = 100;
        $cursor = [
            'limit' => $limit
        ];
        do {
            $res = $this->curlQuery(
                self::API_SUPPLIERS,
                self::METHOD_POST,
                'content/v2/get/cards/list',
                [
                    'settings' => [
                        'sort' => [
                            'ascending' => false
                        ],
                        'cursor' => $cursor,
                        'filter' => ['withPhoto' => -1]
                    ]
                ]
            );
            if(!is_array($res) || !isset($res['cards'])) {
                throw new \ErrorException('WB returns wrong answer');
            }
            $cards = array_merge($cards, $res['cards']);
            $cursor['updatedAt'] = $res['cursor']['updatedAt'];
            $cursor['nmID'] = $res['cursor']['nmID'];
        } while($res['cursor']['total'] >= $limit);
        return $cards;
    }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@psiklop
Цикл обычный.
$page = 0;
while(++$page) {

тут break по условию (конец пагинации или ошибки и тп)
}

Там должен быть еще параметр page или offset (не только limit)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
13 мая 2024, в 10:10
2000 руб./за проект
13 мая 2024, в 09:57
80000 руб./за проект
13 мая 2024, в 09:55
50000 руб./за проект