[Модуль] VK мессенджер (vkmessenger)

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

Модератор: immortal

Ответить
V.A.S.t
Сообщения: 351
Зарегистрирован: Сб май 11, 2019 6:35 pm
Откуда: Иркутск

[Модуль] VK мессенджер (vkmessenger)

Сообщение V.A.S.t »

Модуль предназначен для взаимодействия с подписчиками Сообщества ВКонтакте и отправки сообщений от имени сообщества.
Страница модуля
Группа Вконтакте

Возможности модуля:
  • отправка сообщений;
  • обработка команд;
  • отправка изображений;
  • формирование клавиатуры.
Выражаю особую благодарность пользователю Eraser за его модуль "Telegram", на основании которого был создан данный модуль.
Последний раз редактировалось V.A.S.t Вт апр 21, 2026 12:58 pm, всего редактировалось 2 раза.
V.A.S.t
Сообщения: 351
Зарегистрирован: Сб май 11, 2019 6:35 pm
Откуда: Иркутск

Re: [Модуль] VK мессенджер (vkmessenger)

Сообщение V.A.S.t »

Как создать сообщество и получить его ключ доступа.

Для этого переходим по ссылке и создаём сообщество.
Называем как угодно, выбираем тематику, например "Дом и дача", нажимаем "Создать сообщество".
VK1.png
VK1.png (15.34 КБ) 1090 просмотров
Далее можно выбрать аватарку и сразу добавить участников. Можно сделать это и позже.
VK2.png
VK2.png (16.7 КБ) 1090 просмотров
Далее заходим в Управление и меняем Тип сообщества на "Частное" (или другое по желанию). Здесь же можно поменять аватарку и имя сообщества.
VK3.png
VK3.png (48.98 КБ) 1090 просмотров
Далее в меню управления Сообщества выбираем пункт "Сообщения" и подпункт "Настройки для бота". Включаем "Возможности бота" и ставим галку "Добавить кнопку «Начать»"
VK4.png
VK4.png (13.69 КБ) 1090 просмотров
После в меню управления Сообщества выбираем пункт "Дополнительно" и подпункт "Работа с API". Нажимаем на кнопку "Создать ключ".
VK6.png
VK6.png (9.54 КБ) 1090 просмотров
Проставляем все галочки. добавляя тем самым максимальные права. Нажимаем "Создать", подтверждаем кодом из СМС.
VK5.png
VK5.png (37.91 КБ) 1090 просмотров
После этого копируем ключ и в вставляем его в настройки модуля.
Последний раз редактировалось V.A.S.t Чт апр 23, 2026 5:51 am, всего редактировалось 1 раз.
Аватара пользователя
Strangeman
Сообщения: 210
Зарегистрирован: Ср янв 16, 2013 6:35 pm
Откуда: Золотарево
Контактная информация:

Re: [Модуль] VK мессенджер (vkmessenger)

Сообщение Strangeman »

Выше были пожелания, но выяснилось, что и в текущей версии все реализуемо. Сообщение со своими пожеланиями удалил.

Есть решение. Нужно создать событие "Текстовое сообщение" с любым названием, в поле Код: вписать код.
$var = explode(" ", $text,2);
if(!empty($var)){
if($var[0] == "Скажи") say($var[1],5);
}
$skip=true;
Проговаривает текст после слова "Скажи". Все корректно работает. В данном примере уровень важности сообщений установлен 5. Можно ставить любой, можно сделать несколько событий в которых после "Скажи" без пробела установить уровень важности.
Например для важности 2
$var = explode(" ", $text,2);
if(!empty($var)){
if($var[0] == "Скажи2") say($var[1],2);
}
$skip=true;
Вариант, подправленный ИИ
$var = explode(" ", $text, 2);

if (!empty($var) && isset($var[1])) {
// Приводим команду к нижнему регистру для надежности
$command = mb_strtolower($var[0]);

if ($command == "скажи") {
say($var[1], 5);
$skip = true; // Игнорируем дальнейшую обработку этого сообщения
}
}
Основной: Z99Le, Debian 10, модули на ESP-12F с собственной логикой. С сервером связаны, но работоспособны и без него.
Тестовый: Cubieboard2, Armbian Buster (сейчас Bionic) 5.4.y
V.A.S.t
Сообщения: 351
Зарегистрирован: Сб май 11, 2019 6:35 pm
Откуда: Иркутск

Re: [Модуль] VK мессенджер (vkmessenger)

Сообщение V.A.S.t »

Адаптировал клавиатуру для Простых устройств из ветки модуля Телеграм
menu.jpg
menu.jpg (14.44 КБ) 472 просмотра
Создаем callback-кнопку "Устройства". Добавляем в поле "Данные" строчку

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

callSD_home_0
Далее, в Событиях создаем callback событие со следующим кодом

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

if (strpos($callback, 'callSD_') !== false) {
 $skip = true;
 $attachments = array();
//разбираем строку на составляющие
 $cmd = explode("_", $callback);
 $title_kb = "";
 if ($cmd[1] == 'home'){
  $run = hex2bin('F09F8F83');
  $rooms = getObjectsByClass("Rooms");
  $title_kb = "<b>"."Комнаты"."</b>";
  foreach ($rooms as $room) {
    $room_text= getObject($room['TITLE'])->description;
    if (gg($room['TITLE'].".SomebodyHere")==1) $room_text.= " ".$run;
    $buttons[] = $this->buildKeyBoardButton($room_text,'callback',"callSD_room_".$room['TITLE']."_".$cmd[2], 'primary');
  }
 //так как максимально количество кнопок - 10, разбиваем кнопки на "страницы" и подгружаем необходимую, передавая во все кнопки номер текущей страницы
  $buttons_all = $buttons;
  if(count($buttons_all) > 8) {
  //если страниц больше одной, разбиваем массив кнопок на страницы
  $buttons_pages = array_chunk(array_slice($buttons_all, 9), 8);
  //на первой странице 9 кнопок, место для кнопки "Далее" или "Выход"
  	if($cmd[2] == 0) $buttons = array_slice($buttons_all, 0, 9);
  //для остальных 8 кнопок берем из подкотовленного массива, место для кнопок "Назад" и "Далее"
    else $buttons = $buttons_pages[$cmd[2]-1];
  //если это не первая страница - делаем кнопку "Назад"
    if($cmd[2] != 0)$buttons[] = $this->buildKeyBoardButton("Назад",'callback', 'callSD_home_'.$cmd[2]-1, 'secondary');
  //если не последняя - делаем кнопку "Вперёд"
  	if (isset($buttons_pages[$cmd[2]]))$buttons[] = $this->buildKeyBoardButton("Далее",'callback', 'callSD_home_'.$cmd[2]+1, 'secondary');
  }
 //если на странице меньше 10 кнопок, то есть страница последняя, добавляем кнопку "Выход"
  if(count($buttons) < 10) $buttons[] = $this->buildKeyBoardButton("Выход",'callback', 'callSD_exit', 'negative');
 }
 else if ($cmd[1] == 'room' or $cmd[1] == 'device' or $cmd[1] == 'lock'){
  $room = $cmd[2];
  $off = hex2bin('F09F8C91');
  $on  = hex2bin('F09F8C95');
  if ($cmd[1] == 'device' or $cmd[1] == 'lock'){
  	if ($cmd[1] == 'device'){
  	   $text = getObject($cmd[2])->description;
  	   if (gg($cmd[2].".status") == 1) $text .= " выключен ". $off;
 		 else $text .= " включен ". $on;
  	} else if ($cmd[1] == 'lock'){
  	   if (gg($cmd[2].".lockstatus")) $text .= "Замок открыт ". hex2bin('F09F9493');
 		 else $text .= "Замок закрыт ". hex2bin('F09F9492');
  	}
  	cm($cmd[2].".switch");
  	$this->sendAnswerCallbackQuery($user_id, $event_id, $text);
  	$room = gg($cmd[2].".linkedRoom");
  }
  // кнопки устройств в комнате
    $title_kb = "<b>".gg($room.".Title")."</b>";
    $temp = '';
    $humidity = '';
 	$co2 = '';
 	$door = '';
    $objects = getObjectsByProperty("linkedRoom", "=", $room);
  	foreach($objects as $object) {
      $device = SQLSelectOne("SELECT * FROM devices WHERE LINKED_OBJECT='".$object."'");
      if($device['TYPE'] == 'sensor_temp' or $device['TYPE'] == 'sensor_temphum') $temp.= gg($object.'.value')."°C "; 
      if($device['TYPE'] == 'sensor_humidity') $humidity.= gg($object.'.value')."% ";
      else if($device['TYPE'] == 'sensor_temphum')  $humidity.= gg($object.'.valueHumidity')."% ";
      else if($device['TYPE'] == 'sensor_co2')  $co2.= gg($object.'.value')."ppm ";
      else if($device['TYPE'] == 'openclose' or $device['TYPE'] == 'unlockable'){
      	$oc = gg($object . '.ncno') == 'nc' ? 1 - gg($object . '.status') : gg($object . '.status');
      	if($oc) $door.=' Открыта';
        else $door.=' Закрыта';
      	if($device['TYPE'] == 'unlockable'){
          if(gg($object . '.lockstatus')){
          	 $state = hex2bin('F09F9492');
          	 $color = 'negative';
          } else {         
          	$state = hex2bin('F09F9493');
            $color = 'positive';
          }
         $buttons[] = $this->buildKeyBoardButton($state.$device['TITLE'], 'callback', "callSD_lock_".$object."_".$cmd[3], $color);
        }
      }
      else if($device['TYPE'] == 'relay' or $device['TYPE'] == 'dimmer' or $device['TYPE'] == 'rgb' or $device['TYPE'] == 'openable'){
        $state = $off;
        $color = 'primary';
        if($device['TYPE'] == 'openable') $status = !gg($object . '.status');
        else $status = gg($object.".status");
 	  	if ($status){
          $state = $on;
          $color = 'positive';
        }
        $buttons[] = $this->buildKeyBoardButton($state.$device['TITLE'], 'callback', "callSD_device_".$object."_".$cmd[3], $color);
      } else if($device['TYPE'] == 'camera'){
        $buttons[] = $this->buildKeyBoardButton(hex2bin('F09F8EA5').$device['TITLE'], 'callback', "callSD_camera_".$object."_".$cmd[3]."_".$cmd[2], 'primary');
      }
    }
 	if($temp != '') $title_kb .= "\n".hex2bin('F09F8CA1')." ".$temp;
    if($humidity != '') $title_kb .= "\n".hex2bin('F09F92A6')." ".$humidity;
    if($co2 != '') $title_kb .= "\nCO2 ".$co2;
    if($door != '') $title_kb .= "\n".hex2bin('F09F9AAA')." ".$door;
    $buttons[] = $this->buildKeyBoardButton("Назад",'callback', 'callSD_home_'.$cmd[3], 'secondary');
    $buttons[] = $this->buildKeyBoardButton("Выход",'callback', 'callSD_exit', 'negative');
 }
 else if ($cmd[1] == 'camera') {
  $this->sendAction($chat_id,"photo");
  $title_kb = "<b>".$cmd[2]."</b>";
  $url = BASE_URL.gg($cmd[2].".snapshotPreviewURL");
  $image_path = CASH_PATH.$cmd[2].".jpg";
  $this->writeLog($image_path);
  try {
         $data = file_get_contents($url);
         $i = strlen($data);
         $handle = fopen($image_path, "w");
         fwrite($handle, $data);
         fclose($handle);
     } catch (Exception $e) {
             echo 'Caught exception: ',  $e->getMessage(), "\n";
     }
  $buttons[] = $this->buildKeyBoardButton("Назад",'callback', 'callSD_room_'.$cmd[4].'_'.$cmd[3], 'secondary');
  $buttons[] = $this->buildKeyBoardButton("Выход",'callback', 'callSD_exit', 'negative');
  $attachments = $this->attachPhoto($this->config['GROUP_ID'], $image_path);
 }
 if ($cmd[1] == 'exit'){
 	$this->messageDelete($user_id, $message_id);
 } else {
   $keyboard = $this->buildInlineKeyBoard($buttons, 22222);
 //если нет $message_id, значит вызов не из инлайн-клавиатуры - отправляем сообщение
   if(empty($message_id)) $this->sendMessage($user_id, $title_kb, $keyboard, '', $attachments);
 //иначе - редактируем сообщение
   else $this->messageEdit($user_id, $message_id, $title_kb, $keyboard, '', $attachments);
 }
}
Здесь происходит вся "магия": формируются клавиатуры, выполняются действия.
Ограничение только одно - не более 10 устройств на комнату!
Это продиктовано ограничениями inline-клавиатур в 10 кнопок.
Файлы для импорта:
Button_VKmessenger_Устройства.txt
(226 байт) 3 скачивания
Event_VKmessenger_CallbackSD.txt
(7.45 КБ) 3 скачивания
Последний раз редактировалось V.A.S.t Пн май 04, 2026 11:58 am, всего редактировалось 5 раз.
V.A.S.t
Сообщения: 351
Зарегистрирован: Сб май 11, 2019 6:35 pm
Откуда: Иркутск

Re: [Модуль] VK мессенджер (vkmessenger)

Сообщение V.A.S.t »

Вот более простое меню на две кнопки. Объекты надо задавать самостоятельно!
menu.jpg
menu.jpg (14.41 КБ) 472 просмотра
Кнопка callback

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

$button1 = "svetTeh";
$button2 = "Relay12";
$off = hex2bin('F09F8C91');
$on = hex2bin('F09F8C95');
$ts = $off;
$ks = $off;
$sc = 'negative';
$nc = 'negative';
if (gg($button1.".status")){
	$ts = $on;
	$sc = 'positive';
}
if (gg( $button2.".status")){
	$ks = $on;
	$nc = 'positive';
}
$buttons[] = $this->buildKeyBoardButton('Свет  ' . $ts, 'callback', $button1, $sc);
$buttons[] = $this->buildKeyBoardButton('Настолка  ' . $ks, 'callback', $button2, $nc);
$buttons[] = $this->buildKeyBoardButton('Выход', 'callback', 'svet_exit', 'primary');
$keyboard = $this->buildInlineKeyBoard($buttons, 21);
$this->sendMessageToUser($user_id, "Управление светом:", $keyboard);
Событие callback

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

if (strpos($callback, 'svet_') !== false) {
	$button1 = "svetTeh";
	$button2 = "Relay12";
	if($callback !='svet_exit'){
     	$cmd = explode("_", $callback);
		cm($cmd[1].'.switch');
		$off = json_decode('"'.'\ud83c\udf11'.'"');
		$on = json_decode('"'.'\uD83C\uDF15'.'"');
		$ts = $ks = $off;
		$sc = $nc = 'negative';
    	$event = 'выключен!  ' . $off;
		if (gg($button1.".status")){
			$ts = $on;
			$sc = 'positive';
        	$event = 'включен!  ' . $on;
		}
		if (gg($button2.".status")){
			$ks = $on;
			$nc = 'positive';
       		$event = 'включен!  ' . $on;
		}
		$this->sendAnswerCallbackQuery($user_id, $event_id, "Свет ".$event);
		$buttons[] = $this->buildKeyBoardButton('Свет  ' . $ts, 'callback', "svet_".$button1, $sc);
		$buttons[] = $this->buildKeyBoardButton('Настолка  ' . $ks, 'callback', "svet_".$button2, $nc);
		$buttons[] = $this->buildKeyBoardButton('Выход', 'callback', 'svet_exit', 'primary');
		$keyboard = $this->buildInlineKeyBoard($buttons, 21);
		$this->messageEdit($user_id, $message_id, "Управление светом:", $keyboard);
    }
	else $this->messageDelete($user_id, $message_id);
}
Файлы для экспорта
Command_VKmessenger_Свет.txt
(973 байт) 11 скачиваний
Event_VKmessenger_Свет.txt
(1.38 КБ) 12 скачиваний
Ответить