1. Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 550+ и мы растем!
    Скрыть объявление

Работаем с OpenCart. Часть 1. Вступление.

Авторизация, получение списка и добавление товара в ИМ на OpenCart

  1. Support Денис
    В техподдержку A-Parser часто поступают вопросы о том, можно ли загрузить товар в интернет-магазин на OpenCart, используя наш софт. Ответ на этот вопрос следующий:
    "A-Parser может спарсить почти все ,что угодно и запостить на большинство сайтов в независимости от их движка". Стоит только приложить усилие.
    Так как данная тема весьма объемна, то разобъем ее на несколько частей.
    В данной статье мы рассмотрим такие вещи как :
    1. Авторизация в админке OpenCart
    2. Получение списка товаров из админки
    3. Добавление товаров
    В качестве подопытного был взят OpenCart версии 3.0.2.0. Итак приступим.


    Авторизация в админке OpenCart

    Перейдя по адресу https://доменное имя сайта/admin/ мы увидим окно авторизации. Открываем Инструменты разработчика в браузере и авторизируемся, для того чтобы увидеть какой запрос отправляется при данном действии.
    [​IMG]
    Как видно на скриншоте, при авторизации отправляется POST запрос по адресу
    Код:
    https://урл нашего сайта/admin/index.php?route=common/login
    Передаваемые параметры можно увидеть, прокрутив скроллер вниз.
    [​IMG]
    То есть передаются такие параметры, как route, логин и пароль, redirect. Для того чтобы можно было указывать логин и пароль вручную, добавим 2 поля в нашем парсере.
    Код:
    this.editableConf = [
                 ['login', ['textfield', 'Username']],
                 ['pass', ['textfield', 'Password']],
              ];
    Теперь отправим данный запрос со всеми параметрами из нашего парсера
    Код:
    let response = yield this.request('POST', set.query + '/admin/index.php?route=common/login', {
                    username: this.conf.login,
                    password: this.conf.pass,
                    route: 'common/login',
                    redirect: set.query + '/admin/index.php?route=common/login',
                }, );
    Из заголовков, присылаемых в ответе от сервера, нам необходимо выбрать user_token и OCSESSID.
    [​IMG]
    И выберем мы их следующим образом:
    Код:
     let token = response.headers.URI.match(/.+?\&user_token=(.+)/);
                    let cookie_sessid = response.headers['Request-Raw'].match(/OCSESSID=([\w\d]+)/);
                    token = token ? token[1] : 'No token';
                    cookie_sessid = cookie_sessid ? cookie_sessid[1] : false;
    Как видно на скриншоте ниже, авторизация прошла успешно, а значит можно переходить к следующему пункту.
    [​IMG]


    Получение списка товаров из админки

    Запрос, необходимый для получения списка товаров, находим так же как и запрос для авторизации, с помощью Инструментов разработчика. Теперь реализуем метод, собирающий список продуктов (картинку, название и цену):
    Код:
     * get_products(token, set) {
                let products = [];
                let resp = yield this.request('GET', set.query + '/admin/index.php?', {
                    route: 'catalog/product',
                    user_token: token,
                }, {});
                if (resp.success) {
                    let rgx = /td class="text-center"> <img\s+src="([^"]+)"[\s\S]+?<td class="text-left">([^<]+)[\s\S]+?<td class="text-right">.+?(\$[\d\.]+)/g;
                    let tmp_obj;
                    let next_page = resp.data.match(/<ul class="pagination">[\s\S]+?class="active".+?href="([^"]+page=\d+)"/);
                    while (tmp_obj = rgx.exec(resp.data)) {
                        let product = {
                            img: tmp_obj[1],
                            name: tmp_obj[2],
                            price: tmp_obj[3]
                        };
                        products.push(product);
                    }
                    while (next_page) {
                        let resp2 = yield this.request('GET', next_page[1], {}, {});
                        if (resp2.success) {
                            while (tmp_obj = rgx.exec(resp2.data)) {
                                let product = {
                                    img: tmp_obj[1],
                                    name: tmp_obj[2],
                                    price: tmp_obj[3]
                                };
                                products.push(product);
                            }
                            next_page = resp2.data.match(/<ul class="pagination">[\s\S]+?class="active".+?href="([^"]+page=\d+)"/);
                        }
                    }
    
    Данный массив товаров нам понадобится в следующей статье, когда при массовом добавлении данных мы будем проверять наличие товара в БД, во избежание дублирования.


    Добавление товаров

    Запрос для добавления товара получаем так же, как и предыдущие. Реализуем метод для добавления товара в БД магазина.
    Код:
     * add_product(product, token, url) {
                let response = yield this.request('POST', url + '/admin/index.php?route=catalog/product/add&user_token=' + token, {
                    route: 'catalog/product/add',
                    user_token: token,
                    'product_description[1][name]': product.name,
                    'product_description[1][description]': product.description,
                    'product_description[1][meta_title]': product.meta_title,
                    'file': product.file,
                    'product_description[1][meta_description]': product.meta_description,
                    'product_description[1][meta_keyword]': product.meta_keyword,
                    'product_description[1][tag]': product.tag,
                    model: product.model,
                    price: product.price,
                    sku: product.sku,
                    upc: product.upc,
                    jan: product.jan,
                    ispn: product.ispn,
                    mbn: product.mbn,
                    location: product.location,
                    tax_class_id: product.tax_class_id,
                    quantity: product.quantity,
                    minimum: product.minimum,
                    subtract: product.subtract,
                    stock_status_id: product.stock_status_id,
                    shipping: product.shipping,
                    date_available: product.date_available,
    
                }, );
                if (response.success) {
                    return true;
                }
                return false;
    Теперь вызовем наш метод:
    [​IMG]

    и проверим результат:
    [​IMG]

    Товар добавлен.

    Ну вот и все. В следующей статье рассмотрим на реальном примере парсинг и массовое добавление товара в базу (а так же статусы товаров), или если товар уже есть в бд то обновление некоторой информации о товаре.
    Пример учебного парсеры вы можете скачать из Каталога по этой ссылке.