Один Вк бот, один С# и апельсин

в 15:13, , рубрики: .net, bot, C#, Core, vkapi, Вконтакте API

Продолжая свои эксперименты с “умным” домом, ради забавы я решил добавить группу в Вк для управления некоторыми его характеристиками. Для данной статьи конкретизируем задачу: попробуем написать на языке с# простого бота, который будет отвечать от имени сообщества в вк, и рассмотрим, как быстро его запустить на arm32 (в моем случае на orange pi zero).
Один Вк бот, один С# и апельсин - 1

Мысль про деплой

есть и много других вариантов ( к примеру поставить runtime), это один из них

Итак, разложим по полочкам.

Создаем приложение в вк

Вот тут подробная документация

  1. Для создания бота идем сюда
    Нажимаем «создать приложение» и выбираем «Standalone Application».
  2. Теперь переходим в управление и во вкладке Application Id запоминаем его Id. Оно нам дальше пригодится. Один Вк бот, один С# и апельсин - 2

Получаем токен для работы с группами

  1. Отправляем запрос, просто вставляя в браузерную строку:
    https://oauth.vk.com/authorize?client_id=<b>YOURAPPID</b>&group_ids=<b>YOURGROUPID</b>6&display=page&scope=messages,wall,manage&response_type=token&v=5.92

    где YOURAPPID — id приложения, что мы нашли в предыдущем спойлере, а YOURGROUPID id — вашего сообщества.

  2. Даем доступ приложению Один Вк бот, один С# и апельсин - 3
  3. И получаем такой ответ
    https://oauth.vk.com/blank.html#expires_in=0&access_token_YOURGROUPID=YOURTOKEN

    Где токен будет очень длинной комбинацией латинских букв и цифр

Проще получаем токен
  1. Заходим в увправление сообществом
  2. Один Вк бот, один С# и апельсин - 4
  3. Один Вк бот, один С# и апельсин - 5

Настраиваем сообщество для работы с long poll

  1. Идем во вкладку управления нашим сообществом.
  2. Api Usage и в нем LongPoll Api Один Вк бот, один С# и апельсин - 6
  3. Event types (события), в них отмечаем нужные, для тестов я бы отметил все.

Переходим к основной части:
Запускаем любимую ide, создаем консольное приложение на net core
Один Вк бот, один С# и апельсин - 7

Добавляем VkNet

спойлер

К сожалению на вики документация немного устарела. Одна из причин создания этого гайда.
Но есть отличная поддержка здесь.

Один Вк бот, один С# и апельсин - 8
Авторизуемся при помощи нашего токена:

var api = new VkApi();
api.Authorize(new ApiAuthParams(){AccessToken =MyAppToken }); 

И в бесконечном цикле будем получать обновления

 while (true)
  {
      var s = api.Groups.GetLongPollServer(api.MyGroupId);
      var poll = api.Groups.GetBotsLongPollHistory(
              new BotsLongPollHistoryParams()
             {Server = s.Server, Ts = s.Ts, Key = s.Key, Wait = 1});
 }

Проверим пришло ли нам что-нибудь

if(poll?.Updates== null) continue;

Для всех полученных данных узнаем, является ли что-либо из этого сообщением, если да, то напечатаем его содержимое

 foreach (var a in poll.Updates)
  {
      if (a.Type == GroupUpdateType.MessageNew)
    {
        Console.WriteLine(a.Message.Body);
      }
   }

И ответим пользователю тем же текстом

 api.Messages.Send(new MessagesSendParams()
{
     UserId = a.Message.UserId,
     Message = a.Message.Body
});
Полученный код

class Program
    {
        public static string MyAppToken =>
            "f6bf5e26*************************************************************";
        public static ulong MyGroupId => 10******;
        static void Main(string[] args)
        {
            var api = new VkApi();
            api.Authorize(new ApiAuthParams(){AccessToken =MyAppToken });    
            
            while (true)
            {
                var s = api.Groups.GetLongPollServer(MyGroupId);
                var poll = api.Groups.GetBotsLongPollHistory(
                                      new BotsLongPollHistoryParams()
                    {Server = s.Server, Ts = s.Ts, Key = s.Key, Wait = 1});               
                if(poll?.Updates== null) continue;
                  foreach (var a in poll.Updates)
                  {
                      if (a.Type == GroupUpdateType.MessageNew)
                      {
                          Console.WriteLine(a.Message.Body);
                          api.Messages.Send(new MessagesSendParams()
                          {
                              UserId = a.Message.UserId,
                              Message = a.Message.Body
                          });
                      }

                  }
                
            }
        }
    }

Соберем полученный код для нашей платы

dotnet publish . -r linux-arm

И утянем на плату нужную директорию
Один Вк бот, один С# и апельсин - 9
Отправляемся по ssh и запускаем

chmod +x ConsoleApp1
./ConsoleApp1

Результат

Отправляем сообщение
Один Вк бот, один С# и апельсин - 10
Получаем сообщение в консоли
Один Вк бот, один С# и апельсин - 11
Получаем ответ
Один Вк бот, один С# и апельсин - 12
Диалог
Один Вк бот, один С# и апельсин - 13

Автор: Larymar

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js