Приветствую. В данной теме я поведую вам как сделать бота для группы ВК используя C# и Longpoll. Буквально три часа назад ВК отключили секцию Messages. Это значит, что бота для страницы сделать не получится (просто предупреждаю). Ах да, нам так же понадобится библиотека VkNet. Установка VkNet 1. Создаем консольное приложение 2. Открываем консоль Nuget 3. Вводим команду - Install-Package VkNet -Version 1.42.0 Для начала расскажу, как работает Longpoll, его преимущества и недостатки, и почему он не лучший вариант для группы. Такого бота можно будет запустить прямо на своем компьютере (или на дедике), а не ставить на сервер (как в случае с Callback). Т.е. бот постоянно делает запросы на сервер ВК и ждет, пока ВК ответит ему, если случилось какое-нибудь событие. Но проблема заключается в том, что скорость работы Longpoll'а зависит от скорости вашего интернета. Конечно, бота можно будет поставить на дедик, где инет очень быстрый, но при больших нагрузках бот может пропустить чье-либо сообщение, потому что не успеет послать запрос в это время. Так что лучше всего для бота подойдет Callback API, про него я напишу в другой статье, а пока Longpoll. Ну штош, начнем. 1. Для начала открываем вашу любимую IDE (среда разработки) и создаем консольное приложение на C# (проект). Думаю, как это делать показывать не требуется. 2. Для начала нам надо авторизоваться используя API ключ вашей группы ВК (токен) В классе программы создаем переменную для работы с VK API. (Обязательно в классе, чтобы можно было использовать ее в других методах) public static VkApi api = new VkApi(); Код public static VkApi api = new VkApi(); Сама авторизация: api.Authorize(new ApiAuthParams() { AccessToken = ТокенГруппыВк }); Код api.Authorize(new ApiAuthParams() { AccessToken = ТокенГруппыВк }); Теперь в бесконечном цикле while(true) мы будем отправлять запросы на сервер ВК. Цикл while (true) // Бесконечный цикл, получение обновлений { var s = api.Groups.GetLongPollServer(ID Вашей группы); var poll = api.Groups.GetBotsLongPollHistory( new BotsLongPollHistoryParams() { Server = s.Server, Ts = s.Ts, Key = s.Key, Wait = 25 }); if (poll?.Updates == null) continue; // Проверка на новые события } Код while (true) // Бесконечный цикл, получение обновлений { var s = api.Groups.GetLongPollServer(ID Вашей группы); var poll = api.Groups.GetBotsLongPollHistory( new BotsLongPollHistoryParams() { Server = s.Server, Ts = s.Ts, Key = s.Key, Wait = 25 }); if (poll?.Updates == null) continue; // Проверка на новые события } Поясняю. В переменную - s - записываются данные для подключения к серверу: сервер, ключ. Wait - время ожидания события. ВК рекомендует ставить 25 секунд. Т.е. бот отправляет запрос на сервер ВК и начинает ждать нового события 25 секунд. Ts - номер последнего события, начиная с которого нужно получать данные. Теперь надо проверять новые события. Проверка foreach (var a in poll.Updates) { if (a.Type == GroupUpdateType.MessageNew) { } } Код foreach (var a in poll.Updates) { if (a.Type == GroupUpdateType.MessageNew) { } } В цикле foreach переменная - a - как бы "копается" в новом событии. Далее, если вид нового события = новому сообщению, то уже происходит то, что вам надо. Вот, скелет нашего бота мы написали. 3. Как же отвечать на сообщения? Я записываю сообщение в строку, называйте ее как хотите, у меня это userMessage string userMessage = a.Message.Body.ToLower(); Код string userMessage = a.Message.Body.ToLower(); a.Message - это данные о сообщении. Уже из этих данных, посредством a.Message.Body мы извлекаем текст самого сообщения. .ToLower() понадобится нам, т.к. это преобразует сообщение в маленькие буквы. Это понадобится нам, что бы не учитывать регистр сообщения. К примеру, есть условие - если сообщение = "привет", то надо ответить "здарова!". Но, без .ToLower() данное условие может не сработать, т.к. человек может ввести "Привет", или "прИвЕт", что не подходит к условию (т.к. регистр отличается от того, что в условии). Надеюсь понятно объяснил. Так же, чтобы отвечать на сообщения, нам понадобится ID страницы человека, который, собственно, боту и написал. long? userID = a.Message.UserId Код long? userID = a.Message.UserId Опять же, извлекаем из данных о сообщении ID отправителя. Теперь дело за малым, остальная часть очень простая, она как конструктор. Сразу хочу сказать, что переменные userMessage и userID можно было не вводить, а сразу использовать a.Message.UserId и т.д., но мне так проще, и глазам приятней. Создаем условие, в котором будем проверять сообщение и выполнять команду. Проверка if (userMessage == "привет") { // Действие } Код if (userMessage == "привет") { // Действие } Как видите, все очень просто. Хочу предупредить, что если вы использовали .ToLower() при записи сообщения в строку, то в условии нужно всегда писать всё с маленькой буквы. 4. Чтобы сократить наш код, сделаем отдельный метод и назовем его, к примеру, SendMessage. Он будет заниматься отправкой сообщений в ответ. SendMessage public static void SendMessage(string message, long? userID) { Random rnd = new Random(); api.Messages.Send(new MessagesSendParams { RandomId = rnd.Next(), UserId = userID, Message = message }); } Код public static void SendMessage(string message, long? userID) { Random rnd = new Random(); api.Messages.Send(new MessagesSendParams { RandomId = rnd.Next(), UserId = userID, Message = message }); } Поскольку для отправки сообщения требуется само сообщение и ID пользователя, то сразу зададим их в переменной string message, long? userID. Далее создаем рандомное число, оно понадобится для RandomId, потому что, если мне не изменяет память, с версии API 5.80 этот параметр обязателен. Он нужен, чтобы избежать дублирования сообщений от бота. В параметр UserId передаем сам ID человека, которому надо ответить. В Message - сообщение для отправки. Теперь мы будем использовать этот метод передавая ему указанные параметры. Так, продолжим наше условие, теперь оно будет выглядеть так: Ответ if (userMessage == "привет") { SendMessage("Здарова!", userID) } Код if (userMessage == "привет") { SendMessage("Здарова!", userID) } Вот и все. Собственно, мы передаем сообщение для ответа и ID человека которому отвечаем На этом закончу свою первую часть, основу дал, дальше осуществлять бота очень легко. Во второй части планирую сделать логгирование действий. В третьей работу с БД и "админ-панель"
Годно, не спорю, но зачем использовать VkNet и тащить за своим ботом кучу лаб? Ведь куда проще можно использовать xNet, сделать нужные тебе методы и будет куда меньше мусора тащиться за твоим проектом. Это если что небольшое пожелание, а так не плохо.