Загрузка...

C# | Bot for VK group on Longpoll api - [1 part]

Thread in C# created by Shellar Mar 2, 2019. 7533 views

The poll
Делать вторую часть?
  1. Дыа)0

    85.7%
    12
  2. Нет

    14.3%
    2
  1. Shellar
    Shellar Topic starter Mar 2, 2019 Banned
    Приветствую. В данной теме я поведую вам как сделать бота для группы ВК используя C# и Longpoll. Буквально три часа назад ВК отключили секцию Messages. Это значит, что бота для страницы сделать не получится (просто предупреждаю).

    Ах да, нам так же понадобится библиотека VkNet.

    1. Создаем консольное приложение
    2. Открываем консоль Nuget
    3. Вводим команду - Install-Package VkNet -Version 1.42.0

    [IMG]

    Для начала расскажу, как работает Longpoll, его преимущества и недостатки, и почему он не лучший вариант для группы.
    Такого бота можно будет запустить прямо на своем компьютере (или на дедике), а не ставить на сервер (как в случае с Callback). Т.е. бот постоянно делает запросы на сервер ВК и ждет, пока ВК ответит ему, если случилось какое-нибудь событие.

    Но проблема заключается в том, что скорость работы Longpoll'а зависит от скорости вашего интернета. Конечно, бота можно будет поставить на дедик, где инет очень быстрый, но при больших нагрузках бот может пропустить чье-либо сообщение, потому что не успеет послать запрос в это время.
    Так что лучше всего для бота подойдет Callback API, про него я напишу в другой статье, а пока Longpoll.

    Ну штош, начнем.

    1. Для начала открываем вашу любимую IDE (среда разработки) и создаем консольное приложение на C# (проект). Думаю, как это делать показывать не требуется.

    2. Для начала нам надо авторизоваться используя API ключ вашей группы ВК (токен)
    В классе программы создаем переменную для работы с VK API. (Обязательно в классе, чтобы можно было использовать ее в других методах)
    Code
    public static VkApi api = new VkApi();
    Сама авторизация:
    Code
    api.Authorize(new ApiAuthParams() { AccessToken = ТокенГруппыВк  });
    Теперь в бесконечном цикле while(true) мы будем отправлять запросы на сервер ВК.
    Code
    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 - номер последнего события, начиная с которого нужно получать данные.

    Теперь надо проверять новые события.
    Code
    foreach (var a in poll.Updates)
    {
    if (a.Type == GroupUpdateType.MessageNew)
    {

    }
    }
    В цикле foreach переменная - a - как бы "копается" в новом событии. Далее, если вид нового события = новому сообщению, то уже происходит то, что вам надо.
    Вот, скелет нашего бота мы написали.

    3. Как же отвечать на сообщения?

    Я записываю сообщение в строку, называйте ее как хотите, у меня это userMessage
    Code
    string userMessage = a.Message.Body.ToLower();
    a.Message - это данные о сообщении. Уже из этих данных, посредством a.Message.Body мы извлекаем текст самого сообщения.

    .ToLower() понадобится нам, т.к. это преобразует сообщение в маленькие буквы.
    Это понадобится нам, что бы не учитывать регистр сообщения.
    К примеру, есть условие - если сообщение = "привет", то надо ответить "здарова!". Но, без .ToLower() данное условие может не сработать, т.к. человек может ввести "Привет", или "прИвЕт", что не подходит к условию (т.к. регистр отличается от того, что в условии). Надеюсь понятно объяснил.

    Так же, чтобы отвечать на сообщения, нам понадобится ID страницы человека, который, собственно, боту и написал.
    Code
    long? userID = a.Message.UserId
    Опять же, извлекаем из данных о сообщении ID отправителя.

    Теперь дело за малым, остальная часть очень простая, она как конструктор. Сразу хочу сказать, что переменные userMessage и userID можно было не вводить, а сразу использовать a.Message.UserId и т.д., но мне так проще, и глазам приятней.

    Создаем условие, в котором будем проверять сообщение и выполнять команду.
    Code
    if (userMessage == "привет")
    {
    // Действие
    }
    Как видите, все очень просто.
    Хочу предупредить, что если вы использовали .ToLower() при записи сообщения в строку, то в условии нужно всегда писать всё с маленькой буквы.

    4. Чтобы сократить наш код, сделаем отдельный метод и назовем его, к примеру, SendMessage. Он будет заниматься отправкой сообщений в ответ.
    Code
    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 - сообщение для отправки.

    Теперь мы будем использовать этот метод передавая ему указанные параметры.

    Так, продолжим наше условие, теперь оно будет выглядеть так:
    Code
    if (userMessage == "привет") 
    {
    SendMessage("Здарова!", userID)
    }
    Вот и все. Собственно, мы передаем сообщение для ответа и ID человека которому отвечаем

    На этом закончу свою первую часть, основу дал, дальше осуществлять бота очень легко.

    Во второй части планирую сделать логгирование действий.
    В третьей работу с БД и "админ-панель"
     
  2. OlegBekker
    много читать но вроде годно, лайк
     
  3. issur
    issur Mar 7, 2019 15 Dec 28, 2018
    годно
     
  4. issur
    issur Mar 7, 2019 15 Dec 28, 2018
    когда вторая часть ?
     
  5. Shellar
    Shellar Topic starter Mar 8, 2019 Banned
    Сделал
     
  6. sashf1999
    sashf1999 Mar 8, 2019 Сделаю софт на заказ: https://goo.gl/2R9Ffs 3 Mar 26, 2018
    Годно, не спорю, но зачем использовать VkNet и тащить за своим ботом кучу лаб? Ведь куда проще можно использовать xNet, сделать нужные тебе методы и будет куда меньше мусора тащиться за твоим проектом. Это если что небольшое пожелание, а так не плохо.
     
  7. Cal_inactive496112
    Зачем использовать с++ давай юзать ассемблер :forsenGun::admin::admin::admin::admin:
     
  8. sashf1999
    sashf1999 Mar 21, 2019 Сделаю софт на заказ: https://goo.gl/2R9Ffs 3 Mar 26, 2018
    А ты я вижу знаешь толк в извращениях:thinking:
     
Top
Loading...