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

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

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

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

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

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


Получаем токен для работы с группами
  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. Даем доступ приложению wpp1f2yxdqaooshlvfmqe4jh_c8.png
  3. И получаем такой ответ
    https://oauth.vk.com/blank.html#expires_in=0&access_token_YOURGROUPID=YOURTOKEN
    

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


Проще получаем токен
  1. Заходим в увправление сообществом
  2. lbb6gli5ejjnrh3_-mhbb4eqq5o.png
  3. kt4wthkbwwev_j58lykm5zsc_j8.png


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


Переходим к основной части:
Запускаем любимую ide, создаем консольное приложение на net core
tvpr4paeuje6jx28mn2g4khgjjw.png

Добавляем VkNet

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

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

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


И утянем на плату нужную директорию
cv322lrqoalsiub8gyzexhe6tv8.png
Отправляемся по ssh и запускаем

chmod +x ConsoleApp1
./ConsoleApp1


Результат
Отправляем сообщение
n-tb4fc0eh0dkgslplrnwjc2ywy.png
Получаем сообщение в консоли
frhomudmdiqpp21krnn8fjacijo.png
Получаем ответ
jo35cp_nmck1vaqpjcvmvbklifs.png
Диалог
6gvyoowm7jdp1mmyen41xlrmsnu.png

© Habrahabr.ru