Звонок из карточки контакта через Asterisk без внешних компонент




Принцип обмена данными из 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='\

30 Comments

  1. nytlenc

    Без внешних компонент но зато со сторонним телефоном или софтфоном…. Одно решение другого краше…

    Reply
  2. ArchLord42

    (1)

    Без внешних компонент но зато со сторонним телефоном или софтфоном…. Одно решение другого краше…

    Ну а как вы позвоните без телефона или софтфона в принципе? Интегрировать VOIP в 1С напрямую, так это дорого и нафиг не нужно.

    Reply
  3. ArchLord42
    сохранение записи разговора в 1С

    Зачем их сохранять в 1С? Достаточно достать их из астера и все, к тем более у него есть табличка с Cdr обычно, где хранятся идентфикаторы звонков, через которые в свою очередь можно скачать файл звонка напрямую с АТС пользователю.

    Reply
  4. nytlenc

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

    Reply
  5. soulner

    (1) Телефон, конечно нужен (или софтофон с гарнитурой) без него никак. Тут вопрос удобства. Менеджеру начальник ставит задачу или он сам себе делает напоминание, предметом является контактное лицо. Таким образом звонок — это 3 клика мышью: 1-по предмету, 2-по закладке с контактами, 3-по команде звонка. Там, где я поставил это расширение все очень довольны.

    Reply
  6. soulner

    (3) Иногда возникают спорные вопросы с клиентом, тогда руководство может прослушать разговоры и разобраться кто прав. Иногда нет смысла или возможности хранить записи звонков на АТС (некоторые ставят Asterisk через METARouter в Mikrotik). Ваш вариант сложней для руководства и требует привлечения специалиста для получения записи.

    Reply
  7. nytlenc

    (5) я к тому, что помимо этого расширения нужно ставить отдельно сторонний софтфон чтобы все работало ))) в идеале же можно сделать тоже самое и без стороннего софтфона

    Reply
  8. soulner

    (7) если Вам это удастся, да ещё и кроссплатформенно, буду стоя аплодировать.

    Reply
  9. nytlenc

    (8) обещаете снять видео, где вы аплодируете стоя и выложить его в публичный доступ, поделившись здесь ссылкой? )))

    Reply
  10. nytlenc

    (3)

    тем более у него есть табличка с Cdr обычно, где хранятся идентфикаторы звонков, через которые в свою очередь можно скачать файл звонка напрямую с АТС пользователю.

    и нужно мудрить костыль который будет лезть в эту внешнюю таблицу и выдергивать оттуда данные, сращивать индентификаторы звонков, потом искать файлы звонков, а потом и вовсе тянуть запись с «левого» сервера, чтобы проиграть ее пользователю — а это все время и ресурсы….

    Reply
  11. ArchLord42

    (10) не знал что обычный sql запрос это костыль…)

    О каком времени и ресурсах говорится когда нужно качнуть 100кб через http или ftp?

    Reply
  12. nytlenc

    (11) к вашему сведению, стоило бы знать — обычный sql запрос в 1С — это костыль )))) и уж тем более когда нужно качнуть 100 кб через http или ftp это два костыля сразу.

    Reply
  13. DenisCh

    (12)Штатный ПолучитьФайл() — это костыль? О_о Давно?

    Reply
  14. ArchLord42

    (12)

    к вашему сведению, стоило бы знать — обычный sql запрос в 1С — это костыль ))))

    Ясно.

    Reply
  15. nytlenc

    (13) Отличить FTP, HTTP от ПолучитьФайл() не можете?

    Reply
  16. DenisCh

    (15) Предлагаю попробовать команду:

    ПолучитьФайл(«http://ftp.dlink.ru/README.html»)

    И насладиться результатом.

    Reply
  17. nytlenc

    (17) А теперь с таким же наслаждением прикручиваем сюда авторизацию )))) Которая требуется для того, чтобы получить данные и ваш ПолучитьФайл() с наслаждением превращается в сложную конструкцию с HTTPСоединение, HTTPЗапрос, FTPСоединение и т.д. и т.п. — в общем начинаем делать костыли 🙂

    Reply
  18. DenisCh

    Я с астериска таскал данные по фтп с авторизацей в урле и наслаждался жизнью

    Reply
  19. nytlenc

    (19) наверняка в виде конструкции:

    ПолучитьФайл(«ftp://Login:Password@ftp.dlink.ru/README.html»);
    

    Которая предполагает открытую передачу логина и пароля, что легко перехватывается злоумышленником…. И чем же это не костыль? )))

    Reply
  20. soulner

    (20) Всё зависит от области применения. Данную конструкцию предполагается использовать внутри локальной сети или через VPN. Вероятность перехвата низка. К тому же, в моём случае, предполагается запрос с конкретного сервера 1С у конкретного сервера, где хранятся файлы с записями. Тут можно применить дополнительные меры защиты, сервера могут быть в своём физическом сегменте сети, например.

    Reply
  21. nytlenc

    (21)

    внутри локальной сети, вероятность перехвата низка

    Но она есть 🙂 значит это не есть решение. По крайней мере массовое.

    (21)

    применить дополнительные меры защиты

    Опять костыль )))

    Reply
  22. DenisCh

    А использование внешних компонент — так и вообще инвалидная коляска…

    Reply
  23. nytlenc

    (23) Да ладно? ))) Это почему же? Просто потому, что вы не умеете их готовить?

    Внешние компоненты как раз и есть инструмент который по человечески позволяет реализовать то. чего не предусмотрено платформой нативно….

    Reply
  24. DenisCh

    (24) Нативное скачивание файлов в платформе реализовано. Это просто кто-то не умеет енго сипользовать

    Reply
  25. nytlenc

    (25) вы ушли в дебри и отклонились от темы. Мы начали обсуждение не со скачивания файлов, а вот с того:

    Зачем их сохранять в 1С? Достаточно достать их из астера и все, к тем более у него есть табличка с Cdr обычно, где хранятся идентфикаторы звонков, через которые в свою очередь можно скачать файл звонка напрямую с АТС пользователю.

    и теперь расскажите что здесь наименьшее зло, вот это вот или внешняя компонента?

    Reply
  26. Dnki

    Благодаря упомянутой статье Олега (здоровья его лошадям!) я недавно сделал механизм создания звонка через команду «originate». Опыт использования 3-х месяцев показал: Все почти прекрасно (иногда наблюдается задержка).

    А вот со второй частью — прием входящих, дело обстоит хуже. Рекомендуется команда «WaitEvent».

    Я написал программку для исследования процесса, и был не обрадован.

    — главная проблема — 1С зависает на период ожидания запроса. Я в итоге ставил «Timeout=1»

    — событий приходит очень много. Как отсеять этот мусор на Asterisk-е я не знаю. На стороне 1С отбросить могу, но все это отнимает время.

    — информация приходит в теле ответа в виде многострочного текста. Следовательно, тратится ресурс на парсинг, включая и лишние сообщения (сам тип сообщения там-же).

    Так что, работаю в другом направлении.

    Автору — «Успехов!»

    Reply
  27. Dnki

    Обсуждалась передача звукового файла с Астериска.

    Зачем вообще скачивать?

    У нас Астериск записывает файлы в расшареную папку. А документ в 1С знает его имя.

    Для озвучивания файла подойдет КомандаСистемы, ЗапуститьПриложение

    Так и отыгрывается файл прямо с сетевого ресурса.

    Reply
  28. soulner

    (28) Можно и так. У меня в планах ещё и пережимать в mp3, но руки пока не дошли.

    Reply
  29. user986187

    Здравствуйте, интересует интеграция 1с с астериск.

    Reply
  30. user986187

    Как с вами связаться?

    wrofdt@ya.ru

    Reply

Leave a Comment

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