Pull to refresh

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

Reading time 3 min
Views 12K
Продолжая свои эксперименты с “умным” домом, ради забавы я решил добавить группу в Вк для управления некоторыми его характеристиками. Для данной статьи конкретизируем задачу: попробуем написать на языке с# простого бота, который будет отвечать от имени сообщества в вк, и рассмотрим, как быстро его запустить на 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 }); 

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

var s = api.Groups.GetLongPollServer(MyGroupId); 
while (true)
  {
      
      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 });    
             var s = api.Groups.GetLongPollServer(MyGroupId);
            while (true)
            {
               try
                {
                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
                          });
                      }

                  }
                
            }
          }
        }
        catch (LongPollException exception)
                {
                    if (exception is LongPollOutdateException outdateException)
                        server.Ts = outdateException.Ts;
                    else
                    {
                        s = api.Groups.GetLongPollServer(MyGroupId);
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
    }


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

dotnet publish . -r linux-arm

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



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

chmod +x ConsoleApp1
./ConsoleApp1

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



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



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



Диалог


Tags:
Hubs:
+15
Comments 9
Comments Comments 9

Articles