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

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

Модератор: immortal

pasha413
Сообщения: 131
Зарегистрирован: Сб янв 13, 2018 6:28 pm
Благодарил (а): 34 раза
Поблагодарили: 4 раза

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

Сообщение pasha413 » Ср авг 17, 2022 2:12 pm

@Logrus, подскажи, пожалуйста, по автоудалению в меню @RomanAndr.
Подправил телеграмм меню, добавил автоудаление, но вызов команды удаляется, а комментарий остаётся - как его удалить после выполнения? Либо при вызове другой команды?

В идеале, как мне кажется, было бы так:
-Жмем на кнопку Меню,
-Приходит сообщение выберите нужный пункт и открывается первая страница меню,
-Жмем кнопку Свет, удаляется сообщение выберите нужный пункт. и приходит сообщение Можно включать и выключать свет:.
-И так далее чтобы не засорять чат бота.


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

$pos = strripos($text , "Меню");
if ($pos > -1) {
    $this->sendAction($chat_id, "typing");
    $option = array( array($em_l." Свет", $em_c." Камеры"), array($em_p." Погода", $em_g." Климат"), array($em_ch." Графики"), array($em_o." Отчеты", $em_s." Служебное"));
//    $this->sendMessageToUser($chat_id, $em_k." Выберите нужный пункт ".$em_rd, $option);

$res = $this->sendMessageToUser($chat_id, $em_k." Выберите нужный пункт ".$em_rd, $option);
if ($message_id = $res['result']['message_id']) {
 $message_id_old = registeredEventDetails('tlg/events/menu' . $chat_id);
 $this->deleteMessage($chat_id, $message_id_old);
 registerEvent('tlg/events/menu' . $chat_id, $message_id);
 $this->deleteMessage($chat_id, $data['message']['message_id']);
}
setTimeout('menu', "rs('tlg_deleteMessage',array('chat_id'=>$chat_id,'message_id'=>$message_id));",86400);

    $skip = true;
}


$pos = strripos($text , "Служебное");
if ($pos > -1) {
    $this->sendAction($chat_id, "typing");
    $option = array( array(" Сценарии", " Батарейки", " Тест"), array("Меню") );
//    $this->sendMessageToUser($chat_id, $em_i." Служебные сведения", $option);

$res = $this->sendMessageToUser($chat_id, $em_i." Служебные сведения", $option);
if ($message_id = $res['result']['message_id']) {
 $message_id_old = registeredEventDetails('tlg/events/service' . $chat_id);
 $this->deleteMessage($chat_id, $message_id_old);
 registerEvent('tlg/events/service' . $chat_id, $message_id);
 $this->deleteMessage($chat_id, $data['message']['message_id']);
}
setTimeout('service', "rs('tlg_deleteMessage',array('chat_id'=>$chat_id,'message_id'=>$message_id));",86400);

    $skip = true;
}

Да и по командам со своими событиями (допустим вызов сценариев), я их делаю скрытыми (название, соответственно, как в меню), но активными и в меню их не прописываю - и так они у меня работают.
Вложения
IMG_20220817_140718.jpg
IMG_20220817_140718.jpg (106.03 КБ) 1453 просмотра
Моё: Orange Pi Zero H2 + DietPi / Paspberry Pi3b + MJD 3.41
Logrus
Сообщения: 2077
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 456 раз

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

Сообщение Logrus » Ср авг 17, 2022 9:26 pm

в самом модуле тлг можно реализовывать все что хочешь
но автор модуля уже побеспокоился о юзерах и создал команды и события
в команды пишется код который выполнится при нажатии оной ака кнопка меню
события вызываются при нажатии кнопки в чате в мессадже (они формируются в коде команды или события)

чуть выше здесь и несколько раз очень подробно в курилке описывал ошибки при использовании этих нескольких строчек кода для удаления, да и в блоге все было четко и просто описано я честно не понимаю зачем и почему это начинают пихать туда куда не было описано о_0
они универсальны и если юзер ничего не напортачил то просто добавив их в команды все будет хорошо
но при этом при событии ака каллбеке сообщения менять через едит что б не поменялся ид мессаджа

такая структура проста и универсальна, меню от @RomanAndr ни разу не юзал, но минусы его описывал здесь
хотя можно доработать и этот вариант, но он будет несколько сложнее и в понимании и в реализации и в дальнейших изменениях

я конечно понимаю что сложно понять функции модуля, особенно когда есть и вредные примеры реализации
но вся проблема в том что пока сами не поймете функционал и взаимосвязи в модуле то и ничего не реализуете

и еще раз повторю эти несколько строчек сделаны универсально если правильно юзать, миша к примеру ругался громко что не работает и пока не показал что у него вместо сендмессадж отправляет сендмессаджтоюзерс, ну и пр. его изменений то это вызывало удивление, в оригинале было как надо
За это сообщение автора Logrus поблагодарил:
pasha413 (Ср авг 17, 2022 10:00 pm)
Рейтинг: 1.16%
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
pasha413
Сообщения: 131
Зарегистрирован: Сб янв 13, 2018 6:28 pm
Благодарил (а): 34 раза
Поблагодарили: 4 раза

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

Сообщение pasha413 » Ср авг 17, 2022 10:01 pm

Logrus писал(а):
Ср авг 17, 2022 9:26 pm
в самом модуле тлг можно реализовывать все что хочешь
но автор модуля уже побеспокоился о юзерах и создал команды и события
в команды пишется код который выполнится при нажатии оной ака кнопка меню
события вызываются при нажатии кнопки в чате в мессадже (они формируются в коде команды или события)

чуть выше здесь и несколько раз очень подробно в курилке описывал ошибки при использовании этих нескольких строчек кода для удаления, да и в блоге все было четко и просто описано я честно не понимаю зачем и почему это начинают пихать туда куда не было описано о_0
они универсальны и если юзер ничего не напортачил то просто добавив их в команды все будет хорошо
но при этом при событии ака каллбеке сообщения менять через едит что б не поменялся ид мессаджа

такая структура проста и универсальна, меню от @RomanAndr ни разу не юзал, но минусы его описывал здесь
хотя можно доработать и этот вариант, но он будет несколько сложнее и в понимании и в реализации и в дальнейших изменениях

я конечно понимаю что сложно понять функции модуля, особенно когда есть и вредные примеры реализации
но вся проблема в том что пока сами не поймете функционал и взаимосвязи в модуле то и ничего не реализуете

и еще раз повторю эти несколько строчек сделаны универсально если правильно юзать, миша к примеру ругался громко что не работает и пока не показал что у него вместо сендмессадж отправляет сендмессаджтоюзерс, ну и пр. его изменений то это вызывало удивление, в оригинале было как надо
Понял, спасибо. По чуть пытаюсь изучать.
Некоторые команды уже заработали с автоудалением, некоторые пока не победил.
Моё: Orange Pi Zero H2 + DietPi / Paspberry Pi3b + MJD 3.41
overflow
Сообщения: 4
Зарегистрирован: Сб июл 23, 2022 1:05 pm
Благодарил (а): 0
Поблагодарили: 5 раз

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

Сообщение overflow » Сб авг 20, 2022 2:38 pm

Доброго дня!
Не уверен, что проблема связана именно с последним обновлением модуля, но тем не менее .
Добрались руки перебрать свою локалку в связи с чем удалил и переподключил вебхук телеги в модуле.
Он подключился, но постоянно летела одна и та же ошибка
Screenshot 08-20-2022 14.42.33.png
Screenshot 08-20-2022 14.42.33.png (72.8 КБ) 1273 просмотра
(К сожалению дело было уже под утро и я где-то потерял или затер кусок лога с сервера с детальной ошибкой)
Но на ходу временно ее решил закоментив вот эти пару строк кода в файле telegram.class.php & Думаю глобально это жизнь модулю не испортит, да и вебхук по любому и подключался и удалялся без проблем - проблема была уже с исполнением команд.
В общем, как-то так
Screenshot 08-20-2022 14.31.33.png
Screenshot 08-20-2022 14.31.33.png (25.88 КБ) 1272 просмотра
Аватара пользователя
ImageMaker
Сообщения: 76
Зарегистрирован: Ср фев 13, 2019 9:28 pm
Благодарил (а): 32 раза
Поблагодарили: 1 раз

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

Сообщение ImageMaker » Чт авг 25, 2022 12:55 pm

В описании «Регистрация бота» добавьте, что в настройках модуля нужно отметить чек—бокс «Регистрация пользователей». Т.к. это не очевидно при регистрации админа☝🏻
Два дня пытался зарегиться, пока не сообразил🤔
pasha413
Сообщения: 131
Зарегистрирован: Сб янв 13, 2018 6:28 pm
Благодарил (а): 34 раза
Поблагодарили: 4 раза

Re: Модуль "Telegram"

Сообщение pasha413 » Чт авг 25, 2022 3:32 pm

Amarok писал(а):
Сб ноя 19, 2016 11:11 am
Написал сценарий для упрощения работы с модулем Telegram. А то утомило постоянно инклюды писать
sendTelegramПоказать

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

// Сценарий для упрощения работы с модулем Telegram
// Примеры использования:
//  runScript("sendTelegram",array("user"=>'ИмяПользователя',"cmd"=>'НазваниеКоманды'));
//  runScript("sendTelegram",array("user"=>'ИмяПользователя',"msg"=>'ТекстСообщения'));
// ИмяПользователя - название объекта пользователя с заполненым свойством TelegramID
// НазваниеКоманды - название существующей команды из модуля Telegram
// ТекстСообщения - сообщение для отправки

$user = $params['user']; //получаем имя пользователя переданное через параметр запуска
if ($user == '') {return;} //если имя пользователя не заданно - прекращаем выполнение сценария

include_once(DIR_MODULES.'telegram/telegram.class.php'); //подключаем модуль Telegram
$telegram_module = new telegram(); //активируем модуль Telegram

$tID = gg($user.'.TelegramID'); //считываем id пользователя в переменную из свойства TelegramID
$tMSG = $params['msg']; //получаем текст отправляемого сообщения переданное через параметр запуска
$tCMD = $params['cmd']; //получаем имя команды переданной через параметр запуска

//если сообщение не пустое
if ($tMSG != "") {
 $user = mb_strtolower($user); //переводим имя пользователя в нижний регистр (на всякий случай)
 if ($user == 'all') {$telegram_module->sendMessageToAll($tMSG);} //если имя пользователя all, то шлём сообщение всем
 if ($user == 'admin') {$telegram_module->sendMessageToAdmin($tMSG);} //если имя пользователя ADMIN, то шлём сообщение только ему
 if ($user != 'all' or $user != 'admin') {$telegram_module->sendMessageToUser($tID, $tMSG);} //если имя пользователя не all или не admin, то шлём сообщение тому, который указан в параметрах запуска
 return; //прекращаем выполнение сценария
}

//если имя команды не пустое
if ($tCMD != "") {
 $telegram_module->execCommand($tID, $tCMD); //выполняем указанную команду от имени указанного пользователя
 return; //прекращаем выполнение сценария
}

//Принимаю любую благодарность на Яндекс.Деньги 41001355945165  
Здравствуйте. а как ответить пользователю, который прислал команду?
rs("sendTelegram", array("user"=>'что тут вписать', "message"=>'test_'.date("d-m-Y H:i:s")));
Последний раз редактировалось pasha413 Чт авг 25, 2022 5:01 pm, всего редактировалось 1 раз.
Моё: Orange Pi Zero H2 + DietPi / Paspberry Pi3b + MJD 3.41
Аватара пользователя
Eraser
Сообщения: 1085
Зарегистрирован: Вт окт 21, 2014 7:31 pm
Откуда: Киров
Благодарил (а): 14 раз
Поблагодарили: 868 раз
Контактная информация:

Re: Модуль "Telegram"

Сообщение Eraser » Чт авг 25, 2022 3:40 pm

pasha413 писал(а):
Чт авг 25, 2022 3:32 pm
Amarok писал(а):
Сб ноя 19, 2016 11:11 am
Написал сценарий для упрощения работы с модулем Telegram. А то утомило постоянно инклюды писать
sendTelegramПоказать

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

// Сценарий для упрощения работы с модулем Telegram
// Примеры использования:
//  runScript("sendTelegram",array("user"=>'ИмяПользователя',"cmd"=>'НазваниеКоманды'));
//  runScript("sendTelegram",array("user"=>'ИмяПользователя',"msg"=>'ТекстСообщения'));
// ИмяПользователя - название объекта пользователя с заполненым свойством TelegramID
// НазваниеКоманды - название существующей команды из модуля Telegram
// ТекстСообщения - сообщение для отправки

$user = $params['user']; //получаем имя пользователя переданное через параметр запуска
if ($user == '') {return;} //если имя пользователя не заданно - прекращаем выполнение сценария

include_once(DIR_MODULES.'telegram/telegram.class.php'); //подключаем модуль Telegram
$telegram_module = new telegram(); //активируем модуль Telegram

$tID = gg($user.'.TelegramID'); //считываем id пользователя в переменную из свойства TelegramID
$tMSG = $params['msg']; //получаем текст отправляемого сообщения переданное через параметр запуска
$tCMD = $params['cmd']; //получаем имя команды переданной через параметр запуска

//если сообщение не пустое
if ($tMSG != "") {
 $user = mb_strtolower($user); //переводим имя пользователя в нижний регистр (на всякий случай)
 if ($user == 'all') {$telegram_module->sendMessageToAll($tMSG);} //если имя пользователя all, то шлём сообщение всем
 if ($user == 'admin') {$telegram_module->sendMessageToAdmin($tMSG);} //если имя пользователя ADMIN, то шлём сообщение только ему
 if ($user != 'all' or $user != 'admin') {$telegram_module->sendMessageToUser($tID, $tMSG);} //если имя пользователя не all или не admin, то шлём сообщение тому, который указан в параметрах запуска
 return; //прекращаем выполнение сценария
}

//если имя команды не пустое
if ($tCMD != "") {
 $telegram_module->execCommand($tID, $tCMD); //выполняем указанную команду от имени указанного пользователя
 return; //прекращаем выполнение сценария
}

//Принимаю любую благодарность на Яндекс.Деньги 41001355945165  
Здравствуйте. а как отправить сообщение пользователю, который прислал команду?
rs("sendTelegram", array("user"=>'что тут вписать', "message"=>'test_'.date("d-m-Y H:i:s")));
пример есть в команде "Ping"
Connect ---- Telegram
ЮMoney для благодарностей за помощь: 410012076838296 или нажмите кнопку "Спасибо"!!! :D
pasha413
Сообщения: 131
Зарегистрирован: Сб янв 13, 2018 6:28 pm
Благодарил (а): 34 раза
Поблагодарили: 4 раза

Re: Модуль "Telegram"

Сообщение pasha413 » Чт авг 25, 2022 4:40 pm

Eraser писал(а):
Чт авг 25, 2022 3:40 pm
pasha413 писал(а):
Чт авг 25, 2022 3:32 pm
Amarok писал(а):
Сб ноя 19, 2016 11:11 am
Написал сценарий для упрощения работы с модулем Telegram. А то утомило постоянно инклюды писать
sendTelegramПоказать

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

// Сценарий для упрощения работы с модулем Telegram
// Примеры использования:
//  runScript("sendTelegram",array("user"=>'ИмяПользователя',"cmd"=>'НазваниеКоманды'));
//  runScript("sendTelegram",array("user"=>'ИмяПользователя',"msg"=>'ТекстСообщения'));
// ИмяПользователя - название объекта пользователя с заполненым свойством TelegramID
// НазваниеКоманды - название существующей команды из модуля Telegram
// ТекстСообщения - сообщение для отправки

$user = $params['user']; //получаем имя пользователя переданное через параметр запуска
if ($user == '') {return;} //если имя пользователя не заданно - прекращаем выполнение сценария

include_once(DIR_MODULES.'telegram/telegram.class.php'); //подключаем модуль Telegram
$telegram_module = new telegram(); //активируем модуль Telegram

$tID = gg($user.'.TelegramID'); //считываем id пользователя в переменную из свойства TelegramID
$tMSG = $params['msg']; //получаем текст отправляемого сообщения переданное через параметр запуска
$tCMD = $params['cmd']; //получаем имя команды переданной через параметр запуска

//если сообщение не пустое
if ($tMSG != "") {
 $user = mb_strtolower($user); //переводим имя пользователя в нижний регистр (на всякий случай)
 if ($user == 'all') {$telegram_module->sendMessageToAll($tMSG);} //если имя пользователя all, то шлём сообщение всем
 if ($user == 'admin') {$telegram_module->sendMessageToAdmin($tMSG);} //если имя пользователя ADMIN, то шлём сообщение только ему
 if ($user != 'all' or $user != 'admin') {$telegram_module->sendMessageToUser($tID, $tMSG);} //если имя пользователя не all или не admin, то шлём сообщение тому, который указан в параметрах запуска
 return; //прекращаем выполнение сценария
}

//если имя команды не пустое
if ($tCMD != "") {
 $telegram_module->execCommand($tID, $tCMD); //выполняем указанную команду от имени указанного пользователя
 return; //прекращаем выполнение сценария
}

//Принимаю любую благодарность на Яндекс.Деньги 41001355945165  
Здравствуйте. а как отправить сообщение пользователю, который прислал команду?
rs("sendTelegram", array("user"=>'что тут вписать', "message"=>'test_'.date("d-m-Y H:i:s")));
пример есть в команде "Ping"
все бы хорошо, но у меня ее нет
PS: разобрался:

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

rs("sendTelegram", array("user" => $chat_id, "message"=>'test_'.date("d-m-Y H:i:s")));
но в самом сценарии sendTelegram подправил:

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

//if ($T_user != 'all' or $T_user != 'admin') {$telegram_module->sendMessageToUser($T_id, $T_msg);} //если имя пользователя не all или не admin, то шлём сообщение тому, который указан в параметрах запуска
if ($T_user != 'all' or $T_user != 'admin') {$telegram_module->sendMessageToUser($T_user, $T_msg);} //если имя пользователя не all или не admin, то шлём сообщение тому, который указан в параметрах запуска
Моё: Orange Pi Zero H2 + DietPi / Paspberry Pi3b + MJD 3.41
pasha413
Сообщения: 131
Зарегистрирован: Сб янв 13, 2018 6:28 pm
Благодарил (а): 34 раза
Поблагодарили: 4 раза

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

Сообщение 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; //не перебираем далее остальные каллбеки
  //определяем параметр переданный с нажатия кнопки
  include_once(DIR_MODULES . 'charts/charts.class.php');
  $chart = new charts();
  $term = substr($callback, 16);
  
  switch ($term) {
    case '0':
      //соответствует первой кнопке
      $chartPNG = $chart->getImage(1);
      break;
    case '1':
      $chartPNG = $chart->getImage(10);
      break;
    case '2':
      $chartPNG = $chart->getImage(9);
      break;
    case '3':
      $chartPNG = $chart->getImage(2);
      break;

  default:
  }
  rs('send_Telegram', array("user"=>$chat_id, "img"=>ROOT.$chartPNG));  
}
но на все кнопки приходит только первый график
Моё: Orange Pi Zero H2 + DietPi / Paspberry Pi3b + MJD 3.41
Logrus
Сообщения: 2077
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 456 раз

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

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

Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Ответить