Да, в названии сплошная реклама. На певый взгляд, как можно связать поисковик и магазин помимо поиска? На самом же деле речь пойдет не о конкретном поиске Google, а об аналоге MS Excel - Google Sheet. Целью было сделать таблицу со списком нужного мне товара и актуальной ценой на него. Забегая вперед скажу, что проект рабочий на 99%. Остался 1% на получение ценника на товар, в котором возможны опции и от них зависит цена. Для такого варианта есть временное обходное решение.
Итак, план работ следующий:
Там увидим тег, в котором указана стоимость товара
На самом деле у каждого товара есть два тега с ценой: "цена сейчас" (class="now") и "старая цена" (class="old"). Вот тут есть подвох: цена внутри тега указана в валюте, которую вы выставили в своих настройках. Понятно, что выкусывать оттуда ценник не интересно и трудоемко. Если внимательно посмотреть на атрибуты тегов, то можно увидеть, что есть атрибут с именем oriprice (видимо сокращение от original price). По умолчанию, ценник на Banggood.com формируется в USD, а после надстройкой сайта пересчитывается в валюту, которую вы указали в настройках. Этот факт приводит нас к тому, что нужно где-то получить курс USD к вашей валюте. В моем случае это RUB.
Где и как взять содержимое курсов валют мы разобрались. Теперь второй вопрос - как обратиться к переменной и получить у нее значение? Тут нам на помощь приходит JS функция eval(). Она позволит сделать из строки кусок JavaScript кода. После этих манипуляций у нас появится доступ к переменной CurrencyCfg, к которой мы сможем обратиться как к массиву.
Наверное на этом этапе уже пора внести ясность и рассказать, куда запихнуть все вышеизложенное. У Google Sheet есть приятный бонус в виде редактора для создания пользовательских функций (макросы в MS Excel). Идем в меню Инструменты -> Редактор скриптов. В редакторе создаем функцию fnBanggoodCurrency с одним параметром sCurrencyName, в котором будет передаваться имя нужной нам вылюты. А сама функция будет возвращать требуемый курс к USD.
Для использования нашей функции достаточно в написать ее в ячейку в виде формулы: =fnBanggoodCurrency(D1)
Итак, план работ следующий:
- Создать список товаров
- Вбить к ним ссылки
- Получить цены с сайта
- Посчитать чек
Подготовка
Для начала проведем анализ данных, которыми обладает товар. Рассмотрим на примере Li-Po аккумулятора. Открываем товар, кликаем правой кнопкой мыши на цене -> проинспектировать элемент.Там увидим тег, в котором указана стоимость товара
На самом деле у каждого товара есть два тега с ценой: "цена сейчас" (class="now") и "старая цена" (class="old"). Вот тут есть подвох: цена внутри тега указана в валюте, которую вы выставили в своих настройках. Понятно, что выкусывать оттуда ценник не интересно и трудоемко. Если внимательно посмотреть на атрибуты тегов, то можно увидеть, что есть атрибут с именем oriprice (видимо сокращение от original price). По умолчанию, ценник на Banggood.com формируется в USD, а после надстройкой сайта пересчитывается в валюту, которую вы указали в настройках. Этот факт приводит нас к тому, что нужно где-то получить курс USD к вашей валюте. В моем случае это RUB.
Создание списка товаров
Эта часть статьи малополезна, поэтому я просто приведу список товаров в виде ссылок на них. Это подборка для 210 квадрокоптера (нет, это не реклама).- Рама
- ESC
- Моторы
- Плата распределения питания
- Видеопередатчик
- Контроллер полета
- Камера
- Пропеллеры
- Аккумулятор
Курс валют с Banggood.com
Простым поиском по коду страницы с ключом currency находим ссылку на JS файл: currency_huilv.js. Именно в нем хранятся курсы и список валют и именно в него мы пойдем за курсом рубля. Но этот момент тоже не так прост. Google Sheet не умеет работать со сторонними JS файлами. Я нашел возможность обратиться к нему через вызов метода fetch класса UrlFetchApp. Это встроенный класс, который позволяет получить содержимое файла по URL адресу.Где и как взять содержимое курсов валют мы разобрались. Теперь второй вопрос - как обратиться к переменной и получить у нее значение? Тут нам на помощь приходит JS функция eval(). Она позволит сделать из строки кусок JavaScript кода. После этих манипуляций у нас появится доступ к переменной CurrencyCfg, к которой мы сможем обратиться как к массиву.
Наверное на этом этапе уже пора внести ясность и рассказать, куда запихнуть все вышеизложенное. У Google Sheet есть приятный бонус в виде редактора для создания пользовательских функций (макросы в MS Excel). Идем в меню Инструменты -> Редактор скриптов. В редакторе создаем функцию fnBanggoodCurrency с одним параметром sCurrencyName, в котором будет передаваться имя нужной нам вылюты. А сама функция будет возвращать требуемый курс к USD.
Для использования нашей функции достаточно в написать ее в ячейку в виде формулы: =fnBanggoodCurrency(D1)
Цены на товар
Еще одна не простая тема, которая легко решается при помощи формул в Google Sheet. Чуть выше мы нашли, откуда можно взять стоимость товара. Проблема в том, что это цена с сайта и ее получение нужно автоматизировать. Тут нам на помощь придет формула IMPORTXML. Пришлось угробить часик на то, что бы научиться ей пользоваться. Она упорно не хотела идти по абсолютному пути. Возможно из-за скриптов. Но обратиться к элементу и получить нужное значение все же удалось. Давайте разберем формулу:
Но есть нюанс. На Banggood.com достаточно много товаров с опциями выбора, от которых зависит стоимость. так произошло с товаром Контроллер полета. К сожалению на момент написания статьи решения еще не было. Всвязи с этим было принято решение добавить колонки корректировки, которые заполняются вручную. В результате, если мы не смогли загрузить цену с сайта, она подтянется из колонки коррекции. Не очень красивое, но решение.
Код пользовательской функции
IMPORTXML(C6; "(//div[@class='now']/@oriprice)[1]"))
Первый аргумент - это наша ссылка на товар. Второй аргумент - XPath. Т.е. мы выбираем все DIV, у которых есть атрибут class и его значение now. Далее берем значение атрибута oriprice. Поскольку условие достаточно абстрактное и под него может попасть даеко не один элемент, мы укажем, что возьмем только первый из них. Это наша текущая цена. По тому же принципу выбирается и старая цена.Но есть нюанс. На Banggood.com достаточно много товаров с опциями выбора, от которых зависит стоимость. так произошло с товаром Контроллер полета. К сожалению на момент написания статьи решения еще не было. Всвязи с этим было принято решение добавить колонки корректировки, которые заполняются вручную. В результате, если мы не смогли загрузить цену с сайта, она подтянется из колонки коррекции. Не очень красивое, но решение.
Пересчет цены
Еще момент, на который пришлось потратить время. Когда я приступил к пересчету цены из USD в RUB столкнулся с нестыковкой. После пересчета цена в RUB из Google Sheet не совпадала с ценой на Banggood.com в той же валюте. Как оказалось, в том же файле есть несколько индексов, которые корректировали итоговую сумму. В моем случае это был CurrencyBGLoss. После применения этого коэффициента и последующего округления ценники совпали. В итоге получилась счет-фактура с динмическими (ну или почти динамическими) актуальными ценами на товар. В ней можо посчитать итоговую сумму без скидки, со скидкой и сумму самой скидки, что на мой взгляд очень удобно.Приложения и ссылки
Google Sheet файлКод пользовательской функции
/**
* Получает данные о курсе валют с Banggood.com
**/
function fnBanggoodCurrency(sCurrencyName) {
// Если валюту не передали, то по умолчанию RUR
sCurrencyName = (typeof(sCurrencyName) === "undefined")?"RUB":sCurrencyName;
// Считываем файл с курсами валют
var oResponse = UrlFetchApp.fetch("https://www.banggood.com/cache/static_cache/currency_huilv.js");
// Преобразуем текст в JS код
eval(oResponse.getContentText());
// Если переменная CurrencyList не определена, то получить список валют не удалось
if(typeof(CurrencyList) === "undefined"){
throw "Bangood currency retrieve error";
}
// Если валюты нет в списке валют, то дпльнейшие действия бесполезны
if(CurrencyList.indexOf(sCurrencyName) === -1){
throw "Bangood currency is undefined";
}
// Получаем курс валюты и умножаем на корректирующий коэффициент
var nCCourceValue = CurrencyCfg[sCurrencyName][0]*CurrencyBGLoss
// Возвращаем курс требуемой валюты
return nCCourceValue;
}
Если у вас есть интересные идеи по этой теме и не только - пишите в комментариях.
Комментарии
Отправить комментарий