skysilver писал(а):Webhook классная тема, но выставлять сервер наружу только ради этого идея, так скажем, не очень.
Есть ли какой-то вариант, например, перенести https://ваш_сервер/webhook_telegram.php на другой порт, чтобы на роутере разрешить проброс порта исключительно для бота?! Основная веб-морда MjD при этом останется доступной только в локальной сети. Такой принцип реализован в IOBroker.
Сам спросил, сам отвечаю. ))
Решил для себя эту задачу следующим образом.
1. Поднял виртуальный сервер Apache на https с самоподписанным сертифкатом.
Конфиг такой:
Код: Выделить всё
<IfModule mod_ssl.c>
<VirtualHost ЛОКАЛЬНЫЙ_ИП_СЕРВЕРА:443>
ServerAdmin почта@админа.ru
ServerName ИМЯ.no-ip.org
DocumentRoot /var/www/tgwebhook
<Directory /var/www/tgwebhook>
Options FollowSymLinks MultiViews
AllowOverride None
Order deny,allow
deny from all
allow from 149.154.167.192/26
allow from ИП_ЛОКАЛЬНОЙ_СЕТИ/24
</Directory>
LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error.tgwebhook.log
CustomLog ${APACHE_LOG_DIR}/access.tgwebhook.log combined
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/mysert.crt
SSLCertificateKeyFile /etc/apache2/ssl/mysert.key
</VirtualHost>
</IfModule>
2. В настройках виртуального сервера разрешил доступ к сайту только с IP адресов серверов телеграма (на сегодняшний день это 149.154.167.192/26, позже возможно будут меняться) и своей домашней сети.
3. В корневой директории виртуального сервера (/var/www/tgwebhook) создал папку с именем токена моего бота. В качестве имени папки можно использовать любую другую последовательность символов, известную только вам. Это для усложнения поиска пути к скрипту. Такой вариант рекомендуется самим телеграмом наряду с ограничением доступа с определенных IP.
4. В директорию поместил файл webhook_telegram.php с таким содержанием:
Код: Выделить всё
<?php
$content = file_get_contents("php://input");
$update = json_decode($content, TRUE);
$data_string = json_encode($update);
$ch = curl_init('http://127.0.0.1:80/webhook_telegram.php');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string))
);
curl_exec($ch);
?>
Т.е. принимаем сообщение от сервера телеграма и сразу отправляем его в POST-запросе вебхук-скрипту приложения.
Не забываем выставить права и владельца www-data на директории и файл.
5. На роутере настроил проброс порта 8443 на 443. В МЭ роутера разрешил доступ только с серверов телеграма, чтобы у всяких ботнетов не было желания сканить мой веб-сервер (хоть он и пустой по сути).
6. Вручную зарегистрировал вебхук со ссылкой вида https://ИМЯ.no-ip.org:8443/ТОКЕН_БОТА/webhook_telegram.php. Через приложение не получится, т.к. оно не поддерживает указание своего каталога для вебхук-скрипта.
7. Остановил и убрал из загрузки цикл телеграмма в MJD.
8. Профит!
В итоге обошлось без Nginx или mod_proxy Apache в качестве прокси, и без выставления наружу MJD.
Возможно, увеличилось время отклика из-за того, что сервер телеграмма дергает не сразу вебхук-скрипт приложения, а идет через "посредника" на другом виртуальном сервере. Но визуально все работает довольно быстро.
Пожелание к
Eraser - добавить возможность указания своего каталога для размещения вебхук-скрипта.
P.S.: да, временами мой внутренний параноик на профессиональной почве на дает мне спать ночами.
