backgroundbackground
Назад
Назад

Получение медиафайла по nmID или иначе

Вопрос
Решено
0
364
# Общение с покупателями # Работа с товарами
Вопрос

Хотелось бы узнать каким образом можно получить первую фотографию карточки товара под которым задают вопрос или отзыв.

0
Решение
от@4aek
Отмечен модератором как решение

А вообще я разобрался Как из nmId получается фото

Дальше вызывается функция:

  • для вопросов: get_first_card_image_by_nmid(acc, nm_id)
  • для отзывов: get_first_card_image_by_nmid(acc, nm_id)

Эта функция делает:

1) Кеш

Сначала проверяет локальный кеш wb_image_cache.json:

key = str(nm_int) cached = IMAGE_CACHE.get(key) if cached: return cached, None

Если фото уже находили раньше — WB не дёргается, возвращается кеш.

2) Запрос в Content API

Потом отправляется запрос:

POST https://content-api.wildberries.ru/content/v2/get/cards/list

Тело запроса:

payload = { "settings": { "cursor": {"limit": 100}, "filter": { "textSearch": str(nm_int), "allowedCategoriesOnly": True, "withPhoto": -1 } } }

Смысл:

  • textSearch = nmId (как строка). Это такой “простой” способ найти карточку по id.
  • withPhoto: -1 — просим карточки независимо от наличия фото (но дальше всё равно проверяем photos).

Авторизация:

headers={"Authorization": acc["token"], "Content-Type": "application/json"}

3) Выбор первой карточки и первой фотки

Из ответа берётся:

cards = data.get("cards") or [] card = cards[0] photos = card.get("photos") or [] ph0 = photos[0]

Дальше выбирается URL в приоритетном порядке:

url = ph0.get("big") or ph0.get("square") or ph0.get("c516x688") ...

То есть “фото первого товара” = первая фотка из массива photos у первой найденной карточки.

4) Сохранение в кеш

Если URL найден:

IMAGE_CACHE[key] = url save_image_cache()

Как фото попадает в Telegram

Когда ты отправляешь вопрос/отзыв, ты пытаешься отправить одним сообщением: фото + подпись + кнопки:

bot.send_photo( CHAT_ID, photo=photo_url, caption=caption, parse_mode="HTML", reply_markup=... )

Если фото не получилось — fallback: обычное текстовое сообщение. вот кому если надо

Комментарий

Ну, так-то ВБ - это не база данных. Такие вещи на своей стороне лучше хранить.

0

Ответы на комментарий

Более 9к фото хранить не получится

0
Комментарий
Решение

А вообще я разобрался Как из nmId получается фото

Дальше вызывается функция:

  • для вопросов: get_first_card_image_by_nmid(acc, nm_id)
  • для отзывов: get_first_card_image_by_nmid(acc, nm_id)

Эта функция делает:

1) Кеш

Сначала проверяет локальный кеш wb_image_cache.json:

key = str(nm_int) cached = IMAGE_CACHE.get(key) if cached: return cached, None

Если фото уже находили раньше — WB не дёргается, возвращается кеш.

2) Запрос в Content API

Потом отправляется запрос:

POST https://content-api.wildberries.ru/content/v2/get/cards/list

Тело запроса:

payload = { "settings": { "cursor": {"limit": 100}, "filter": { "textSearch": str(nm_int), "allowedCategoriesOnly": True, "withPhoto": -1 } } }

Смысл:

  • textSearch = nmId (как строка). Это такой “простой” способ найти карточку по id.
  • withPhoto: -1 — просим карточки независимо от наличия фото (но дальше всё равно проверяем photos).

Авторизация:

headers={"Authorization": acc["token"], "Content-Type": "application/json"}

3) Выбор первой карточки и первой фотки

Из ответа берётся:

cards = data.get("cards") or [] card = cards[0] photos = card.get("photos") or [] ph0 = photos[0]

Дальше выбирается URL в приоритетном порядке:

url = ph0.get("big") or ph0.get("square") or ph0.get("c516x688") ...

То есть “фото первого товара” = первая фотка из массива photos у первой найденной карточки.

4) Сохранение в кеш

Если URL найден:

IMAGE_CACHE[key] = url save_image_cache()

Как фото попадает в Telegram

Когда ты отправляешь вопрос/отзыв, ты пытаешься отправить одним сообщением: фото + подпись + кнопки:

bot.send_photo( CHAT_ID, photo=photo_url, caption=caption, parse_mode="HTML", reply_markup=... )

Если фото не получилось — fallback: обычное текстовое сообщение. вот кому если надо

+1