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


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



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

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

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


Получаем токен для работы с группами
  1. Отправляем запрос, просто вставляя в браузерную строку:
    https://oauth.vk.com/authorize?client_id=YOURAPPID&group_ids=YOURGROUPID6&display=page&scope=messages,wall,manage&response_type=token&v=5.92

    где YOURAPPID — id приложения, что мы нашли в предыдущем спойлере, а YOURGROUPID id — вашего сообщества.
  2. Даем доступ приложению
  3. И получаем такой ответ
    https://oauth.vk.com/blank.html#expires_in=0&access_token_YOURGROUPID=YOURTOKEN

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


Проще получаем токен
  1. Заходим в увправление сообществом


Настраиваем сообщество для работы с long poll
  1. Идем во вкладку управления нашим сообществом.
  2. Api Usage и в нем LongPoll Api
  3. Event types (события), в них отмечаем нужные, для тестов я бы отметил все.


Переходим к основной части:

Запускаем любимую ide, создаем консольное приложение на net core



Добавляем VkNet

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


Авторизуемся при помощи нашего токена:

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
});


Полученный код
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

И утянем на плату нужную директорию



Отправляемся по ssh и запускаем

chmod +x ConsoleApp1
./ConsoleApp1

Результат
Отправляем сообщение



Получаем сообщение в консоли



Получаем ответ



Диалог





К сожалению, не доступен сервер mySQL