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

в 13:21, , рубрики: api, bot, C#, telegram, windows, консоль, Программирование, разработка под windows, Системы обмена сообщениями

Здравствуйте, уважаемые читатели!

В этой статье для новичков, я покажу вам, как легко и просто создать своего бота для Telegram. Писать будем на языке C#. Бот будет коллекционировать картинки, и выдавать их по первому требованию пользователя. Мой вариант бота будет хранить картинки мемов и название у него будет соответствующее.

Кому стало интересно, прошу пожаловать под кат.
Склад мемов или Бот для Telegram — Часть 1 - 1

Рождение бота

Запускаем мессенджер Telegram и в поисковую строку вводим «botfather». В переводе с английского «отец ботов».

Склад мемов или Бот для Telegram — Часть 1 - 2

Нажимаем кнопку Start. Отец ботов сразу вывел список доступных команд.

Склад мемов или Бот для Telegram — Часть 1 - 3

Нам нужна команда для создания бота "/newbot".

Склад мемов или Бот для Telegram — Часть 1 - 4

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

Склад мемов или Бот для Telegram — Часть 1 - 5

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

Склад мемов или Бот для Telegram — Часть 1 - 6

Отец ботов поздравляет с успешным созданием бота и выдаёт токен для управления им. Теперь нужно описать, чем занимается бот. Делается это через команду "/setdescription".

Склад мемов или Бот для Telegram — Часть 1 - 7

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

Склад мемов или Бот для Telegram — Часть 1 - 8

Командой "/setinline" зададим текст подсказки, которая появится, когда мы обратимся к боту в режиме inline.

Склад мемов или Бот для Telegram — Часть 1 - 9

А вот так будет выглядеть результат обращения в этом режиме:

Склад мемов или Бот для Telegram — Часть 1 - 10

Для удобства пользователя перечислим команды, которые бот будет понимать. Делается это через команду "/setcommands". Подсказка со списком команд будет появляться после ввода символа "/".

Склад мемов или Бот для Telegram — Часть 1 - 11

Вот так выглядят подсказки на практике:

Склад мемов или Бот для Telegram — Часть 1 - 12

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

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

Ссылка на проект

Склад мемов или Бот для Telegram — Часть 1 - 13

Что бы не заморачиваться с установкой, я воспользовался консолью диспетчера пакетов NuGet. С помощью этого диспетчера, можно с лёгкостью скачать и подключить к проекту большинство существующих библиотек. К тому же он докачает все необходимые зависимости. Обновление уже подключенной библиотеки происходит так же просто. Ммм… звучало как реклама…

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

Если вы никогда не пользовались консолью NuGet в Visual Studio, то открыть её очень просто.

Склад мемов или Бот для Telegram — Часть 1 - 14

Вводим команду и жмём Enter. Всё остальное NuGet сделает за вас.

Склад мемов или Бот для Telegram — Часть 1 - 15
Склад мемов или Бот для Telegram — Часть 1 - 16

Пишем код

Все условия созданы, приступаем к написанию кода. Переходим в класс «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 — Часть 1 - 17

Окно консоли сменило название на имя бота. Отлично. Теперь отправим боту сообщение через Telegram. Правда, сперва его нужно найти.

Склад мемов или Бот для Telegram — Часть 1 - 18

Нашёлся, нажимаем кнопку Start. И сразу же бот приветствует нас. Но мы же ничего не писали? Это не так. При нажатии кнопки старт, боту оправляется текст "/start". А на любое текстовое сообщение бот приветствует пользователя.

Склад мемов или Бот для Telegram — Часть 1 - 19

И это всё… что он пока умеет.
Спасибо за внимание! Конец первой части.

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

P. S.: Если у вас есть вопросы или пожелания, оставляйте свои комментарии на YouTube под видео.
На хабре я комментарии не читаю.

Автор: SergeyMakhonya

Источник

  1. edvrn:

    “Поэтому в аргументах метода SetWebhookAsync мы ничего не пишем, но вызвать этот метод необходимо, иначе мы не сможем получать сообщения от пользователей.
    https://www.pvsm.ru/c-2/214351” – в документации про это ничего не нашел и без этого РАБОТАЕТ!!!. что я не так сделал?

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js