Розробка

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

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

Думка про деплойє й багато інших варіантів ( наприклад поставити runtime), це один з них

Отже, розкладемо по поличках.

Створюємо додаток в вкОсь тут докладна документація

  1. Для створення бота йдемо сюди
    Натискаємо «створити додаток» і вибираємо «Application Standalone».
  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

РезультатВідправляємо повідомлення

Отримуємо повідомлення в консолі

Отримуємо відповідь

Діалог

Related Articles

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Check Also

Close
Close