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

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

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


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

Перейдя по адресу https://доменное имя сайта/admin/ мы увидим окно авторизации. Открываем Инструменты разработчика в браузере и авторизируемся, для того чтобы увидеть какой запрос отправляется при данном действии.
rfkrw_180711164540.png

Как видно на скриншоте, при авторизации отправляется POST запрос по адресу
Код:
https://урл нашего сайта/admin/index.php?route=common/login
Передаваемые параметры можно увидеть, прокрутив скроллер вниз.
ulkoq_180711165910.png

То есть передаются такие параметры, как 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.
180711_175637_00001.png

И выберем мы их следующим образом:
Код:
 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;
Как видно на скриншоте ниже, авторизация прошла успешно, а значит можно переходить к следующему пункту.
180711_180546_00001.png



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

Запрос, необходимый для получения списка товаров, находим так же как и запрос для авторизации, с помощью Инструментов разработчика. Теперь реализуем метод, собирающий список продуктов (картинку, название и цену):
Код:
 * 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;

Теперь вызовем наш метод:
180712_101127_00001.png


и проверим результат:
32t3m_180712101444.png


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

Ну вот и все. В следующей статье рассмотрим на реальном примере парсинг и массовое добавление товара в базу (а так же статусы товаров), или если товар уже есть в бд то обновление некоторой информации о товаре.
Пример учебного парсеры вы можете скачать из Каталога по этой ссылке.
  • Like
Реакции: Lame
Автор
Support Денис
Просмотры
39
Первый выпуск
Обновление

Рейтинги

0,00 звёзд Оценок: 0

Ещё ресурсы от Support Денис

Назад
Верх