Отправка сообщений в Skype через Microsoft Bot Framework API




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

43 Comments

  1. kuzyara
  2. rpgshnik

    Полезная информация, нужно будет применить на практике.

    Reply
  3. 🅵🅾️🆇

    (2) Полезно все, кроме, собственно, самого скайпа)

    Он ушел вслед за ICQ.

    Reply
  4. pallid

    Отлично, все времени не было начать разбираться с апи, а тут вот уже заготовочка

    Reply
  5. rpgshnik

    (3) да ну, в компании активно используется. Видео звонки только через него.

    Reply
  6. CSiER

    (3) для частных лиц возможно, но в корпоративном секторе скайп теперь заменяет Microsoft Lync.

    Reply
  7. 1c_nik923

    Что-то, я не заметил нормальную замену скайпу, так что говорить что он ушел в след за ICQ, может вы из 3-тысячного. Автору однозначно + за работу!

    Reply
  8. Fil15

    Вот одного не понял: Пишем в скайпе из группы (айди которой хотим получить) сообщение боту вида «@botname test», где botname — имя созданного бота

    Это куда? В скайпе из группы пишу, но чет ничего не происходит…. Пояните, мож чего не понял.

    Reply
  9. Fil15

    Все, разобрался! Спасибо!

    Reply
  10. GreenDragon

    Удивительно. Думал, что api скайпа умерло года 3 назад. Однако же…

    P.S.

    (7) JSON читается как «джейсон». JSON (англ. JavaScript Object Notation, обычно произносится как /ˈdʒeɪsən/ JAY-sən)

    А то как вы написали в статье «джисон» должно было бы писаться как — «GSON».

    Reply
  11. GreenDragon

    (7) как софт для проведения видеоконференций — может соглашусь. Но только не как текстовый клиент (а его как таковой используют 90% времени, что ужасно).

    Reply
  12. sdf1979

    В конфигурации «Центр Контроля Качества» присутствует возможность отправлять сообщения в скайп, используя rest api.Код в общем модуле «СкайпБот».

    Reply
  13. kuzyara

    (12) действительно, есть такое в составе КИП

    Reply
  14. e][tend

    Коллега, разрешите поинтересоваться, что за ссылки у вас скрываются в папке «Убийцы 1С» в браузере? 🙂

    Reply
  15. zuxelzz

    (1) Привет, пробую сейчас настроить бота, в списке ботов у моего постоянно висит предупреждение:

    «Bots requiring migration to Azure Bot Service must migrate now to avoid service interruption»

    Надо ли делать миграцию или без этого будет работать?

    По самой работе — токен получаю, пытаюсь отправить сообщение, но получаю ответ:

    {

    «error»: {

    «code»: «BadArgument»,

    «message»: «Unauthenticated»

    }

    }

    может кто сталкивался с этим — в чем дело может быть?

    Reply
  16. kuzyara

    (16) Такое предупреждение у всех — это ненавязчивая реклама ажуры)

    А при создании пароля («секрета приложения») в низу страницы настроек не забыть нажать «Сохранить».

    Reply
  17. zuxelzz

    (9) привет, подскажи, как бота в группу добавил? пытаюсь добавить своего — ни через людей, ни через ботов его не находит

    Reply
  18. zuxelzz

    (17) понял, осталось понять, как добавить бота в нужную группу — подскажешь? =)

    Reply
  19. zuxelzz

    все, разобрался, спасибо автору за помощь)

    Reply
  20. Romeooo

    «Как получить ID беседы (группы, контакта)?» — может кому пригодится:

    просто берем ник пользователя Skype и обрабатываем следующим образом:

    Если СтрНайти(Контакт, «:») = 0 Тогда

    Контакт = «8:» + Контакт;

    ИначеЕсли СтрНачинаетсяС(Контакт, «live:») Тогда

    Контакт = «8:» + Контакт;

    КонецЕсли;

    И переменную Контакт передаем как ИД беседы.

    Авторство не мое, нашел в типовых.

    Reply
  21. VictorRGB2

    (9)

    (18)

    коллеги, подскажите, как добавить бота в группу скайпа?

    Reply
  22. zuxelzz

    (22) тыкай в саму группу — там где видно список пользователей в группе и там где-то должен быть пункт «Добавить бота». Я точно не помню, как добавлял — возможно, его просто как пользователя можно добавить.

    Reply
  23. kuzyara
  24. VictorRGB2

    (24) спасибо за видео

    все делал, как продемонстрировано, однако бота смог добавить в группу только после дважды перезапущеного скайпа

    Reply
  25. Артано

    (21) индусы уже в 1с

    Reply
  26. VictorRGB2

    а реально ли помощью этого бота отправить файл, например *.xls в чат?

    что-то не нашел в документации такой возможности, возможно плохо искал..

    Reply
  27. EliasShy

    К знатокам — есть ли возможность подобное реализовать для Lync (Skype для бизнеса) ?

    Reply
  28. Dwiss

    Спасибо автору, все работает.

    Вопрос как принимать сообщения от бота в 1с

    Reply
  29. Dwiss

    https://smba.trafficmanager.net/apis/v3/conversations/29:17JfhPrVvvL9eB8POwFvymrq8HJdLYyuLcoCziguNUdY/activities

    {«message»: «Запрашиваемый ресурс не поддерживает http-метод» GET «.»}

    Reply
  30. Dwiss
    {
    «текст»: «проверил»,
    «type»: «message»,
    «метка времени»: «2019-06-03T07: 59: 09.428Z»,
    «id»: «1559548749423»,
    «channelId»: «skype»,
    «serviceUrl»: «https://smba.trafficmanager.net/apis/»,
    «от»: {
    «id»: «29: 17J………………………………………………………….dY»,
    «имя»: «Дмитрий Алексеевич»
    },
    «разговор»: {
    «id»: «29: 17J…………………………………………………………..dY»
    },
    «получатель»: {
    «id»: «28: 2d………………………………………..270»,
    «имя»: «virtex_bot»
    },
    «лица»: [
    {
    «locale»: «ru-RU»,
    «страна»: «RU»,
    «платформа»: «Windows»,
    «часовой пояс»: «Азия / Эр-Рияд»,
    «type»: «clientInfo»
    }
    ],
    «channelData»: {
    «текст»: «проверил»
    },
    «locale»: «ru-RU»
    }

    Показать

    Reply
  31. Dwiss

    на вебхуке видно ответ боту, но как его получить в 1С???

    Reply
  32. kuzyara

    (33) свой http-сервис 1с сделать надо

    Reply
  33. Dwiss

    т.е. конечная точка должна быть свой http-сервис 1с?

    а как в телеге не получится?

    //Прочитать сообщение пользователя
    Процедура ПрочитатьСообщенияПользователя() Экспорт
    СтруктураНастроек = ПолучитьНастройкиTelegram();
    
    //Установим соединение
    Источник = «bot» + СтруктураНастроек.token + «/getUpdates»;
    HTTPСоединение  =  Новый HTTPСоединение(СтруктураНастроек.api,443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
    HTTPЗапрос = Новый HTTPЗапрос(Источник);
    HTTPЗапрос.Заголовки.Вставить(«Content-type», «application/json»);
    HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
    
    Если HTTPОтвет.КодСостояния = 200 Тогда
    Данные = ДесериализоватьJSON(HTTPОтвет.ПолучитьТелоКакСтроку());
    Если Данные.ok И Данные.result.Количество()>0 Тогда
    //Запишем историю сообщений
    
    Для каждого СтрокаМассива Из Данные.result  Цикл
    СообщениеID = СтрокаМассива.update_id;
    Если ПроверитьНаличиеСообщенияПоID(СообщениеID) Тогда
    Продолжить;
    КонецЕсли;
    Если СтрокаМассива.Свойство(«message») Тогда
    Команда = ВернутьКомандуTelegram(СтрокаМассива.message.text);
    ЗаписатьИсториюСообщений(СтрокаМассива.message,СообщениеID,Команда);
    ОбработатьОтветПользователя(Команда,СтруктураНастроек,СтрокаМассива.message,СообщениеID);
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры
    

    Показать

    Reply
  34. kuzyara

    (35) да

    не получится

    Reply
  35. Dwiss

    (36) а пример есть сервиса ?

    Reply
  36. user1034316

    Спасибо Автору за идею и код. Все работает просто отлично.

    При генерации ключей учтите, что если в ключе будут «+/», то работать не будет.

    Видео немного устарело, сейчас айди приложения и ключи делаются немного по другому, в Microsoft Azure.

    Reply
  37. ivan.kh

    Сделал вроде бы все по инструкции, но при попытке отправить сообщение в чат — получаю ошибку 401AADSTS7000215: Invalid client secret is provided.

    Пароль пытался удалить и заново создать, но результат не изменился.

    Reply
  38. user981782

    (39) Токен берется с другого адреса я так поняла. webchat.botframework.com с заголовком авторизации

    HTTPСоединение = Новый HTTPСоединение(«webchat.botframework.com», Неопределено, Неопределено, Неопределено, Неопределено, 120, Новый ЗащищенноеСоединениеOpenSSL);
    
    ЗаголовкиHTTP = Новый Соответствие;
    ЗаголовкиHTTP.Вставить(«Authorization», «BotConnector «+Пароль);
    
    HTTPЗапрос = Новый HTTPЗапрос(«/api/tokens», ЗаголовкиHTTP);
    
    HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод(«GET», HTTPЗапрос);
    
    HTTPОтветТело = HTTPОтвет.ПолучитьТелоКакСтроку();
    

    Показать

    Токен получает, но вот при отправке сообщения пишет «Authorization has been denied for this request»

    Reply
  39. portal80

    Да блин! Как добавить BOTa в существующую группу?

    Reply
  40. user1108198

    спасибо за статью! вроде все делаю правильно, но когда вставляю данные в 1Ску, вылетает такое сообщение

    http://prntscr.com/q4cpse

    Reply
  41. Babylka

    (37) Создаете HTTP-сервис, в нем описываете функцию POST. Все, что будет прилетать боту, будет в теле запроса. Далее по стандартной схеме: разбор тела запроса и запись сообщения с базу.

    Reply
  42. Babylka

    Спасибо автору за идею.

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

    В документации отправка мультимедиа здесь https://docs.microsoft.com/ru-ru/azure/bot-service/dotnet/bot-builder-dotnet-add-media-attachments?view=azure-bot-service-3.0

    Никто не сталкивался?

    Reply

Leave a Comment

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