Giter Site home page Giter Site logo

wb-private-api's Introduction

GitHub package.json version GitHub last commit GitHub commit activity GitHub Workflow Status

npm

NodeJS модуль. Работает через приватное API Wildberries

🍒 wb-private-api

Разработано при спонсировании:

Нейромаркет - Глубокий Анализ товаров на Wildberries.

Установка: npm i wb-private-api

После установки рекомендую протестировать работоспособность

image

Если все результаты положительные, значит библиотека полностью работоспособна и сервера WB отвечают верно. В случае, если каки-либо тесты отрицательные, прошу создать обращение https://github.com/glmn/wb-private-api/issues

Пример работы

Вывод данных о первом товаре из поисковой выдачи по ключевому слову

import { WBPrivateAPI, Constants } from "wb-private-api";

const keyword = "HotWheels";

/*
 * Select destination and init WBPrivateAPI with it
 * You can find more destionations in Constants.DESTINATIONS
 */
const destination = Constants.DESTINATIONS.MOSCOW;
const wbapi = new WBPrivateAPI({ destination });

const initiate = async () => {
  /*
   * Search and Grab first 2 pages
   * with specified keyword
   */
  const catalog = await wbapi.search(keyword, 2);
  const product = catalog.products[0];

  /*
   * Returning all Stocks with Warehouses Ids
   * Then you can compare these Ids
   * using Constants.WAREHOUSES
   */
  const stocks = await product.getStocks();

  /* No comments here :P */
  const feedbacks = await product.getFeedbacks();
  const questions = await product.getQuestions();
};

initiate();

Вывод рекламодателей из поисковой выдачи по ключевому слову

import { WBPrivateAPI, Constants } from "wb-private-api";

const keyword = "Менструальные чаши";

/*
 * Select destination and init WBPrivateAPI with it
 * You can find more destionations in Constants.DESTINATIONS
 */
const destination = Constants.DESTINATIONS.MOSCOW;
const wbapi = new WBPrivateAPI({ destination });

const initiate = async () => {
  /*
   * Search ads in search results
   * with specified keyword
   */
  const { pages, prioritySubjects, adverts } = await wbapi.getSearchAds(
    keyword
  );

  // Ads positions on each page
  console.log(pages);

  // Subjects ordered by priority
  console.log(prioritySubjects);

  // Adverts including CPM
  console.log(adverts);
};

initiate();

WBPrivateAPI методы

.search(keyword, pageCount, retries = 0, filters = []) - Поиск всех товаров по Ключевому слову keyword. pageCount отвечает за кол-во необходимых страниц для прохода. Если pageCount = 0, то будет взяты все страницы или 100, если их больше. retries отвечает за количество попыток выполнить запрос, если в ответ был получен статус 5хх или 429. filters это массив с объектами вида [{type: 'fbrand' value: 11399 }], необходим для фильтрации поисковой выдачи по брендам, поставщикам, цене и т.д. Метод возвращает объект WBCatalog

.getSearchAds(keyword) - Поиск рекламодателей (в разделе Поиск) по Ключевому слову

.getCarouselAds(keyword) - Поиск рекламодателей внутри карточке в каруселе "Рекламный блок"

.keyHint(query) - Возвращает список подсказок из поиска WB по фразе query

.searchSimilarByNm(productId) - Возвращает список похожих товаров (как в разделе "Похожие товары" внутри карточки на WB)

.getPromos() - Возвращает массив текущих промо-акций на WB

.getListOfProducts(productIds) - Возвращает массив найденных артикулов на WB с деталями (Не оборачивается в WBProduct)

WBCatalog методы

.page(number) - Возвращает массив товаров с заданной страницы (массив состоит из объектов WBProduct)

.getPosition(productId) - Возвращает номер позиции по заданному SKU. Если такого SKU в выдаче нет, то вернёт -1

WBProduct методы

.create(id) - Статичный метод. Использовать в виде WBProduct.create(id). Где id = Артикул товара. Метод асинхронный, поэтому перед вызовом используйте await. Вернет объект WBProduct

.totalStocks - Вернёт сумму остатков товара со всех складов (!) предварительно вызвать .getStocks())

.getStocks() - Присвоет (и вернет) свойству stocks массив с данными об остатках на складе

.getPromo() - Присвоет (и вернет) свойству promo объект с данными об участии в промо-акции

.getFeedbacks() - Присвоет (и вернет) свойству feedbacks массив со всеми отзывами WBFeedback о товаре

.getQuestions() - Присвоет (и вернет) свойству questions массив со всеми вопросами WBQuestion о товаре

WBFeedback методы

.getPhotos(size='min') - Вернет ссылки на все фотографии в текущем отзыве. size по умолчанию = min. Заменить на full если необходим большой размер

wb-private-api's People

Contributors

abuntakov avatar dependabot[bot] avatar glmn avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

wb-private-api's Issues

FAIL tests/WBPrivateAPI.test.js

[email protected] test
jest --verbose

PASS tests/Utils.test.js
Проверка утилит Card
✓ Проверка генерации URL на логотип бренда Brand.imageURL() (3 ms)
✓ Проверка генерации URL на фотографии карточек Card.imageURL() (1 ms)
✓ Проверка метода getBasketNumber() генерации Basket номера по Артикулу товара (10 ms)

PASS tests/SessionBuilder.test.js
Проверка класса SessionBuilder
✓ Проверка статичного метода .create() (4 ms)

PASS tests/WBCatalog.test.js
Проверка класса WBCatalog
✓ Проверка метода .page() по ключевому запросу "Очки женские" (874 ms)
✓ Проверка метода .getPosition() по ключевому запросу "Менструальные чаши" (290 ms)
✓ Проверка метода .getPosition() на ответ при ложном поиске (507 ms)

PASS tests/WBProduct.test.js
Проверка класса WBProduct
✓ Проверка метода .getStocks() на возврат данных об остатках товара на складах (627 ms)
✓ Проверка метода .getPromo() на возврат данных об участии в промо-акции (425 ms)
✓ Проверка метода .getFeedbacks() на возврат всех отзывов (919 ms)
✓ Проверка метода .getQuestions() на возврат всех вопросов (717 ms)

console.log
{
name: 'Платье',
catalog_type: 'preset',
catalog_value: 'preset=500060403',
normquery: 'платье',
context_metadata: {},
products: [
{
time1: 4,
time2: 34,
dist: 122,
id: 149647710,
root: 126758860,
kindId: 2,
brand: '365.SOWELL',
brandId: 429535,
siteBrandId: 439535,
colors: [Array],
subjectId: 69,
subjectParentId: 1,
name: 'Платье вечернее',
supplier: 'ИП Пучков Максим Сергеевич',
supplierId: 1145527,
supplierRating: 4.5,
priceU: 370000,
salePriceU: 149800,
sale: 59,
logisticsCost: 0,
returnCost: 0,
diffPrice: false,
saleConditions: 0,
pics: 29,
rating: 4,
reviewRating: 4.4,
feedbacks: 1332,
volume: 11,
viewFlags: 0,
sizes: [Array],
log: [Object]
}
]
}

  at Object.log (tests/WBPrivateAPI.test.js:50:13)

FAIL tests/WBPrivateAPI.test.js (9.105 s)
Проверка поиска рекламодателей
✓ Проверка рекламы по Поиску .getSearchAds() (419 ms)
✓ Проверка карусели внутри карточки .getCarouselAds() (277 ms)
Проверка поиска товаров WBPrivateAPI.search()
✓ Поиск количества товаров по ключевому запросу "Платье" (1282 ms)
✓ Поиск количества товаров (редких) по ключевому запросу "тату чебурашка" (107 ms)
✓ Поиск данных из фильтров по ключевому запросу "конструктор детский" (402 ms)
✕ Проверка получения Query Params по ключевому запросу "Платье" (285 ms)
✓ Проверка метода getQueryMetadata на запросы разных страниц (447 ms)
✓ Сбор 3 страниц товаров по ключевому запросу "Платье" (647 ms)
✓ Проверка фильтрации товаров по бренду и ключевому запросу "торшер" (180 ms)
✓ Проверка фильтрации товаров по поставщику и ключевому запросу "торшер" (182 ms)
✓ Проверка фильтрации товаров по бренду и по поставщику с ключевым запросом "торшер" (173 ms)
✓ Проверка совместимости с axios-retry (1650 ms)
✓ Проверка метода .getQueryMetadata на прохождение HTTP 429 ошибки (1383 ms)
✓ Проверка аргумента pageCount на понижение кол-ва страниц, если их меньше чем запрошено (202 ms)
✓ Проверка метода .keyHint(query) на вывод предположений по ключевому запросу "Платье" (59 ms)
✓ Проверка метода .searchSimilarByNm(productId) на возврат идентификаторов похожиш товаров (305 ms)
✓ Проверка метода .getPromos() на возврат текущих промо-акций (172 ms)
✓ Проверка метода .getListOfProducts() на возврат найденных товаров (249 ms)
Проверка выдачи данных по продавцу
✓ Проверка метода .getSupplierInfo() (42 ms)

● Проверка поиска товаров WBPrivateAPI.search() › Проверка получения Query Params по ключевому запросу "Платье"

expect(received).toBe(expected) // Object.is equality

Expected: "subject"
Received: "preset"

  50 |     console.log(metadata)
  51 |     expect(typeof metadata === "object").toBeTruthy();
> 52 |     expect(catalog_type).toBe("subject");
     |                          ^
  53 |     expect(catalog_value).toBe("subject=69;70;2905;4000;4855;4857");
  54 |   });
  55 |

  at Object.toBe (tests/WBPrivateAPI.test.js:52:26)

Test Suites: 1 failed, 4 passed, 5 total
Tests: 1 failed, 29 passed, 30 total
Snapshots: 0 total
Time: 9.412 s, estimated 41 s
Ran all test suites.

Не получаю данные по городам!

Starting search in destination: HABAROVSK
Received catalog for HABAROVSK: []
No products found or invalid catalog data for HABAROVSK
Starting search in destination: NOVOSIBIRSK
Received catalog for NOVOSIBIRSK: []
No products found or invalid catalog data for NOVOSIBIRSK
Starting search in destination: EKATERINBURG
Received catalog for EKATERINBURG: []
No products found or invalid catalog data for EKATERINBURG

const express = require('express');
const { WBPrivateAPI, Constants } = require('wb-private-api');
const app = express();
app.use(express.json());

app.post('/search', async (req, res) => {
const { keyword, productId } = req.body;

let results = {};
for (let destinationKey in Constants.DESTINATIONS) {
    console.log(`Starting search in destination: ${destinationKey}`);
    const destination = Constants.DESTINATIONS[destinationKey];
    const wbapi = new WBPrivateAPI({ destination });

    try {
        const catalog = await wbapi.search(keyword, 20, 5);
        console.log(`Received catalog for ${destinationKey}:`, JSON.stringify(catalog, null, 2));

        if (!catalog || !catalog.products || catalog.products.length === 0) {
            console.log(`No products found or invalid catalog data for ${destinationKey}`);
            results[destinationKey] = 'Invalid catalog data or no products found';
        } else {
            const position = catalog.products.findIndex(product => product.id === productId);
            results[destinationKey] = position >= 0 ? position : 'Product not found';
        }
    } catch (error) {
        console.error(`Error during searching in ${destinationKey}:`, error);
        results[destinationKey] = 'Error during search';
    }
}

res.json(results);

});

const PORT = 3000;
app.listen(PORT, () => {
console.log(Server running on port ${PORT});
});

import requests

data = {
"keyword": "сумка через плечо",
"productId": 174119251,
}

response = requests.post("http://localhost:3000/search", json=data)
results = response.json()
print(results)

{'KRASNODAR': 20, 'MOSCOW': 11, 'KAZAHSTAN': 7, 'HABAROVSK': 'Invalid catalog data or no products found', 'NOVOSIBIRSK': 'Invalid catalog data or no products found', 'EKATERINBURG': 'Invalid catalog data or no products found'}

Как запустить тесты?

Здравствуйте, сабж в названии.
И ещё один вопрос, вб заблокировал запросы, можно как-то прикрутить использование прокси?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.