Поиск товаров по штрихкоду на сайте www.ean13.info




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

9 Comments

  1. webester

    Прошу прощения, что мешаю зарабатывать мани, но там же несколько строк.

    Соединение = Новый HTTPСоединение(«www.ean13.info»);
    Ответ = Соединение.Получить(Новый HTTPЗапрос(«»+КакойТоШтрихКод+».htm»));
    
    РезультатПоиска = Новый Структура(«Статус, Товар,Страна,Производитель,Штрихкод», СтрокаСообщения);
    
    Если Ответ.КодСостояния = 200 Тогда
    ЧтениеХТМЛ = Новый ЧтениеHTML;
    ЧтениеХТМЛ.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
    ПостроительДОМ = Новый ПостроительDOM;
    
    ДокументХТМЛ = ПостроительДОМ.Прочитать(ЧтениеХТМЛ);
    ЭлементыДОМ = ДокументХТМЛ.ПолучитьЭлементыПоИмени(«span»);
    Если ЭлементыДОМ[1].ТекстовоеСодержимое = «Товар не найден в базе данных» Тогда
    //может будем как то обрабатывать
    Иначе
    РезультатПоиска.Статус = «Найдено в интернете»;
    РезультатПоиска.Товар = ЭлементыДОМ[1].ТекстовоеСодержимое;
    РезультатПоиска.Страна = ЭлементыДОМ[4].ТекстовоеСодержимое;
    РезультатПоиска.Производитель = ЭлементыДОМ[5].ТекстовоеСодержимое;
    РезультатПоиска.Штрихкод = ТекКод;
    КонецЕсли;
    Иначе
    //может будем как то обрабатывать
    КонецЕсли;
    
    
    

    Показать

    Reply
  2. skif47

    (1) webester, зарабатывание мани не является моей основной целью. Так что нет, не мешаете. Кажется странным, что вместо того, чтобы оформить свой код в публикацию, вы пишете его в комментариях к чужой публикации.

    Теперь по существу. Вы часто ищете штрихкоды на этом сайте? С какой целью — проверить существующие в вашей базе товары или добавить новые? Имеет смысл добавить в обработку поддержку API и попробовать пообщаться с хозяевами базы на тему «дайте тарифы попроще и с оплатой не через сбербанк»? Создание номенклатуры по найденному стоит добавлять?

    Reply
  3. skif47

    Эти вопросы ко всем читающим, кстати )

    Reply
  4. webester

    (2)

    Кажется странным, что вместо того, чтобы оформить свой код в публикацию, вы пишете его в комментариях к чужой публикации

    Мне показалось излишним делать публикацию на каждые 10 строк кода. Слишком простая штука. Поэтому добавил когда увидел ваш пост, раз вы все таки сочли нужным делать для этого пост. Мне кажется вам надо было сразу выкладывать код, раз вам не нужны мани.Что бы мог воспользоваться любой даже без аккаунта на ИС.

    Вы часто ищете штрихкоды на этом сайте?

    Нет.

    С какой целью — проверить существующие в вашей базе товары или добавить новые?

    Запускаю работающую аптеку, неохота руками все набирать. по макс убрать ручной труд, насколько возможно. Будем искать названия в файлах поставщиков, если не найдется, то в базе, если и там не будет, то наберет фармацевт название ручками.

    Имеет смысл добавить в обработку поддержку API и попробовать пообщаться с хозяевами базы на тему «дайте тарифы попроще и с оплатой не через сбербанк»?

    Вам виднее, но мне кажется добавлять апи которое работает с апи, какой то перебор.

    Создание номенклатуры по найденному стоит добавлять?

    Слишком щепетильный вопрос, для аптеки критичен производитель, для вас наверно нет, где то должны характеристики заполняться, а к ним уже штрихкод, где то не должны. В разных конфигурациях по разному это должно происходить, если вам хочется этим заниматься, то почему бы и нет? Я честно сказать практический смысл нахожу с трудом. Кому надо тот себе напишет, а кто не может, может заказать за недорого, создание номенклатуры опять же несколько строк кода если под конкретное решение.

    Reply
  5. skif47

    (4) webester, Согласен, исходники выложил.

    Reply
  6. skif47

    (4) webester,

    Будем искать названия в файлах поставщиков

    Если не секрет, что вообще в этом случае предоставляют поставщики? Прайсы, накладные, CommerceML? В моем представлении, фармацевтика — достаточно прокачанная отрасль в плане IT.

    добавлять апи которое работает с апи, какой то перебор.

    речь шла о том, чтобы запрашивать инфу о товарах не парсингом страниц, а через предназначенный для этого API. Это может пригодиться при необходимости запросить 50-100 и больше штрихкодов (у меня капча вылезла примерно после 50 запросов). Вам действительно ни к чему, если редко туда ходите.

    Reply
  7. webester

    (6)

    Если не секрет, что вообще в этом случае предоставляют поставщики?

    Кто, во что горазд. txt, xls, xml последнее прилетело в html.Какой то бред честное слово.Настолько все строго с этими ценами, условиями и тд такой бардак в поставке накладных.

    Reply
  8. sfs1981

    Добрый день.

    Как представитель ean13.info, добавлю от себя:

    1. Тарифы попроще у нас есть, для тех кто берет доступ оптом, существуют скидки. Если нужно меньше чем 5000 запросов — пиште, договоримся.

    2. Мы реализовали обратное АПИ. Теперь, при передаче нам данных о товарах, которых у нас нет , вы получаете бесплатные запросы к базе (1 новый товар = 10 бесплатных запросов).

    Ну и похвастаемся: размер базы приближается к 10 млн. товаров.

    Reply
  9. skif47

    Новости на всякий случай:сайт ean13.info перешел на https.

    По запросам вроде http://ean13.info/4600171016044.htm

    возвращается текст:

    <!DOCTYPE HTML PUBLIC «-//IETF//DTD HTML 2.0//EN»>

    <html><head>

    <title>301 Moved Permanently</title>

    </head><body>

    <h1>Moved Permanently</h1>

    <p>The document has moved here.</p>

    </body></html>

    Соответственно, функция ПолучитьФайлHTTP потребует изменения в способе создания http соединения: должно быть создано безопасное соединение. Параметры конструктора объекта, насколько я помню, различаются в платформах 8.2 и 8.3, также могут потребоваться танцы с бубном вокруг сертификатов.

    Увы, заниматься всем этим времени нет.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *