@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)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы