Первый бот на PHP для ВКонтакте

Здравствуйте, хабровчане. В этой публикации я напишу о том, как сделать своего первго чат-бота для ВКонтакте. Думаю, что опытным программистам это будет не интересно, а вот тем, кто только начинает свой путь, будет интересно, так как я ещё и сам не очень далеко ушёл и понимаю проблемы начинающих. И предупреждаю сразу, что большинство скриншотов будет на английском языке.

Сперва нам нужно создать сообщество. Думаю, с этим справится каждый.
Затем мы заходим в настройки сообщества и выбираем пункт «API usage» и нажимаем на кнопку «Create token».
image
Далее нужно выбрать, собственно, чем мы сможем пользоваться с помощью этого токена. Нам нужен доступ к сообщениям сообщества, но можно выбрать все права доступа, чтобы в дальнейшем не вспонимать о создании токенов.
image
И вот мы получили заветный токен. Его, кстати, нужно сохранить в надёжное место и никому не показывать. Теперь можно приступать к коду.
image
Мы будем писать код на языке PHP, поэтому можно скачать Visual Studio code или PHPStorm. В принципе, код можно писать и в блокноте, только это будет не удобно. После кода мы перейдём к дальнейшей настройке группы.
Итак, для начала нам нужно получить информацию о входящем сообщении и перевести её из формата JSON в понятный для PHP.

<?php
$data = json_decode(file_get_contents('php://input'));
?>

В переменной data теперь к нас находится массив с сообщением, ID пользователя и ID чата.
«А что за „json_decode(file_get_contents(‘php://input’))“, — спросите вы.
Начнём с этого момента:

file_get_contents('php://input')

Выражаясь, простым языком, мы спрашиваем у скрипта что у нас пришло на вход, то есть какой запрос отправил ВК. Ниже приведу пример такого запроса.

{"type":"message_new","object":{"date":1568464037,"from_id":450829055,"id":5400,"out":0,"peer_id":450829055,"text":"Тестовое сообщение.","conversation_message_id":1478,"fwd_messages":[],"important":false,"random_id":0,"attachments":[],"is_hidden":false},"group_id":171524656}

Думаю, легко понять что написано в запросе, если иметь минимальные знания в английском языке.
Ну а „json_decode()“ — функция, которая переводит вышеприведённый JSON в массив, с которым может работать PHP.
Теперь напишем код, который смотрит какое событие произошло, и если к нам пришло новое сообщение, то сравнивает сообщение, с теми, на которые у нас есть ответ и смотрит ID чата.

<?php
$data = json_decode(file_get_contents('php://input'));
switch ($data->type) {
	case 'confirmation':
		echo $confirmation_token;
	break;
	case 'message_new':
		$message_text = $data -> object -> text;
		$message_text = $data -> object -> peer_id;
		if ($message_text == "привет"){
			// что-то происходит
		}
		if ($message_text == "пока"){
			// что-то происходит
		}
		echo 'ok';
	break;
}
?>

Теперь нам нужно как-то отвечать на эти сообщения. Для этого напишем простую функцию.

<?php
function vk_msg_send($peer_id,$text){
	$request_params = array(
		'message' => $text,
		'peer_id' => $peer_id,
		'access_token' => "TOKEN",
		'v' => '5.87'
	);
	$get_params = http_build_query($request_params);
	file_get_contents('https://api.vk.com/method/messages.send?'. $get_params);
}
?>

Что же тут происходит? Здесь мы строим запрос к API VK (документацию рекомендую почитать) с текстом сообщения, ID чата и токеном, который мы создали ранее, и отправляем его на сервер ВК.
Теперь соединим эти куски кода и напишем реакции бота на то или иное сообщение.

<?php
$confirmation_token = 'CONF_TOKEN'
function vk_msg_send($peer_id,$text){
	$request_params = array(
		'message' => $text,
		'peer_id' => $peer_id,
		'access_token' => "TOKEN",
		'v' => '5.87'
	);
	$get_params = http_build_query($request_params);
	file_get_contents('https://api.vk.com/method/messages.send?'. $get_params);
}
$data = json_decode(file_get_contents('php://input'));
switch ($data->type) {
	case 'confirmation':
		echo $confirmation_token;
	break;
	case 'message_new':
		$message_text = $data -> object -> text;
		$chat_id = $data -> object -> peer_id;
		if ($message_text == "привет"){
			vk_msg_send($chat_id, "Привет, я бот, который говорит две фразы.");
		}
		if ($message_text == "пока"){
			vk_msg_send($chat_id, "Пока. Если захочешь с кем-то поговорить, то у тебя есть бот, который говорит две фразы.");
		}
		echo 'ok';
	break;
}
?>

«Хорошо, а зачем нам писать ‘ok’ после отправки сообщения?»
Так как мы будем использовать метод получения обновлений с названием Call Back API, то есть сам ВКонтакте нам будет говорить о новых сообщениях, то нам нужно сказать, что мы его услышали, иначе он будет нам повторять несколько раз.
Теперь перейдём к настройке группы.
Заходим в настройки и выбираем версию API 5.87 (можно, конечно, и более новые версии, но лучше иметь единство версий API).
image
Из этого же раздела берём строку, которую должен вернуть сервер, и подставляем её в переменную confirmation_token.
После этого заполняем адрес сервера. Для этого нужно иметь домен и хостинг. По адресу, который Вы укажите, должен быть как раз файл с ботом. Надеюсь, с этим читатель справится сам.
Потом выбираем о каких событиях в сообществе нам будет сообщать ВКонтакте. Нам нужны только входящие сообщения.
image
Далее подтверждаем адрес сервера, и наш первый бот готов к использованию.
image