[Модуль] Telegram (telegram)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

ErmolenkoM
Сообщения: 560
Зарегистрирован: Ср сен 04, 2013 10:31 am
Откуда: Самара
Благодарил (а): 99 раз
Поблагодарили: 138 раз
Контактная информация:

Re: Модуль "Telegram"

Сообщение ErmolenkoM » Вт окт 18, 2016 11:01 pm

Уважаемый Eraser
А можно ткнуть носом чем заполнить это поле?
Webhook URL
aka msh555
Cubian на Cubietruck, Connect
Аватара пользователя
Eraser
Сообщения: 943
Зарегистрирован: Вт окт 21, 2014 7:31 pm
Откуда: Киров
Благодарил (а): 13 раз
Поблагодарили: 702 раза
Контактная информация:

Re: Модуль "Telegram"

Сообщение Eraser » Ср окт 19, 2016 8:51 am

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"
За это сообщение автора Eraser поблагодарил:
ErmolenkoM (Ср окт 19, 2016 1:57 pm)
Рейтинг: 1.23%
Connect ---- Telegram
Яндекс.Деньги для благодарностей за помощь: 410012076838296 или нажмите кнопку "Спасибо"!!! :D
skysilver
Сообщения: 2855
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 368 раз
Поблагодарили: 1647 раз
Контактная информация:

Re: Модуль "Telegram"

Сообщение skysilver » Ср окт 19, 2016 4:29 pm

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

P.S. Кажись, МТС устаканился. Теперь телеграм работает штатно.
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Аватара пользователя
Eraser
Сообщения: 943
Зарегистрирован: Вт окт 21, 2014 7:31 pm
Откуда: Киров
Благодарил (а): 13 раз
Поблагодарили: 702 раза
Контактная информация:

Re: Модуль "Telegram"

Сообщение Eraser » Ср окт 19, 2016 4:31 pm

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

P.S. Кажись, МТС устаканился. Теперь телеграм работает штатно.
да, можно цикл остановить, тем более теперь это легко сделать из XRAY
Connect ---- Telegram
Яндекс.Деньги для благодарностей за помощь: 410012076838296 или нажмите кнопку "Спасибо"!!! :D
ErmolenkoM
Сообщения: 560
Зарегистрирован: Ср сен 04, 2013 10:31 am
Откуда: Самара
Благодарил (а): 99 раз
Поблагодарили: 138 раз
Контактная информация:

Re: Модуль "Telegram"

Сообщение ErmolenkoM » Ср окт 19, 2016 6:45 pm

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] - включенный.
aka msh555
Cubian на Cubietruck, Connect
ErmolenkoM
Сообщения: 560
Зарегистрирован: Ср сен 04, 2013 10:31 am
Откуда: Самара
Благодарил (а): 99 раз
Поблагодарили: 138 раз
Контактная информация:

Re: Модуль "Telegram"

Сообщение ErmolenkoM » Ср окт 19, 2016 6:50 pm

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 прокси)
aka msh555
Cubian на Cubietruck, Connect
Руслан
Сообщения: 193
Зарегистрирован: Чт дек 17, 2015 10:08 am
Откуда: Уфа
Благодарил (а): 36 раз
Поблагодарили: 14 раз

Re: Модуль "Telegram"

Сообщение Руслан » Ср окт 19, 2016 7:12 pm

Eraser писал(а):Вот еще одно довольно интересное решение интерактивной клавиатуры:
Отлично работает! Спасибо!
Чуть заторможено, но все равно отлично.
Аватара пользователя
Eraser
Сообщения: 943
Зарегистрирован: Вт окт 21, 2014 7:31 pm
Откуда: Киров
Благодарил (а): 13 раз
Поблагодарили: 702 раза
Контактная информация:

Re: Модуль "Telegram"

Сообщение Eraser » Чт окт 20, 2016 3:29 pm

Добавил функцию 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); 
Connect ---- Telegram
Яндекс.Деньги для благодарностей за помощь: 410012076838296 или нажмите кнопку "Спасибо"!!! :D
ErmolenkoM
Сообщения: 560
Зарегистрирован: Ср сен 04, 2013 10:31 am
Откуда: Самара
Благодарил (а): 99 раз
Поблагодарили: 138 раз
Контактная информация:

Re: Модуль "Telegram"

Сообщение ErmolenkoM » Пт окт 21, 2016 10:20 am

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) Кто подскажет как?
aka msh555
Cubian на Cubietruck, Connect
Аватара пользователя
Eraser
Сообщения: 943
Зарегистрирован: Вт окт 21, 2014 7:31 pm
Откуда: Киров
Благодарил (а): 13 раз
Поблагодарили: 702 раза
Контактная информация:

Re: Модуль "Telegram"

Сообщение Eraser » Пт окт 21, 2016 10:47 am

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)
{ 
Вопрос Сергею задал, как бы это автоматизировать и делать при установке модулей, т.к. при обновлении данное изменение затрет.
Connect ---- Telegram
Яндекс.Деньги для благодарностей за помощь: 410012076838296 или нажмите кнопку "Спасибо"!!! :D
Ответить