/VKPageBot

Библиотека для более простого и быстрого создания ботов для личных страниц ВК

Primary LanguagePHPMIT LicenseMIT

Получить токен

Пример создания чат-бота

Обрабатываемые события

EVENT_UPDATE_FLAG_MESSAGE - обновилось состояние сообщения (например, прочитано или удалено)
EVENT_SET_FLAG_MESSAGE - установилось состояние сообщения
EVENT_REPLACE_FLAG_MESSAGE - изменилось состояние сообщения
EVENT_NEW_MESSAGE - новое сообщение (исходящие тоже тут есть, параметр outputOnly для "только входящие")
EVENT_READ_INPUT - входящее сообщение прочитано
EVENT_READ_OUTPUT - исходящее сообщение прочитано
EVENT_FRIEND_ONLINE - друг онлайн
EVENT_FRIEND_OFFLINE - друг оффлайн
EVENT_CHAT_CHANGE - изменен какой-либо из параметров беседы
EVENT_USER_WRITING - пользователь пишет в лс
EVENT_USER_CHAT_WRITING - пользователь пишет в беседе

Пример

Подробнее о событиях можно почитать тут

<?php
/**
 * @author AlexBrin
 */

// Пример создания простого чат-бота

require_once 'VKPageBot.php'; // Подключаем

class Bot extends VKPageBot { // Создаем наследника основной части бота

    // Создаем обработчик события
	public static function message($event, $config) { // Конфиг не обязательно, можно не указывать
		$messageId = array_shift($event); // Получаем данные из массива события
		$flag = array_shift($event); // Получаем данные из массива события
		$userId = array_shift($event);
		$timestamp = array_shift($event);
		$text = array_shift($event);
		$attachments = array_shift($event);

		$triggerMessage = null;
		foreach($config['triggers'] as $trigger => $response) { // Ищем совпадения из конфига
			$text = mb_strtolower($text);
			
			if(isset($response['users']) && is_array($response['users']) 
				&& count($response['users']) > 0 && !in_array($userId, $response['users']))
				continue;

			if(isset($response['strict']) && $response['strict']) {
				if($text != $trigger)
					continue;
			}
			elseif(strripos($text, trim($trigger)) === false) 
				continue;

			if(is_array($response['text'])) // Если вариантов несколько, то берем случайный
				$triggerMessage = $response['text'][array_rand($response['text'])];
			else
				$triggerMessage = $response['text'];
		}

		if(!$triggerMessage)
			return;

		Bot::getInstance()->sendMessage($triggerMessage, $userId, $messageId); // Отправляем сообщение
	}


	public static function friendOnline($event, $config) {
		$userId = abs(array_shift($event)); // Приходит -$userId
		$extra = array_shift($event); // тут мы можем узнать некоторые подробности

		print_r("Друг " . self::getInstance()->getUsername($userId) . " онлайн\n");
		print_r("Платформа: " . self::getInstance()->getPlatform($extra) . "\n");
	} 

	public static function readOutput($event, $config) {
		$peerId = array_shift($event);

		if($peerId > 0 && $peerId < 2000000000) {
			print_r(self::getInstance()->getUsername($peerId) . " прочитал сообщения\n");
		}
	}

	public static function userWriting($event) {
		$userId = array_shift($event);
		print_r(self::getInstance()->getUsername($userId) . " пишет сообщение\n");
	} 
	
	public static function userWritingTwo($event) {
	    print_r("Я второй обработчик \n");
	}

}



$bot = new Bot(); // Создаем экземпляр класса
// Регистрируем обработчики событий
// Первый - обработка сообщений
// Первый аргумент - ID события (подробнее в VKPageBot.php)
// Второй аргумент - название класса
// Третий аргумент -- название функции. Функция должна быть статична
$bot->addHandler(VKPageBot::EVENT_NEW_MESSAGE, 'Bot', 'message', [
	'inputOnly' => true // Указываем, что хотим читать только входящие сообщения
]);
// Регистрируем обработчик "друг онлайн"
$bot->addHandler(VKPageBot::EVENT_FRIEND_ONLINE, 'Bot', 'friendOnline');
// Регистрируем обработчич "Исходящее сообщение прочитали"
$bot->addHandler(VKPageBot::EVENT_READ_OUTPUT, 'Bot', 'readOutput');

// Регистрируем два обработчика "пользователь пишет в ЛС"
$bot->addHandler(VKPageBot::EVENT_USER_WRITING, 'Bot', 'userWriting');
$bot->addHandler(VKPageBot::EVENT_USER_WRITING, 'Bot', 'userWritingTwo');

// Запускаем бота
$bot->loop();

?>

Конфиг

token - токен ВК

forwardMessage - пересылать ли сообщение, на которое идет ответ

triggers - Это настройки для расширения из примера

"что ищем": {
    "text": "Что ответим"
},
"привет": {
    "text": ["вариант 1", "вариант 2", "выбирается случайно"]
},
"гыг": {
    "strict": true, // ответ будет только если в сообщение ничего больше не будет
    "text": "ыгы"
},
"я админ": {
    "users": [340494379], // ответ получит только пользователи с указанными ID
    "text": "да, ты одмэн"
}