Страница 33 из 191

Re: Модуль "Telegram"

Добавлено: Вт окт 18, 2016 11:01 pm
ErmolenkoM
Уважаемый Eraser
А можно ткнуть носом чем заполнить это поле?
Webhook URL

Re: Модуль "Telegram"

Добавлено: Ср окт 19, 2016 8:51 am
Eraser
Webhook в Telegram

Для чего?
Для того что бы исключить постоянный опрос серверов на наличие новых сообщений. Сервера Telegram сами уведомят о поступлении нового сообщения.

Как включить?
1. Ваш сервер должен быть доступен из интернет, а именно страница https://ваш_сервер/webhook_telegram.php
доступ к файлу webhook_telegram.php не должен иметь авторизацию, вот часть конфига nginx
СпойлерПоказать

Код: Выделить всё

   location / {
          rewrite pda$ /popup/pda.html redirect;
          rewrite ^/api/ /api.php;

              if (!-e $request_filename){
              rewrite ^(.*)$ /nf.php;
              }
    auth_basic "Enter password!";
    auth_basic_user_file /etc/nginx/.htpass;



    }
    location /config.php {
          deny all;
    }
    location /gps.php {
          auth_basic off;
          allow all;
    }

    location /webhook_telegram.php {
          auth_basic off;
          allow all;
    }
2. Доступен именно по протоколу HTTPS с подписанным сертификатом
(бесплатный сертификат можно установить с помощью sertbot)
3. В поле Webhook URL задается имя вашего сервера или ip без https://
4. Нажатием кнопки "Set Webhook" отправляется запрос на установку вашего адреса для webhook. Результат отобразится ниже кнопки.
(отображается не всегда почему то, но работает)

Плюсы
1. Быстрый ответ на команду
2. Нет постоянных запросов на наличие новых сообщений

Минусы
1. Нужен HTTPS с подписанным сертификатом
2. При подписке на webhook перестает работать запрос сообщений с сервера. Поэтому прежде чем снять галочку "Use webhook" обязательно надо отписаться от webhook. Для этого надо нажать кнопку "Clean webhook".
3. При долгой обработке сообщения, сервер телеграмм будет повторно высылать вам это сообщение.

PS Текущий статус использования webhook можно узнать нажав кнопку "Status webhook"

Re: Модуль "Telegram"

Добавлено: Ср окт 19, 2016 4:29 pm
skysilver
Eraser писал(а):Для того что бы исключить постоянный опрос серверов на наличие новых сообщений. Сервера Telegram сами уведомят о поступлении нового сообщения.
Это означает, что отпадает необходимость в запущенном цикле cycle_telegram.php? Или нет?

P.S. Кажись, МТС устаканился. Теперь телеграм работает штатно.

Re: Модуль "Telegram"

Добавлено: Ср окт 19, 2016 4:31 pm
Eraser
skysilver писал(а):
Eraser писал(а):Для того что бы исключить постоянный опрос серверов на наличие новых сообщений. Сервера Telegram сами уведомят о поступлении нового сообщения.
Это означает, что отпадает необходимость в запущенном цикле cycle_telegram.php? Или нет?

P.S. Кажись, МТС устаканился. Теперь телеграм работает штатно.
да, можно цикл остановить, тем более теперь это легко сделать из XRAY

Re: Модуль "Telegram"

Добавлено: Ср окт 19, 2016 6:45 pm
ErmolenkoM
Eraser писал(а):Вот еще одно довольно интересное решение интерактивной клавиатуры:
СпойлерПоказать
1) Создается команда "Свет" с кодом

Код: Выделить всё

$off = json_decode('"'.'\ud83c\udf11'.'"');
$on = json_decode('"'.'\uD83C\uDF15'.'"');
 $ks = $off;
 $ts = $off;
 if (gg("kitchenLed.on") == 1)
    $ks = $on;
 if (gg("Relay1.status") == 1)
   $ts = $on;
$option = array( array($this->buildInlineKeyboardButton($text=$ks."Кухня","","Callback_kitchenLed",""),
                       $this->buildInlineKeyboardButton($text=$ts."Торшер","","Callback_Relay1","") ) );
$keyb = $this->buildInlineKeyBoard($option);
$content = array('chat_id' => $chat_id, 'text' => "Управление светом:", 'reply_markup' => $keyb);
$this->sendContent($content);
2) Создается событие "Callback_light" на "Callback" с кодом

Код: Выделить всё

$sw = false;
if ($callback == 'Callback_kitchenLed')
{
 $sw = true;
 cm("kitchenLed.switch");
}
if ($callback == 'Callback_Relay1')
{
 $sw = true;
 cm("Relay1.switch");
}
if ($sw)
{
 $off = json_decode('"'.'\ud83c\udf11'.'"');
 $on = json_decode('"'.'\uD83C\uDF15'.'"');
 $ks = $off;
 $ts = $off;
 if (gg("kitchenLed.on") == 1)
    $ks = $on;
 if (gg("Relay1.status") == 1)
   $ts = $on;
 $option = array( array($this->buildInlineKeyboardButton($text=$ks."Кухня","","Callback_kitchenLed",""),
                       $this->buildInlineKeyboardButton($text=$ts."Торшер","","Callback_Relay1","") ) );
 $keyb = $this->buildInlineKeyBoard($option);
 $this->editMessage($chat_id,$message_id,"Управление светом:",$keyb);
}
В результате будет клавиатура на которой будет отображаться текущий статус, при нажатии на кнопки будет выполняться действие и изменяться статус
Можно чуть-чуть причесать код массивами, получается компактнее, но возможно, менее понятно:

Код: Выделить всё

$light = array(json_decode('"'.'\ud83c\udf11'.'"'),json_decode('"'.'\uD83C\uDF15'.'"'));
$option = array( array($this->buildInlineKeyboardButton($text=$light[gg('NooLiteD_KuhnyaTop.status')]."Кухня","","Callback_KuhnyaTop",""),
                       $this->buildInlineKeyboardButton($text=$light[gg('NooLiteD_ZalTop.status')]."Торшер","","Callback_ZalTop","") ) );
$keyb = $this->buildInlineKeyBoard($option);
$content = array('chat_id' => $chat_id, 'text' => "Управление светом:", 'reply_markup' => $keyb);
$this->sendContent($content);
пояснение:
gg('NooLiteD_KuhnyaTop.status') принимает значения 0 или 1.
$light[0] - выключенный эмоджи, $light[1] - включенный.

Re: Модуль "Telegram"

Добавлено: Ср окт 19, 2016 6:50 pm
ErmolenkoM
Eraser писал(а):Webhook в Telegram
СпойлерПоказать
Для чего?
Для того что бы исключить постоянный опрос серверов на наличие новых сообщений. Сервера Telegram сами уведомят о поступлении нового сообщения.

Как включить?
1. Ваш сервер должен быть доступен из интернет, а именно страница https://ваш_сервер/webhook_telegram.php
2. Доступен именно по протоколу HTTPS с подписанным сертификатом
3. В поле Webhook URL задается имя вашего сервера или ip без https://
4. Нажатием кнопки "Set Webhook" отправляется запрос на установку вашего адреса для webhook. Результат отобразится ниже кнопки.

Плюсы
1. Быстрый ответ на команду
2. Нет постоянных запросов на наличие новых сообщений

Минусы
1. Нужен HTTPS с подписанным сертификатом
2. При подписке на webhook перестает работать запрос сообщений с сервера. Поэтому прежде чем снять галочку "Use webhook" обязательно надо отписаться от webhook. Для этого надо нажать кнопку "Clean webhook".
3. При долгой обработке сообщения, сервер телеграмм будет повторно высылать вам это сообщение.

PS Текущий статус использования webhook можно узнать нажав кнопку "Status webhook"
если кто забыл, настройка HTTPS под linux описана в ВиКи в пункте Настройка HTTPS (Через nginx прокси)

Re: Модуль "Telegram"

Добавлено: Ср окт 19, 2016 7:12 pm
Руслан
Eraser писал(а):Вот еще одно довольно интересное решение интерактивной клавиатуры:
Отлично работает! Спасибо!
Чуть заторможено, но все равно отлично.

Re: Модуль "Telegram"

Добавлено: Чт окт 20, 2016 3:29 pm
Eraser
Добавил функцию sendAction($chat_id,$action)
Применяется для отображения что на стороне бота выполняется какое-то действие (для долгих команд)

$action
  • typing
  • upload_photo
  • record_video or upload_video
  • record_audio or upload_audio
  • upload_document
  • find_location

Код: Выделить всё

include_once(DIR_MODULES . 'telegram/telegram.class.php');
$telegram_module = new telegram();
$telegram_module->sendAction($chat_id,"typing");
///
...........
///
$telegram_module->sendMessage($chat_id,$message); 

Re: Модуль "Telegram"

Добавлено: Пт окт 21, 2016 10:20 am
ErmolenkoM
Eraser писал(а):Webhook в Telegram
СпойлерПоказать
Для чего?
Для того что бы исключить постоянный опрос серверов на наличие новых сообщений. Сервера Telegram сами уведомят о поступлении нового сообщения.

Как включить?
1. Ваш сервер должен быть доступен из интернет, а именно страница https://ваш_сервер/webhook_telegram.php
2. Доступен именно по протоколу HTTPS с подписанным сертификатом
3. В поле Webhook URL задается имя вашего сервера или ip без https://
4. Нажатием кнопки "Set Webhook" отправляется запрос на установку вашего адреса для webhook. Результат отобразится ниже кнопки.

Плюсы
1. Быстрый ответ на команду
2. Нет постоянных запросов на наличие новых сообщений

Минусы
1. Нужен HTTPS с подписанным сертификатом
2. При подписке на webhook перестает работать запрос сообщений с сервера. Поэтому прежде чем снять галочку "Use webhook" обязательно надо отписаться от webhook. Для этого надо нажать кнопку "Clean webhook".
3. При долгой обработке сообщения, сервер телеграмм будет повторно высылать вам это сообщение.

PS Текущий статус использования webhook можно узнать нажав кнопку "Status webhook"
Мне удалось запустить ЭТО!
Грабли, с которыми я столкнулся:
1. Нужно поднять HTTPS, вроде по инструкции ВиКи все сделал, но при создании самоподписанного сертификата не заполнил поле CN. Заполнение этого поля обязательно.
2. Заполнил CN IpАдресом. Оказывается с 01.10.2016 такие сертификаты не действительны. Только ДОМЕНное имя. Зарегался на DynDNS, указал его.
3. Для проверки self signed certificate телеграмму нужно отправить PEM файл, поправил бота вот тут:
telegram.class.php

Код: Выделить всё

     $webhookRes = $telegramBot->setWebhook($this->config['TLG_WEBHOOK_URL']."/webhook_telegram.php", "@/etc/nginx/ssl/cert.pem");
...
     $webhookRes = $telegramBot->setWebhook($this->config['TLG_WEBHOOK_URL']."/webhook_telegram.php", "@/etc/nginx/ssl/cert.pem");
комментарий: знак СОБАКИ нужен, так как у меня PHP 5.4; прописал жестко, а надо бы вынести в настройку модуля.
4. Файл webhook_telegram.php нужно бы добавить в исключения, что бы пароль не спрашивало (так сделано GPS.PHP) Кто подскажет как?

Re: Модуль "Telegram"

Добавлено: Пт окт 21, 2016 10:47 am
Eraser
ErmolenkoM писал(а): Мне удалось запустить ЭТО!
Грабли, с которыми я столкнулся:
1. Нужно поднять HTTPS, вроде по инструкции ВиКи все сделал, но при создании самоподписанного сертификата не заполнил поле CN. Заполнение этого поля обязательно.
2. Заполнил CN IpАдресом. Оказывается с 01.10.2016 такие сертификаты не действительны. Только ДОМЕНное имя. Зарегался на DynDNS, указал его.
3. Для проверки self signed certificate телеграмму нужно отправить PEM файл, поправил бота вот тут:
telegram.class.php

Код: Выделить всё

     $webhookRes = $telegramBot->setWebhook($this->config['TLG_WEBHOOK_URL']."/webhook_telegram.php", "@/etc/nginx/ssl/cert.pem");
...
     $webhookRes = $telegramBot->setWebhook($this->config['TLG_WEBHOOK_URL']."/webhook_telegram.php", "@/etc/nginx/ssl/cert.pem");
 
комментарий: знак СОБАКИ нужен, так как у меня PHP 5.4; прописал жестко, а надо бы вынести в настройку модуля.
4. Файл webhook_telegram.php нужно бы добавить в исключения, что бы пароль не спрашивало (так сделано GPS.PHP) Кто подскажет как?
1,2,3 у меня проблем не возникло, я получал сертификат на WoSign

Настройку для самоподписанных сертификатов я добавлю

4. Я добавлял исключения в lib/general.class.php.

Код: Выделить всё

if (defined('HOME_NETWORK') && HOME_NETWORK != '' && !isset($argv[0])
    && (!(preg_match('/\/gps\.php/is', $_SERVER['REQUEST_URI'])
       || preg_match('/\/trackme\.php/is', $_SERVER['REQUEST_URI'])
       || preg_match('/\/btraced\.php/is', $_SERVER['REQUEST_URI']))
       || $_REQUEST['op'] != '')
    && !preg_match('/\/webhook_telegram\.php/is', $_SERVER['REQUEST_URI'])
    && !preg_match('/\/rss\.php/is', $_SERVER['REQUEST_URI'])
    && 1)
{ 
Вопрос Сергею задал, как бы это автоматизировать и делать при установке модулей, т.к. при обновлении данное изменение затрет.