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

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

Модератор: immortal

Logrus
Сообщения: 2077
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 456 раз

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

Сообщение Logrus » Вс авг 28, 2022 9:14 pm

pasha413 писал(а):
Чт авг 25, 2022 8:33 pm
еще вопрос, хотел сделать по аналогии с вызовом сценариев, создал команду Графики:

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

$em_therm = json_decode('"'.'\ud83c\udf21\ufe0f'.'"'); //термометр

include_once(DIR_MODULES . 'telegram/telegram.class.php');
$telegram_module = new telegram();
//формируем массив названий кнопок, далее нужное по аналогии добавить здесь
$term = array($em_therm.'CPU',
              $em_therm.'ТП',
              $em_therm.'Котел',
              $em_therm.'Теплица');

$total = count($term);
for($i = 0; $i < $total; $i++) {
  //формируем массив кнопок с настройками, $i = 0 соответствует первой кнопке
  $option[] = $this->buildInlineKeyboardButton($term[$i], '', 'CallbackChart_' . $i, '');
}

//количество кнопок в строке
$count_row = 2;
$option = array_chunk($option, $count_row);
$keyb = $this->buildInlineKeyBoard($option);
$content = array('chat_id' => $chat_id, 'text' => 'Выберите необходимый график:', 'reply_markup' => $keyb);

$this->sendContent($content);
и событие CallbackChart_

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

if (strpos($callback, 'CallbackChart_') !== false) {
  $skip = true; //не перебираем далее остальные каллбеки
  //определяем параметр переданный с нажатия кнопки
  $term = substr($callback, 16);
но на все кнопки приходит только первый график
если в строке из 15 символов обрезать 16 то получим ноль, логично
можно через експлоде строку разделить по подчеркиванию, в примере автора в управлении пу так можно оперировать несколькими аргументами передаваемыми в каллбек
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
serenkyby
Сообщения: 19
Зарегистрирован: Сб сен 07, 2019 10:52 am
Благодарил (а): 7 раз
Поблагодарили: 1 раз

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

Сообщение serenkyby » Ср авг 31, 2022 10:01 am

Знающие люди, подскажите пожалуйста, возможно ли настроить данного бота для копирования сообщений из других ботов или чатов? Есть у меня бот keenetic - он присылает различные уведомления о состоянии сети. Хочется на основе этих уведомлений что-нибудь делать. Пример: определился телефон в сети - я дома, и др. Роутер определяет наличие отсутствие очень качественно.
Аватара пользователя
Eraser
Сообщения: 1085
Зарегистрирован: Вт окт 21, 2014 7:31 pm
Откуда: Киров
Благодарил (а): 14 раз
Поблагодарили: 868 раз
Контактная информация:

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

Сообщение Eraser » Ср авг 31, 2022 10:09 am

serenkyby писал(а):
Ср авг 31, 2022 10:01 am
Знающие люди, подскажите пожалуйста, возможно ли настроить данного бота для копирования сообщений из других ботов или чатов? Есть у меня бот keenetic - он присылает различные уведомления о состоянии сети. Хочется на основе этих уведомлений что-нибудь делать. Пример: определился телефон в сети - я дома, и др. Роутер определяет наличие отсутствие очень качественно.
чем https://connect.smartliving.ru/addons/c ... 1/251.html не угодил?

вот вроде настроили viewtopic.php?f=24&t=1511&start=380#p131486
За это сообщение автора Eraser поблагодарил:
serenkyby (Ср авг 31, 2022 10:18 am)
Рейтинг: 1.16%
Connect ---- Telegram
ЮMoney для благодарностей за помощь: 410012076838296 или нажмите кнопку "Спасибо"!!! :D
serenkyby
Сообщения: 19
Зарегистрирован: Сб сен 07, 2019 10:52 am
Благодарил (а): 7 раз
Поблагодарили: 1 раз

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

Сообщение serenkyby » Ср авг 31, 2022 10:18 am

Eraser писал(а):
Ср авг 31, 2022 10:09 am
чем https://connect.smartliving.ru/addons/c ... 1/251.html не угодил?

вот вроде настроили viewtopic.php?f=24&t=1511&start=380#p131486
Я ж не знал. Изобретал колесо. Да это то, что надо.
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 374 раза

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

Сообщение Bagir » Пт сен 09, 2022 4:58 pm

А есть вариант отправить картинку, но без сохранения в файл. В примерах только из файлика. У меня сервер регистратора в браузере даст один снимок с камеры по ссылке http://<ip>/cameras/2/image
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
xor
Сообщения: 2036
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 283 раза
Поблагодарили: 628 раз

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

Сообщение xor » Сб сен 10, 2022 3:02 pm

Bagir писал(а):
Пт сен 09, 2022 4:58 pm
А есть вариант отправить картинку, но без сохранения в файл. В примерах только из файлика. У меня сервер регистратора в браузере даст один снимок с камеры по ссылке http://<ip>/cameras/2/image
а что мешает его сохранить?

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

$snap = $this->getProperty('snapshotURL');
$fileto = DOC_ROOT."/cms/images/snapshots/cam2_".date('Y-m-d-H-i').".jpg";
$result = getURL($snap,0);
SaveFile($fileto, $result);
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 374 раза

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

Сообщение Bagir » Вс сен 11, 2022 10:58 am

xor писал(а):
Сб сен 10, 2022 3:02 pm
а что мешает его сохранить?
Вообще ничто не мешает. Просто может быть это лишний шаг, и можно сразу пульнуть картинку, взятую по адресу регистратора. Я с картинками крайне мало работал.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 374 раза

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

Сообщение Bagir » Пн сен 12, 2022 8:05 am

А вообще прикольно, жмешь на кнопку звонка и фотка прилетает в телеграмм
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
bartwell
Сообщения: 61
Зарегистрирован: Пн апр 23, 2018 11:10 am
Благодарил (а): 16 раз
Поблагодарили: 29 раз

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

Сообщение bartwell » Вт ноя 22, 2022 9:03 pm

Использую модуль Телеграмм кодом:

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

include_once(DIR_MODULES . 'telegram/telegram.class.php');
$telegram_module = new telegram();
$telegram_module->sendMessageToAll($text, null, '', !$isImportant);
Что пытаюсь добиться: чтобы для важных сообщений был и звук, и всплывающее сообщение. Для всех остальных - ни звука, ни всплывающего сообщения быть не должно.

Что происходит на самом деле:
- Если уведомления для в Телеграмме ВКЛючены - всплывающие сообщения показываются всегда
- Если уведомления для в Телеграмме ВЫКЛючены - всплывающие сообщения показываются всегда.

Последний параметр (true/false) на это поведение никак не влияет.

Вопрос: как управлять всплывающими сообщениями?
pasha413
Сообщения: 131
Зарегистрирован: Сб янв 13, 2018 6:28 pm
Благодарил (а): 34 раза
Поблагодарили: 4 раза

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

Сообщение pasha413 » Вс ноя 27, 2022 7:16 pm

Может кому будет интересны такие телеграмм команды, кое что было доработано под мои потребности.
Включение/выключение котла (с автоудалением команды и сообщения):
команда
СпойлерПоказать

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

$on = json_decode('"'.'\uD83C\uDF15'.'"');
$off = json_decode('"'.'\ud83c\udf11'.'"');
//$boiler = $off; // на всякий случай пишем сначала что выключен
if (gg("Boiler.disabled") == 0) { // если блокировка котла выключена
  $boiler = $on;                  // то пишем ON
  $status = "Котел включен";      // пишем
}
if (gg("Boiler.disabled") == 1) { // если блокировка включена
  $boiler = $off;                 // то пишем off
  $status = "Котел выключен";     // пишем
}

//$option = array(array($this->buildInlineKeyboardButton($text=$boiler."Котёл вкл/выкл","","CallbackBoiler_","")));
$option = array(array($this->buildInlineKeyboardButton($text=$boiler.$status,"","CallbackBoiler_","")));
$keyb = $this->buildInlineKeyBoard($option);
$content = array('chat_id' => $chat_id, 'text' => "Управление работой котла:", 'reply_markup' => $keyb);

//$this->sendContent($content);
// удаляем сообщение с командой через 5 секунд
$res = $this->sendContent($content);
$message_id = $res["result"]["message_id"];
sleep(5);
$res = $this->deleteMessage($chat_id, $message_id);
$this->deleteMessage($chat_id, $data['message']['message_id']);
событие Callback
СпойлерПоказать

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

$sw = false;

if ($callback == 'CallbackBoiler_') {
  $skip = true; // не перебираем далее остальные каллбеки
  $sw = true; 
//  if (gg("Boiler.disabled") == 0) cm("Boiler.disable"); // если блокировка выключена, то включаем
//  elseif (gg("Boiler.disabled") == 1) cm("Boiler.enable");
  cm("Boiler.switchEnable");  // меняем состояние работы котла вкл, либо выкл
}

if ($sw) { // чтобы не отображалось при вызове других калбеков
  $on = json_decode('"'.'\uD83C\uDF15'.'"');   
  $off = json_decode('"'.'\ud83c\udf11'.'"'); 
//  $boiler = $off; // на всякий случай пишем сначала что выключен
  if (gg("Boiler.disabled") == 0) {       // если блокировка выключена
    $boiler = $on;                        // то пишем on
    $status = "Котел включен";             // пишем
  } elseif (gg("Boiler.disabled") == 1) { // если блокировка включена
    $boiler = $off;                       // то пишем off
    $status = "Котел выключен";            // пишем
  }
  $option = array(array($this->buildInlineKeyboardButton($text=$boiler.$status, "","CallbackBoiler_", "")));
  $keyb = $this->buildInlineKeyBoard($option);
  $this->sendAnswerCallbackQuery($callback_id, $status, false); // формируем всплывающее сообщение с названием скрипта
  $this->editMessage($chat_id, $message_id, "Управление работой котла:", $keyb);
}
Графики:
команда
СпойлерПоказать

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

$em_therm = json_decode('"'.'\ud83c\udf21\ufe0f'.'"'); // термометр

//формируем массив названий кнопок
$term = array($em_therm.' CPU',
              $em_therm.' Дома',
              $em_therm.' Котла',
              $em_therm.' ТП',
              $em_therm.' Термостата',
              $em_therm.' Теплице'
);

$total = count($term);
for($i = 0; $i < $total; $i++) { // формируем массив кнопок с настройками, $i = 0 соответствует первой кнопке
  $option[] = $this->buildInlineKeyboardButton($term[$i], '', 'CallbackChart_' . $i, ''); 
}

$count_row = 2; // количество кнопок в строке
$option = array_chunk($option, $count_row);
$keyb = $this->buildInlineKeyBoard($option);
$content = array('chat_id' => $chat_id, 'text' => 'Выберите необходимый двухдневный график:', 'reply_markup' => $keyb);

//$this->sendContent($content); 
// удаляем сообщение и команду через 5 секунд
$res = $this->sendContent($content);
$message_id = $res["result"]["message_id"];
sleep(5);
$res = $this->deleteMessage($chat_id, $message_id);
$this->deleteMessage($chat_id, $data['message']['message_id']);
событие Callback
СпойлерПоказать

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

if (strpos($callback, 'CallbackChart_') !== false) {
  $skip = true; //не перебираем далее остальные каллбеки
  //определяем параметр переданный с нажатия кнопки
  include_once(DIR_MODULES . 'charts/charts.class.php');
  $charts = new charts();
  $em_therm = json_decode('"'.'\ud83c\udf21\ufe0f'.'"'); //термометр

  $term = substr($callback, 14);
  switch ($term) {
    case '0':
      //соответствует первой кнопке
      $chartPNG = $charts->getImage(1);
      $text = $em_therm." CPU: ".gg('TempCPUcore0.value')."°C";
      rs('sendTelegram', array("user"=>$chat_id, "img"=>ROOT.$chartPNG, "description"=>$text));  
      break;
    case '1':
      $chartPNG = $charts->getImage(2);
//      $text = $em_therm." Холл 1: ".gg('TempHall1.value')."°C, ".$em_therm." Холл 2: ".gg('TempHall2.value')."°C\r\n".$em_therm." Пола в холле 1: ".gg('TempFloor.value')."°C";
      $text = $em_therm." Холл 1: ".gg('TempHall1.value')."°C, ".$em_therm." Холл 2: ".gg('TempHall2.value')."°C";
      rs('sendTelegram', array("user"=>$chat_id, "img"=>ROOT.$chartPNG, "description"=>$text));  
      break;
    case '2':
      $chartPNG = $charts->getImage(3);
      $text = $em_therm." Прямой котла: ".gg('TempBoilerFeed.value')."°C\r\n".$em_therm." Обратки котла: ".gg('TempBoilerReturn.value')."°C";
      rs('sendTelegram', array("user"=>$chat_id, "img"=>ROOT.$chartPNG, "description"=>$text));  
      break;
    case '3':
      $chartPNG = $charts->getImage(4);
      $text = $em_therm." Прямой ТП: ".gg('TempCollectorFeed.value')."°C\r\n".$em_therm." Обратки ТП: ".gg('TempCollectorReturn.value')."°C";
      rs('sendTelegram', array("user"=>$chat_id, "img"=>ROOT.$chartPNG, "description"=>$text));  
      break;
    case '4':
      $chartPNG = $charts->getImage(7);
      $text = $em_therm." Термостата: ".gg('Boiler.value')."°C";
      rs('sendTelegram', array("user"=>$chat_id, "img"=>ROOT.$chartPNG, "description"=>$text));  
      break;
    case '5':
      $chartPNG = $charts->getImage(5);
      $text = $em_therm." В теплице: ".gg('TempGreenhouse.value')."°C";
      rs('sendTelegram', array("user"=>$chat_id, "img"=>ROOT.$chartPNG, "description"=>$text));  
      break;
    default:
  }
  //формируем всплывающее сообщение с названием скрипта
//  $this->sendAnswerCallbackQuery($callback_id, $script, false);
}
Сценарии (с автоудалением команды и сообщения):
команда
СпойлерПоказать

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

//https://github.com/wooorm/gemoji/blob/main/support.md
$em_stop = json_decode('"'.'\ud83d\uded1'.'"'); //stop
$em_warning = json_decode('"'.'\u26a0\ufe0f'.'"'); //off

// формируем массив названий кнопок
$scripts = array($em_warning.' restart cycles',
                 $em_warning.' reboot system',
                 $em_warning.' reboot router',
                 $em_stop.' shutDown '.$em_stop);

$total = count($scripts);
for($i = 0; $i < $total; $i++) {
  // формируем массив кнопок с настройками, $i = 0 соответствует первой кнопке
  $option[] = $this->buildInlineKeyboardButton($scripts[$i], '', 'CallbackScripts_' . $i, '');
}

$count_row = 3; // количество кнопок в строке
$option = array_chunk($option, $count_row);
$keyb = $this->buildInlineKeyBoard($option);
$content = array('chat_id' => $chat_id, 'text' => 'Выберите сценарий:', 'reply_markup' => $keyb);

//$this->sendContent($content); // заменил автоудалением
// удаляем сообщение и команду через 5 секунд
$res = $this->sendContent($content);
$message_id = $res["result"]["message_id"];
sleep(5);
$res = $this->deleteMessage($chat_id, $message_id);
$this->deleteMessage($chat_id, $data['message']['message_id']);
событие Callback
СпойлерПоказать

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

if (strpos($callback, 'CallbackScripts_') !== false) {
  $skip = true; // не перебираем далее остальные каллбеки
  $scripts = substr($callback, 16); // определяем параметр переданный с нажатия кнопки
  switch ($scripts) {
    case '0':
      //соответствует первой кнопке
      $script = 'restartCycles';
      break;
    case '1':
      $script = 'rebootSystem';
      break;
    case '2':
      $script = 'rebootRoter';
      break;
    case '3':
      $script = 'shutDown';
      break;
    case '4':

      break;
    default:
  }
  $this->sendAnswerCallbackQuery($callback_id, $script, false); // формируем всплывающее сообщение с названием скрипта
  runScriptSafe($script); // выполняем заданный скрипт
}
Режимы (с автоудалением команды и сообщения):
кстати, тут я не понял как сменить иконки около режимов работы на свои...
команда
СпойлерПоказать

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

//https://connect.smartliving.ru/profile/186/blog/pereklyuchenie-rejimov-operationalmodes-v-telegram.html
$this->sendAction($chat_id);

$on = json_decode('"'.'\uD83C\uDF15'.'"');
$off = json_decode('"'.'\ud83c\udf11'.'"');
$ecoON = json_decode('"'.'\ud83d\udc9a'.'"');
$ecoOFF = json_decode('"'.'\ud83e\udd0d'.'"');
$nobodyON = json_decode('"'.' '.'"');
$nobodyOFF = json_decode('"'.' '.'"');
$alarmON = json_decode('"'.' '.'"');
$alarmOFF = json_decode('"'.' '.'"');
$guestON = json_decode('"'.' '.'"');
$guestOFF = json_decode('"'.' '.'"');
$darktON = json_decode('"'.' '.'"');
$darkOFF = json_decode('"'.' '.'"');
$nightON = json_decode('"'.'\ud83c\udf19'.'"');
$nightOFF = json_decode('"'.'\u2600\ufe0f'.'"');


$objects=getObjectsByClass("OperationalModes");
foreach($objects as $obj) {
  if (gg($obj['TITLE'].".hide")!=1) {
    $state = $off;
    if (gg($obj['TITLE'].".active") == 1) $state = $on;
    $option[] = $this->buildInlineKeyboardButton($text=$state.gg($obj['TITLE'].".title"),"","CallbackMode_".$obj['TITLE'],"");
  }
}

$count_row = 3;
$option = array_chunk($option, $count_row);
$keyb = $this->buildInlineKeyBoard($option);
$content = array('chat_id' => $chat_id, 'text' => "Режимы:", 'reply_markup' => $keyb, 'parse_mode' => 'HTML');

// удаляем сообщение и команду через 5 секунд
$res = $this->sendContent($content);
$message_id = $res["result"]["message_id"];
sleep(5);
$res = $this->deleteMessage($chat_id, $message_id);
$this->deleteMessage($chat_id, $data['message']['message_id']);
событие Callback
СпойлерПоказать

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

$sw = false;

$on  = hex2bin('F09F8C95');
$off = hex2bin('F09F8C91');

if (strpos($callback, 'CallbackMode_') !== false) {
  $sw = true; 
  $skip = true;
  $obj = substr($callback, 13);
  $text = gg($obj.".title");
  cm($obj.".switch");
  if (gg($obj.".active") == 1) $text .= " включен ". $on;
  else $text.= " выключен ". $off;
  $this->sendAnswerCallbackQuery($callback_id,$text, false);
}

if ($sw) { //чтобы не отображалось при вызове других калбеков
  $objects=getObjectsByClass("OperationalModes");
  foreach($objects as $obj) {
    if (gg($obj['TITLE'].".hide")!=1) {
      $state = $off;
      if (gg($obj['TITLE'].".active") == 1) $state = $on;
      $option[] = $this->buildInlineKeyboardButton($text=$state.gg($obj['TITLE'].".title"),"","CallbackMode_".$obj['TITLE'],"");
    }
  }
  $count_row = 3;
  $option = array_chunk($option, $count_row);
  $keyb = $this->buildInlineKeyBoard($option);
  $this->editMessage($chat_id,$message_id,"Режимы:",$keyb);
}
За это сообщение автора pasha413 поблагодарил:
~220v (Пт дек 09, 2022 5:20 pm)
Рейтинг: 1.16%
Моё: Orange Pi Zero H2 + DietPi / Paspberry Pi3b + MJD 3.41
Ответить