Re: Модуль "Telegram"
Добавлено: Вт окт 18, 2016 11:01 pm
Уважаемый Eraser
А можно ткнуть носом чем заполнить это поле?
Webhook URL
А можно ткнуть носом чем заполнить это поле?
Webhook URL
Код: Выделить всё
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;
}
Это означает, что отпадает необходимость в запущенном цикле cycle_telegram.php? Или нет?Eraser писал(а):Для того что бы исключить постоянный опрос серверов на наличие новых сообщений. Сервера Telegram сами уведомят о поступлении нового сообщения.
да, можно цикл остановить, тем более теперь это легко сделать из XRAYskysilver писал(а):Это означает, что отпадает необходимость в запущенном цикле cycle_telegram.php? Или нет?Eraser писал(а):Для того что бы исключить постоянный опрос серверов на наличие новых сообщений. Сервера Telegram сами уведомят о поступлении нового сообщения.
P.S. Кажись, МТС устаканился. Теперь телеграм работает штатно.
Можно чуть-чуть причесать код массивами, получается компактнее, но возможно, менее понятно:Eraser писал(а):Вот еще одно довольно интересное решение интерактивной клавиатуры:СпойлерПоказать1) Создается команда "Свет" с кодом2) Создается событие "Callback_light" на "Callback" с кодомКод: Выделить всё
$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);
В результате будет клавиатура на которой будет отображаться текущий статус, при нажатии на кнопки будет выполняться действие и изменяться статусКод: Выделить всё
$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);
если кто забыл, настройка HTTPS под linux описана в ВиКи в пункте Настройка HTTPS (Через nginx прокси)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"
Отлично работает! Спасибо!Eraser писал(а):Вот еще одно довольно интересное решение интерактивной клавиатуры:
Код: Выделить всё
include_once(DIR_MODULES . 'telegram/telegram.class.php');
$telegram_module = new telegram();
$telegram_module->sendAction($chat_id,"typing");
///
...........
///
$telegram_module->sendMessage($chat_id,$message);
Мне удалось запустить ЭТО!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"
Код: Выделить всё
$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");
1,2,3 у меня проблем не возникло, я получал сертификат на WoSignErmolenkoM писал(а): Мне удалось запустить ЭТО!
Грабли, с которыми я столкнулся:
1. Нужно поднять HTTPS, вроде по инструкции ВиКи все сделал, но при создании самоподписанного сертификата не заполнил поле CN. Заполнение этого поля обязательно.
2. Заполнил CN IpАдресом. Оказывается с 01.10.2016 такие сертификаты не действительны. Только ДОМЕНное имя. Зарегался на DynDNS, указал его.
3. Для проверки self signed certificate телеграмму нужно отправить PEM файл, поправил бота вот тут:
telegram.class.phpкомментарий: знак СОБАКИ нужен, так как у меня PHP 5.4; прописал жестко, а надо бы вынести в настройку модуля.Код: Выделить всё
$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");
4. Файл webhook_telegram.php нужно бы добавить в исключения, что бы пароль не спрашивало (так сделано GPS.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)
{