Здравствуйте, уважаемые хабравчане! В этой статье для новичков, я покажу вам, как легко и просто создать своего бота для Telegram. Писать будем на языке C#. Бот будет коллекционировать картинки, и выдавать их по первому требованию пользователя. Мой вариант бота будет хранить картинки мемов и название у него будет соответствующее.
Кому стало интересно, прошу пожаловать под кат.
Запускаем мессенджер Telegram и в поисковую строку вводим «botfather». В переводе с английского «отец ботов».
Нажимаем кнопку Start. Отец ботов сразу вывел список доступных команд.
Нам нужна команда для создания бота "/newbot".
Отец ботов просит придумать прозвище для нового бота. Я назову его «Склад мемов».
Теперь нужно придумать его username. Оно обязательно должно оканчиваться, словом bot. Username я придумал заранее, перебрав до этого сотни комбинаций.
Отец ботов поздравляет с успешным созданием бота и выдаёт токен для управления им. Теперь нужно описать, чем занимается бот. Делается это через команду "/setdescription".
Установим аватарку для бота командой "/setuserpic".
Командой "/setinline" зададим текст подсказки, которая появится, когда мы обратимся к боту в режиме inline.
А вот так будет выглядеть результат обращения в этом режиме:
Для удобства пользователя перечислим команды, которые бот будет понимать. Делается это через команду "/setcommands". Подсказка со списком команд будет появляться после ввода символа "/".
Вот так выглядят подсказки на практике:
Для работы с Telegram API нам нужна библиотека. Можно конечно пойти по хардкору и написать её самому, но мы же ведь идём по простому пути. В интернете есть несколько разновидностей таких библиотек для C#. Мой выбор пал на проект с названием «Telegram.Bot». На момент написания статьи, эта библиотека была самой популярной.
Ссылка на проект
Что бы не заморачиваться с установкой, я воспользовался консолью диспетчера пакетов NuGet. С помощью этого диспетчера, можно с лёгкостью скачать и подключить к проекту большинство существующих библиотек. К тому же он докачает все необходимые зависимости. Обновление уже подключенной библиотеки происходит так же просто. Ммм… звучало как реклама…
Команда установки библиотеки через консоль диспетчера пакетов NuGet:
Если вы никогда не пользовались консолью NuGet в Visual Studio, то открыть её очень просто.
Вводим команду и жмём Enter. Всё остальное NuGet сделает за вас.
Все условия созданы, приступаем к написанию кода. Переходим в класс «Program». Объявим приватную статическую переменную только для чтения с типом TelegramBotClient и с именем bot.
Ей присвоим новый объект этого же типа. В аргументах конструктора нужно указать токен. Его нам выдал отец ботов при создании бота.
В точке входа в программу, вешаем на бота обработчик событий OnMessage.
Это событие возникает, когда пользователь что-то отправил боту. Будь это текст, изображение, файл и т.д. В обработчике обрабатываем полученное сообщение.
Если сообщение пустое, то выходим из метода. Введём условие срабатывающее, если сообщение содержит текст.
Бот будет отправлять сообщения асинхронно, т.е. отправка запроса, не будет замораживать текущий поток, а будет создавать новый. Иными словами, программа не будет виснуть. По этой причине, методу обработки события нужно присвоить модификатор async. А там где будет происходить вызов асинхронного метода, нужно будет вначале поставить ключевое слово await.
Асинхронно отправляем текстовое сообщение пользователю. Первым аргументом метода указывается идентификатор чата адресата. Вторым – сам текст сообщения. Для проверки работы бота, мы написали свой HelloWorld с блекджеком и плюшками. Бот будет приветствовать пользователя, обращаясь к нему по имени.
Вот так выглядит код метода Bot_OnMessage:
Перед запуском нужно ещё написать пару строк кода в точке входа в программу.
Так как наш бот не будет жить на веб-хостинге, а будет существовать в виде консольного приложения на обычном компьютере, потребность в WebHook полностью отпадает. Сообщения от пользователей бот будет получать самостоятельно, посылая соответствующий запрос на сервер Telegram. Поэтому в аргументах метода SetWebhookAsync мы ничего не пишем, но вызвать этот метод необходимо, иначе мы не сможем получать сообщения от пользователей.
Далее, получаем имя бота и отображаем его в названии окна консоли. Таким образом, мы будем знать, что бот готов к работе и что это не тот бот из сотни других ботов, что мы создали ранее.
Разрешаем приём сообщений, до тех пор, пока не нажата любая клавиша клавиатуры. После чего останавливаем приём сообщений и завершаем выполнение программы. Вы можете сделать это по своему, например по вводу какой-то команды в консоль, что бы исключить случайного закрытия программы.
Запускаем программу.
Окно консоли сменило название на имя бота. Отлично. Теперь отправим боту сообщение через Telegram. Правда, сперва его нужно найти.
Нашёлся, нажимаем кнопку Start. И сразу же бот приветствует нас. Но мы же ничего не писали? Это не так. При нажатии кнопки старт, боту оправляется текст "/start". А на любое текстовое сообщение бот приветствует пользователя.
И это всё… что он пока умеет. Спасибо за внимание! Конец первой части.
Для большей наглядности можно посмотреть видеоурок:
P. S.: Если у вас есть вопросы или пожелания, оставляйте свои комментарии на YouTube под видео. На Хабре я комментарии не читаю.
Кому стало интересно, прошу пожаловать под кат.
Рождение бота
Запускаем мессенджер 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 под видео. На Хабре я комментарии не читаю.
Поделиться с друзьями
Комментарии (7)
and7ey
27.11.2016 22:56+6На хабре я комментарии не читаю.
Зачем вообще тогда сюда статью публиковать?
thunderspb
28.11.2016 15:24Что-то у меня «как легко и просто» и «часть 1» нифига не сочетается между собой :)
alexyr
yet another telegram bot…
Видимо астрологи объявили неделю ботов для Telegram
riot26
Который ничего не умеет и написан с помощью готовой библиотеки.
Varkus
«ЧАСТЬ 1» — как бы намекаэ