Склад мемів або Бот для Telegram — Частина 1

Здравствуйте, шановні хабравчане!

У цій статті для новачків, я покажу вам, як легко і просто створити свого бота для Telegram. Писати будемо на мові C#. Бот буде колекціонувати картинки, і видавати їх на першу вимогу користувача. Мій варіант бота буде зберігати картинки мемів і назва у нього буде відповідне.

Кому стало цікаво, прошу просимо під кат.


Народження бота

Запускаємо месенджер Telegram і в пошукову рядок вводимо «botfather». У перекладі з англійської «батько ботів».



Натискаємо кнопку Start. Батько ботів відразу вивів список доступних команд.



Нам потрібна команда для створення бота "/newbot".



Батько ботів просить придумати прізвисько для нового бота. Я назву його «Склад мемів».



Тепер потрібно придумати його username. Воно обов'язково повинно закінчуватися, словом bot. Username я придумав заздалегідь, перебравши до цього сотні комбінацій.



Батько ботів вітає з успішним створенням бота і видає токен для управління ним. Тепер потрібно описати, чим займається бот. Робиться це через команду "/setdescription".



Встановимо аватарку для бота командою "/setuserpic".



Командою "/setinline" задамо текст підказки, яка з'явиться, коли ми звернемося до боту в режимі inline.



А ось так буде виглядати результат звернення в цьому режимі:



Для зручності користувача перерахуємо команди, які бот буде розуміти. Робиться це через команду "/setcommands". Підказка зі списком команд буде з'являтися після введення символу "/".



Ось так виглядають підказки на практиці:



Установка бібліотеки

Для роботи з Telegram API нам потрібна бібліотека. Можна звичайно піти по хардкору і написати її самому, але ми йдемо по простому шляху. В інтернеті є кілька різновидів таких бібліотек для C#. Мій вибір припав на проект з назвою «Telegram.Bot». На момент написання статті, ця бібліотека була найпопулярнішою.

Посилання на проект



Що б не морочитися з установкою, я скористався консолі диспетчера пакетів NuGet. За допомогою цього диспетчера, можна з легкістю завантажити і підключити до проекту більшість існуючих бібліотек. До того ж він докачає всі необхідні залежності. Оновлення вже підключеної бібліотеки відбувається так само просто. Ммм… звучало як реклама…

Команда установки бібліотеки через консоль диспетчера пакетів NuGet:
Install-Package Telegram.Bot


Якщо ви ніколи не користувалися консоллю NuGet в Visual Studio, відкрити її дуже просто.



Вводимо команду і тиснемо Enter. Все інше NuGet зробить за вас.




Пишемо код

Всі умови створені, приступаємо до написання коду. Переходимо в клас «Program».
Оголосимо приватну статичну змінну тільки для читання з типом TelegramBotClient з назвою bot.
Присвоїмо їй новий об'єкт цього ж типу. В аргументах конструктора потрібно вказати токен. Його нам видав батько ботів при створенні бота.

private static readonly TelegramBotClient bot = new TelegramBotClient("<токен>");

У точці входу в програму, вішаємо на бота обробник подій OnMessage.

bot.OnMessage += Bot_OnMessage;

Це подія виникає, коли користувач щось відправив боту. Будь це текст, зображення, файл і т. д. В оброблювачі обробляємо отримане повідомлення.

private static async void Bot_OnMessage(object sender, Telegram.Bot.Args.MessageEventArgs e)
{
Message msg = e.Message;

if (msg == null) return;
//...
}

Якщо повідомлення порожнє, то виходимо з методу. Введемо умову спрацьовує, якщо повідомлення містить текст.

if (msg.Type == MessageType.TextMessage)
{
//...
}

Бот буде відправляти повідомлення асинхронно, тобто відправлення запиту, не заморожувати поточний потік, а буде створювати новий. Іншими словами, програма не буде виснути. З цієї причини, методу обробки події потрібно присвоїти модифікатор async. А там де буде відбуватися виклик асинхронного методу, потрібно спочатку поставити ключове слово await.

await bot.SendTextMessageAsync(msg.Chat.Id "Hello, " + msg.From.FirstName + "!");

Асинхронно відправляємо текстове повідомлення користувачеві. Першим аргументом методу вказується ідентифікатор чату адресата. Другим – сам текст повідомлення. Для перевірки роботи бота, ми написали свій HelloWorldз блекджек і пляшками. Бот буде вітати користувача, звертаючись до нього по імені.
Ось так виглядає код методу Bot_OnMessage:

private static async void Bot_OnMessage(object sender, Telegram.Bot.Args.MessageEventArgs e)
{
Message msg = e.Message;

if (msg == null) return;

// Якщо текстове повідомлення
if (msg.Type == MessageType.TextMessage)
{
await bot.SendTextMessageAsync(msg.Chat.Id "Hello, " + msg.From.FirstName + "!");
}
}

Перед запуском потрібно ще написати пару рядків коду в точці входу в програму.

...
bot.SetWebhookAsync();
...

Так як наш бот не буде жити на веб-хостингу, а буде існувати у вигляді консольного додатка на звичайному комп'ютері, потреба у WebHook повністю відпадає. Повідомлення від користувачів бот буде отримувати самостійно, посилаючи відповідний запит на сервер Telegram. Тому в аргументах методу SetWebhookAsync ми нічого не пишемо, але викликати цей метод необхідно, інакше ми не зможемо отримувати повідомлення від користувачів.

var me = bot.GetMeAsync().Result;
Console.Title = me.Username;

Далі, отримуємо ім'я бота і відображаємо його у назві вікна консолі. Таким чином, ми будемо знати, що бот готовий до роботи і що це не той бот із сотні інших роботів, що ми створили раніше.

bot.StartReceiving();
Console.ReadLine();
bot.StopReceiving();

Дозволяємо прийом повідомлень, до тих пір, поки не натиснута будь-яка клавіша клавіатури. Після чого зупиняємо прийом повідомлень і завершуємо виконання програми. Ви можете зробити це по-своєму, наприклад щодо введення якоїсь команди в консолі, що б виключити випадкового закриття програми.

Весь код класу Program
using System;
using Telegram.Bot;
using Telegram.Bot.Types;

namespace TelegramBotYoutube
{
class Program
{
private static readonly TelegramBotClient bot = new TelegramBotClient("<токен>");

static void Main(string[] args)
{
bot.OnMessage += Bot_OnMessage;
bot.SetWebhookAsync();

var me = bot.GetMeAsync().Result;
Console.Title = me.Username;

bot.StartReceiving();
Console.ReadLine();
bot.StopReceiving();
}

private static async void Bot_OnMessage(object sender, Telegram.Bot.Args.MessageEventArgs e)
{
Message msg = e.Message;

if (msg == null) return;

// Якщо текстове повідомлення
if (msg.Type == MessageType.TextMessage)
{
await bot.SendTextMessageAsync(msg.Chat.Id "Hello, " + msg.From.FirstName + "!");
}
}
}
}



Перший запуск

Запускаємо програму.



Вікно консолі змінило назву на ім'я бота. Відмінно. Тепер відправимо боту повідомлення через Telegram. Щоправда, спершу його потрібно знайти.



Знайшовся, натискаємо кнопку Start. І відразу ж бот вітає нас. Але ми ж нічого не писали? Це не так. При натисканні кнопки старт, боту оговтується текст "/start". А на будь-яке текстове повідомлення бот вітає користувача.



І це все… що він вміє.
Спасибі за увагу! Кінець першої частини.

Для більшої наочності можна переглянути відеоурок:


P. S.: Якщо у вас є питання або побажання, залишайте свої коментарі на YouTube під відео.
На хабре коментарі я не читаю.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.