Загрузка...

C# | Бот для группы ВК на Longpoll api - [1 часть]

Тема в разделе C# создана пользователем Shellar 2 мар 2019. 7511 просмотров

Опрос

Делать вторую часть?

  1. Дыа)0

    12
    85,7%
  2. Нет

    2
    14,3%
  1. Shellar
    Shellar Автор темы 2 мар 2019 Заблокирован(а)
    Приветствую. В данной теме я поведую вам как сделать бота для группы ВК используя 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. (Обязательно в классе, чтобы можно было использовать ее в других методах)
    Код
    public static VkApi api = new VkApi();
    Сама авторизация:
    Код
    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; // Проверка на новые события
    }
    Поясняю. В переменную - s - записываются данные для подключения к серверу: сервер, ключ.
    Wait - время ожидания события. ВК рекомендует ставить 25 секунд. Т.е. бот отправляет запрос на сервер ВК и начинает ждать нового события 25 секунд.
    Ts - номер последнего события, начиная с которого нужно получать данные.

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

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

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

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

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

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

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

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

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

    }
    Поскольку для отправки сообщения требуется само сообщение и ID пользователя, то сразу зададим их в переменной string message, long? userID.

    Далее создаем рандомное число, оно понадобится для RandomId, потому что, если мне не изменяет память, с версии API 5.80 этот параметр обязателен. Он нужен, чтобы избежать дублирования сообщений от бота.
    В параметр UserId передаем сам ID человека, которому надо ответить.
    В Message - сообщение для отправки.

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

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

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

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