1С и Telegram. Об опыте использования прокси-серверов




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

26 Comments

  1. user634257_mryzhov

    Решение красивое.

    Не решились использовать в продакшене стороние прокси серверы — в плане безопасности сомнительное решение

    Переход на slack оказался проще и логичнее.

    Reply
  2. sound

    Хороший первый пост. С почином 🙂

    Reply
  3. Infactum

    Свой прокси сервер не стоит практически ничего даже для физлиц. А ещё более правильно было бы настроить прозрачную маршрутизацию на роутере. Любит народ костыли городить

    Reply
  4. saa@kuzov.org

    (1)

    slack

    Поделитесь, пожалуйста, подробностями?

    1) Есть ли апи в бесплатной версии?

    2) Если платная, то как платите с расчетного счета?

    3) Встречали ли примеры интеграции с 1С в открытом доступе?

    Reply
  5. saa@kuzov.org

    (3) Дроплет на DO от 5 баксов в месяц. Дальше настроить не проблема.

    Проблема только в том, что с расчетного счета компании не оплатить никак.

    А что значит «настроить прозрачную маршрутизацию на роутере»? Куда кого маршрутизировать?

    У меня телеграмм на компе и на мобилке.

    На мобилке я ничего маршрутизировать не могу. Могу VPN настроить. Но тогда обязательной становится блокировка экрана паролем, а это неудобно.

    Поделитесь, пожалуйста, мудростью. Можно даже в личку. Спасибо!

    Reply
  6. Infactum

    (5) Поднять VPN на роутере. Трафик на нужные подсети/адреса заворачивать туда.

    Довольно очевидное решение. Любой админ настроит легко.

    Ну и 5$ за DO это перебор, если требуется только к api телеграма доступ получить.

    Reply
  7. 🅵🅾️🆇

    А в чем проблема купить на aruba.it VPS сервер за 1$/мес и спокойно использовать его как прокси самому, раздать друзьям и попутно еще и всякие свои проектики на нем вести? Веб сервер поднять, опять же.

    Вот что по ресурсам и нагрузке на чуть более дорогом хостинге в нидерландах (каком — не скажу).

    На нем поднят веб-сервер, openvpn и сидит около 30 людей с проксей.

    Reply
  8. user634257_mryzhov

    (4)

    1. Есть, все бесплатно

    3. Интеграция

     ssl = Новый ЗащищенноеСоединениеOpenSSL(неопределено,Новый СертификатыУдостоверяющихЦентровWindows());
    ЗаголовкиHTTP=Новый Соответствие();
    ЗаголовкиHTTP.Вставить(«Content-Type»,»Content-Type: application/json»);
    HTTPСоединение = Новый HTTPСоединение(«hooks.slack.com»,443,,,,,ssl,);
    HTTPЗапрос = Новый HTTPЗапрос(webhook) ;
    ТелоЗапроса=»{«»text»»: «»»+text+»»»}»;
    HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса,КодировкаТекста.UTF8,ИспользованиеByteOrderMark.НеИспользовать);
    HTTPОтвет=HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    
    

    Показать

    webhook — токен из слака

    text — текст сообщения

    Reply
  9. Infactum

    (8) JSON через конкатенацию строк, без экранирования. Норм интеграция.

    Reply
  10. altmf

    (3) Свой прокси-сервер, безусловно, тоже является решением. Однако не могу не поинтересоваться, а в чем же описанное мной решение является костылем с точки зрения практики программирования? Статья ведь в этой рубрике размещена =)

    Reply
  11. altmf

    (7) Да в общем-то такой проблемы и нет, но как я уже заметил выше в статье раскрывается аспект повышения надежности использования прокси с точки зрения программирования и программиста, потому и размещена статья в соответствующей рубрике.

    Ну и если говорить о собственном прокси, то нельзя ведь не заметить, что и он наверняка может подпасть под блокировку или стать неприемлемо медленным. Или вы по каким-то другим причинам не делитесь с нами тем самым хостингом в Нидерландах? =)

    Reply
  12. altmf

    (2)Спасибо!

    Reply
  13. Infactum

    (10) Если речь идет о коде ради кода — то сойдет.

    Но программист (не просто кодер!) должен сначала обдумать варианты решения и выбрать оптимальный. Потом уже писать что-то.

    Reply
  14. altmf

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

    Reply
  15. 🅵🅾️🆇

    (11) Не хочу чтоб подумали, что рекламирую.

    Хостинг как хостинг, я про него вообще не слышал, за 230 руб/мес то что вы видите на скриншоте.

    Если есть интерес или вопросы по поднятию — в личку.

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

    Но собственно как подключитесь putty — Вам уже, по идее, все равно. Чешский лагал, кстати, а итальянский и остальные (по отзывам) себя хорошо показывали за такую цену. Трафика там — 2 ТБ/мес, если не ошибаюсь.

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

    Заблокируют — да боже, сменю хостинг. Заблокируют весь интернет — смысл пребывания в этой стране из близкого к нулю — станет отрицательным и сменю не хостинг, а страну.

    PS: а, черт с ним, вот адрес моих проксей: http://185.246.152.100/ (через who is сами найдете)

    PPS: если что, свои прокся можно скидывать юзверам в таком виде: https://t.me/socks?server=YOUR_IP&port=YOUR_PORT&user=YOUR_LOGIN&pass=YOUR_PASS­WORD (по клику они автоматически подключатся в телеге)

    Reply
  16. altmf

    (15)Информация о хостингах интересная =)

    Reply
  17. PLAstic

    Фразы, подразумевающие гениальность идеи несколько раз встречаются в тексте статьи.

    Давай разовьём её реальную полезность…

    1) Почему доступность прокси определяется на боевой отправке? Зачем вы попусту тратите время доставки боевых сообщений?

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

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

    Ну и вообще, я бы рекомендовал не париться с проксями, а арендовать за 1200 руб/мес виртуалку в одной из западных республик, повесить на неё вебхук и наслаждаться моментальным общением с ботами.

    Reply
  18. altmf

    (17)

    Фразы, подразумевающие гениальность идеи несколько раз встречаются в тексте статьи.

    О гениальности речи нет, но если у вас есть предложения по приданию статье более сдержанной, на ваш взгляд, стилистики, то готов обсудить их в личке.

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

    2. Это тоже интересная идея, но как я сказал выше, устроил даже весьма топорный вариант.

    Reply
  19. pablo_escobar

    Попробовал общаться с ботом через прокси(нашел бесплатный попробовать), не работает пишет

    Ошибка работы с Интернет: Ошибка инициализации SSL-соединения

    , такую же ошибку выдает если без прокси пробовать, то есть блокирует провайдер. Включил впн все работает с этим прокси, да и через приложение на телефоне с ним работает. Прокси должен обладать какими то характеристиками чтобы провайдер не блокировал запросы? Пробовал на этом

    ИнтернетПрокси.Установить(«https», «socks5://93.88.75.208», 1080, , , Ложь);
    Reply
  20. Yashazz

    (9) Ну ладно ворчать-то. Ну бывает. Все мы порой не брезгуем хмл или джейсон как строку колбасить, иногда это очевидно проще)

    Reply
  21. Vainemeinen

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

    Так вот, в первую неделю все было замечательно, но потом абсолютно все свободные прокси оказались в бане — похоже РКН также пасет все свободные прокси и прикрывает их.

    Reply
  22. altmf

    (21)По поводу бана прокси-серверов РКН я, если честно, ожидал, что прокси будут баниться с завидным постоянством, однако нет, большая часть прокси, используемых в июне,жива до сих пор. Возможно это связано с тем, что к тому моменту активность РКН несколько снизилась.

    Reply
  23. uno-c

    Можно использовать Tor-browser. Ставите тор-браузер, запускаете — и в системе появляется локальный socks5 прокси, использующий сеть тор. Работает хорошо.

    Reply
  24. 🅵🅾️🆇

    Просто оставлю это тут

    https://gist.github.com/PlugFox/5f62e43c56941e4c5a244de2422ee7f8

    Пример отправки сообщений и файлов в телеграм (даже без задействования жесткого диска)

    Reply
  25. Diversus

    Спасибо за труд, но мне кажется есть проблема с тем, что:

    1. Регистр сведений СтатистикаОтправкиСообщенийВМессенджер имеет периодичность Секунда и если будет несколько запросов на отправку в секунду, то запись помещаться никуда не будет.

    2. Нет преобразования GET-параметра text в формат URL.

    Reply
  26. Diversus

    (0) Есть еще один тонкий момент. Есть два типа прокси SOCK5 и HTTPS. И в зависимости от типа прокси нужны разные варианты указания строки подключения. Причем в вашем случае вы по коду используете ТОЛЬКО HTTPS-прокси.

    Вот мой вариант функции ПолучитьHTTPСоединениеСПрокси:

    Функция ПолучитьHTTPСоединениеСПрокси(АдресСервера, Порт, Прокси) Экспорт
    
    Таймаут = Константы.TelegramTimeoutПодключений.Получить();
    Если Таймаут = 0 Тогда
    Таймаут = 30;
    КонецЕсли;
    
    Если Прокси = Неопределено Тогда
    Соединение = Новый HTTPСоединение(АдресСервера, Порт,,,,Таймаут,
    Новый ЗащищенноеСоединениеOpenSSL());
    Иначе
    ИнтернетПрокси = Новый ИнтернетПрокси(Ложь);
    
    АдресПрокси = СокрЛП(Прокси.Сервер);
    Если Прокси.Протокол = Перечисления.TelegramПроксиПротоколы.SOCKS5 Тогда
    АдресПрокси = «socks5://» + АдресПрокси;
    КонецЕсли;
    ИнтернетПрокси.Установить(«https», АдресПрокси, Прокси.Порт,
    СокрЛП(Прокси.Пользователь), СокрЛП(Прокси.Пароль), Ложь);
    
    Соединение  =  Новый HTTPСоединение(АдресСервера, Порт,,,ИнтернетПрокси,Таймаут,
    Новый ЗащищенноеСоединениеOpenSSL());
    КонецЕсли;
    
    Возврат Соединение;
    
    КонецФункции

    Показать

    Я думаю по коду примерно понятно что к чему.

    Reply

Leave a Comment

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