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

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

Авторизуемся при помощи нашего токена:
И в бесконечном цикле будем получать обновления
Проверим пришло ли нам что-нибудь
Для всех полученных данных узнаем, является ли что-либо из этого сообщением, если да, то напечатаем его содержимое
И ответим пользователю тем же текстом
Соберем полученный код для нашей платы
И утянем на плату нужную директорию

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

Мысль про деплой
есть и много других вариантов ( к примеру поставить runtime), это один из них
Итак, разложим по полочкам.
Создаем приложение в вк
Вот тут подробная документация
- Для создания бота идем сюда
Нажимаем «создать приложение» и выбираем «Standalone Application». - Теперь переходим в управление и во вкладке Application Id запоминаем его Id. Оно нам дальше пригодится.

Получаем токен для работы с группами
- Отправляем запрос, просто вставляя в браузерную строку:
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 — вашего сообщества.
- Даем доступ приложению

- И получаем такой ответ
https://oauth.vk.com/blank.html#expires_in=0&access_token_YOURGROUPID=YOURTOKEN
Где токен будет очень длинной комбинацией латинских букв и цифр
Проще получаем токен
- Заходим в увправление сообществом
Настраиваем сообщество для работы с long poll
- Идем во вкладку управления нашим сообществом.
- Api Usage и в нем LongPoll Api
- 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
Результат
Отправляем сообщение

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

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

Диалог


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

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

Диалог

