Всем привет! Продолжаю эпопею об администрировании Интернет-магазина. Как-то задумались мы, а неплохо было бы поместить на товары отзывы с Яндекс.Маркета, где это возможно! Ведь правда, это должно несколько повысить лояльность покупателей. Заходят в карточку товара, там есть отзывы. Это круто! Причём не синтетика, а вполне живые, с плюсами и минусами. Кароче подумали мы с Серёгой и решили, что надо.
А тут ребята с Яндекса подсказали, что есть у них некое API, с которым можно получать произвольные данные.
Правда нужен аутентификационный токен.
Получаем токен
Где брать токен? Пишу друзьям из Яндекса (далее по тексту – друяндексы). Говорю, мол, так и так, мы сайт, который продаёт сетевое оборудование, хотели бы публиковать отзывы с Маркета. Посещаемость 50 человек в сутки. Дайте токен.
В ответ приходит, мол, покажите эскиз, как вы планируете публиковать отзывы?
Я почесал макушку, взял скриншот страницы, взял скриншот с яндекс.маркета товара с отзывами, вырезал отзывы, вставил в скрин с сайта (карточки товара), мелкая косметика в Паинте и готово! Весьма мило получилось. Отправил им.
Ребята подумали денёк и написали, мол, вот вам тестовый токен, вот наши требования – чтобы был отзыв полностью (плюсы, минусы), оценка и имя пользователя, опыт использования и ссылка на все отзывы с маркета, ведущая на конкретный товар!
Я наколбасил простой скрипт на PHP+curl, вставил туда токен, вбил адрес произвольной страницы товара и …. вуаля! 10 отзывов в формате XML!
Организуем отзывы
Первым делом разбираемся как выкладывать отзывы у себя.
Для вызова нужно обратиться к URL: “https://api.content.market.yandex.ru/v1/model/ID/opinion.json
Где в качестве ID указывается номер товара в каталоге Яндекса:
Обратите внимание на расширение файла – .json, можно выбрать .xml для получения XML-выборки. Так же доступны некоторые параметры (?count=N, где N – количество отзывов на странице, до 30 шт.).
Как я сделал отзывы
Стилизовал отзывы при помощи CSS под отзывы с Яндекса:
Скрипт обращался к API каждый раз при открытии карточки товара и выводил отзывы на страницу в раздел “Отзывы”. Всё бы хорошо, но потом я выяснил, что Яндекс даёт всего лишь 100 обращений к своему API в сутки на бесплатной основе! Дальше придётся платить, весьма немалую сумму.
Как обойти это ограничение
Решено было написать скрипт для загрузки отзывов в базу данных на ротационной основе. То есть завожу некую таблицу в MySQL, в неё кидаю отзывы (100 товаров в сутки), беру только последние 30 отзывов – это всё, что можно взять без дополнительных запросов, мне достаточно 30-ти штук, на остальные есть ссылка от Яндекса.
Затем, по крону, раз в сутки, скрипт отбирает 100 наиболее старых записей, удаляет их и подгружает на их место новые (обновляя поля “дата загрузки”). Таким образом, старыми становятся уже записи… То есть если товаров под Яндекс больше 100, они будут обновляться последовательно. Сперва самые старые, потом более новые и так далее.
Скрипт вышел вот таким. Не претендует на абсолютную точность, есть пара сомнительных мест. Буду благодарен за корректировку:
<?php
$DB_HOST = 'localhost';
$DB_USER = '***********';
$DB_PASS = '***********';
$DB_NAME = '***********';
$MAX_API = 100;
$con = mysql_connect($DB_HOST, $DB_USER, $DB_PASS); // write log
mysql_select_db($DB_NAME, $con); //write log
mysql_query('set names utf8');
$query = 'SELECT * FROM `oc_review` WHERE `ym` = 1 ORDER BY `date_modified`';
$rez = mysql_query($query);
// Удалили все отзывы на товары с маркета с самых старых (100 штук)
while ($row = mysql_fetch_assoc($rez)) {
$query = 'DELETE FROM `oc_review` WHERE `review_id` = \''.$row['review_id'].'\'';
error_log("\n".'SQL: '.$query,3,'/var/log/YM.log');
mysql_query($query) or die(mysql_error());
}
$query = 'SELECT `product_id`,`meta_description` FROM `oc_product_description` WHERE `meta_description` REGEXP \'^-?[0-9]+$\' LIMIT '.$MAX_API;
$rez = mysql_query($query);
while ($row = mysql_fetch_assoc($rez)) {
$url = "https://api.content.market.yandex.ru/v1/model/".$row['meta_description']."/opinion.json?count=30";
error_log("\n".'URL: '.$url,3,'/var/log/YM.log');
$headers = array(
"Host: api.content.market.yandex.ru",
"Accept: */*",
"Authorization: ##############токен#############"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$data = curl_exec($ch);
curl_close($ch);
$ar = json_decode($data);
file_put_contents($row['product_id'],$data);
if (isset($ar->errors[0])) {
error_log("\n".'E:'.$ar->errors[0],3,'/var/log/YM.log');
break;
}
$arsize = count($ar->modelOpinions->opinion); // количество отзывов
error_log("\n".'COUNT: '.$arsize,3,'/var/log/YM.log');
for ($i = 0; $i < min(30,$arsize); $i++) {
$otziv = $ar->modelOpinions->opinion[$i];
if (!isset($otziv->author)) {$otziv->author = 'Анонимно';}
$otziv->text = (isset($otziv->text))?$otziv->text:'-нет-';
$otziv->pro = (isset($otziv->pro))?$otziv->pro:'-нет-';
$otziv->contra = (isset($otziv->contra))?$otziv->contra:'-нет-';
$otziv->date = gmdate("Y-m-d H:i:s",$otziv->date / 1000);
$query = 'INSERT INTO `oc_review` (`product_id`, `author`,`text`,`plus`,`minus`,`ym`,`expir`,`rating`,`status`,`date_added`,`date_modified`)
VALUES (\''.$row['product_id'].'\',
\''.$otziv->author.'\',
\''.$otziv->text.'\',
\''.$otziv->pro.'\',
\''.$otziv->contra.'\',
\'1\',
\''.$otziv->usageTime.'\',
\''.($otziv->grade+3).'\',
\'1\',
\''.$otziv->date.'\',
\''.date("Y-m-d H:i:s").'\')';
echo $query;
error_log("\n".'SQL:'.$query,3,'/var/log/YM.log');
mysql_query($query);
}
}
?>
То есть я расширил стандартную таблицу под отзывы и пополняю её, выставляя на неродные отзывы метку ym=1. А на странице выводятся отзывы уже из базы, таким образом суточное ограничение на доступ к API нам не мешает!
Как это работает, можете увидеть вот тут.
Кстати, номер товара (ID тот самый) я кидаю в meta_description в админке магазина. Поле всё равно чаще всего не при делах. Не очень хороший вариант, но что поделать…
Comments: