Продолжая свои эксперименты с “умным” домом, ради забавы я решил добавить группу в Вк для управления некоторыми его характеристиками. Для данной статьи конкретизируем задачу: попробуем написать на языке с# простого бота, который будет отвечать от имени сообщества в вк, и рассмотрим, как быстро его запустить на arm32 (в моем случае на orange pi zero).
Итак, разложим по полочкам.
- Для создания бота идем сюда
Нажимаем «создать приложение» и выбираем «Standalone Application». - Теперь переходим в управление и во вкладке Application Id запоминаем его Id. Оно нам дальше пригодится.
- Отправляем запрос, просто вставляя в браузерную строку:
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 — вашего сообщества.
- Даем доступ приложению
- И получаем такой ответ
https://oauth.vk.com/blank.html#expires_in=0&access_token_YOURGROUPID=YOURTOKEN
Где токен будет очень длинной комбинацией латинских букв и цифр
- Заходим в увправление сообществом
- Идем во вкладку управления нашим сообществом.
- Api Usage и в нем LongPoll Api
- Event types (события), в них отмечаем нужные, для тестов я бы отметил все.
Переходим к основной части:
Запускаем любимую ide, создаем консольное приложение на net core
Добавляем VkNet
Но есть отличная поддержка здесь.
Авторизуемся при помощи нашего токена:
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
И утянем на плату нужную директорию
Отправляемся по ssh и запускаем
chmod +x ConsoleApp1
./ConsoleApp1
Получаем сообщение в консоли
Получаем ответ
Диалог
Автор: Larymar