January 19, 2020

Простейший Телеграм бот

Пришла пора научиться делать ботов для Телеграма, пусть и простых. Статья для самых-самых начинающих, понятно должно быть абсолютно каждому)

Писать будем на C#, это означает, что будут проблемы с бесплатным размещением где-либо. Иными словами, придется его держать его включенным на своей машине. Но с этим я постараюсь разобраться и, как только найду решение, тут же поделюсь.

Первое, что нужно сделать - зарегистрировать бота. Пишем ему @botfather, нажимаем на или вводим /newbot

Ботный отец говорит нам, что нужно дать имя нашему боту. Я назову его "Учебный бот"

Теперь, надо придумать юзернейм боту. Последние три символа обязательно должны быть "bot". В нашем случае это будет markovnewbot.

Отлично, бот зарегистрирован! Уже сейчас можно написать ему, но реагировать он совсем не будет.

Чтобы оживить бота, нужно написать для него код, но это пока подождет. Для начала нужно установить все необходимое. Скачиваем NuGet https://clck.ru/Lwoyr, он нужен для скачивания библиотек (это код, который написали за нас, чтобы нам было проще)

Теперь нажимаем Windows+R, вводим cmd и нажимаем ОК или открываем командую строку любым другим способом. Нужно попасть в папку, в которую загрузилась программа.

Сейчас мы в папке "Пользователь". Вводим cd downloads и попадаем в папку "загрузки", это написано в строке:

Теперь загрузим все необходимые библиотеки. Вводим в командую строку nuget install telegram.bot и ждем. В папке загрузки должна вот такая папка:

Теперь нужно скачать вторую библиотеку https://yadi.sk/d/TZvuL-8lKK0Z4Q и вытащить папку из архива в папку с загрузками

Вроде все. Можно приступать потихоньку к оживлению бота. Нужно установить программу, на которой будем писать бота, это будет SharpDevelop. Она бесплатная и весит буквально 13 мегабайт, вот ссылка https://clck.ru/LwnUv (Не реклама, не какая-то там левая ссылка, просто сокращение). Установка не должна вызвать проблем, если что-то непонятно, можете смело нажимать Next, а перед тем, как в конце нажать Finish, снимите единственную галочку. Готово! Можно запускать программу с рабочего стола.

Примерно такое окно нас встретит. Зажимаем сочетание клавиш Ctrl+Shift+T или в правом верхнем углу нажимаем File -> New -> Solution и в появившемся окне выбираем C# -> Windows Applications -> Console Application, называем проект в поле Name и нажимаем Create

В итоге мы попадем туда, куда так стремились.

Но писать код еще рано. Библиотеки мы скачали, теперь их нужно подключить. В левом окне есть папка References, нужно нажать на нее правой кнопкой мыши и выбрать Add Reference

В появившемся окне переходим на вкладку .NET Assembly Browser и кликаем на Browse...

Теперь нужно найти папку, которую мы скачали через командую строку и NuGet с телеграм ботом.

Открываем ее, заходим в папку lib, дальше в net45, и два раза кликаем на Telegram.Bot.dll

Теперь нужно проделать то же самое для Newtonsoft.Json. Нажимаем "Browse..." и находим в папке с загрузками ту, что вытащили из архива. Заходим в нее, далее в lib, net45 и два раза кликаем на Newtonsoft.Json.dll

Отлично! Теперь переходим во вкладку GAC

В этом списке нужно найти System.Net.Http и два раза кликнуть на него

Теперь можно нажимать ОК. Но кодить все еще рано. В во вкладке project, что наверху, выбираем Project Options

И видим вот это:

Здесь нам нужно найти вкладку Compiling

Нам нужно нажать на Change там, где написано Target Framework, если у вас не написано .NET Framework 4.5

Осталось немного. Нужно в Change target framework найти .NET Framework 4.5 и кликнуть на него.

Теперь нужно лишь нажать на Convert и мы готовы писать.

Нажимаем на Program.cs, чтобы попасть туда, где мы будем писать.

Все, что выделено, можно стереть, на бота не повлияет:

Все, теперь у нас чистенько, и можно писать. Скриншот выше - пустая программа. На 7 строчке описан "метод". Метод что-то делает, он выполняет какие-то функции, если в него написать код. На 8 и 10 строке фигурные скобки, они показывают, где начинается метод, а где заканчивается. На 5 строчке описан класс. Классы содержат эти самые методы, которые что-то делают. Еще они содержат поля. Поля содержат разную информацию, числа, строки, символы, что угодно. Также, как и с методом, на 4 и 11 строках написаны фигурные скобки, что показать границы класса. На 3 строке описано пространство имен. Пространство имен - контейнер для классов. Углубляться в это все сейчас не нужно, да и не знаю я ничего толком сейчас.

На первой строчке написано "using System;", с помощью using можно подключить все, что есть в скачанных и добавленных библиотеках, к нам в проект. Нам нужно после "using System;" написать еще три строки:

using Telegram.Bot;

using Telegram.Bot.Args;

using Telegram.Bot.Types.Enums;

Далее, на 9 строке после скобки нажмем Enter для переноса и строки и, получается, внутри класса опишем бота строкой

private static TelegramBotClient bot;

А внутри метода, который у нас есть изначально, мы его инициализируем (про инициализацию, если интересно, спросите у кого-нибудь поумнее, чем я):

bot = new TelegramBotClient(" ");

В скобки между кавычками нужно вставить токен нашего бота. Его нам дал ботный отец:

Получается вот это, это инициализация бота:

bot = new TelegramBotClient("809801100:AAFUpn9GpmSXvE9H_5CDZQbt-JQ9Lsue_6c");

Вот весь код на данный момент:

В следующей строке после инициализации бота, но все еще внутри метода, то есть до закрывающей фигурной скобки, пишем следующее:

bot.StartReceiving();

Мы обращаемся у бота к методу StartReceiving, который заставляет его начать принимать сообщения.

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

Внутри класса (между фигурными скобками, которые идут после Class program) пишем

static async void BotOnMessage(object sender, MessageEventArgs e) { }

Не парьтесь сейчас насчет object sender. А вот MessageEventArgs это передаваемые в метод аргументы, которые можно использовать. То есть, если боту отправили текстовое сообщение, то аргументами будет всякая разная информация о сообщении: тип (текст, аудио, видео итд), если текстовое, то текст, имя того, кто прислал и тому подобное. Всем этим можно будет пользоваться в методе. Static нам сейчас не интересен. Async означает, что этот метод можно вызывать асинхронно, то есть вне основного потока. Пока в основной программе идет бесконечный цикл, который ничего не делает, с помощью асинхронных методов можно что-то делать. Void нам сейчас тоже не интересен.

Выглядит это так:

После строчки bot.StartReceiving(); пишем

bot.OnMessage += BotOnMessage;

Это означает, что, когда приходит сообщение нашему боту, вызывается метод BotOnMessage, который что-то делает. Теперь пишем это:

do { }while(1==1);

Это цикл. После "do" есть фигурные скобки, в которых должен быть код, который выполняется, пока какое-то условие верно. Это условие описано после закрывающей фигурной скобки в обычных скобках. Условие равенства всегда пишется с двумя знаками "равно". Между фигурными скобками ничего нет, а в условии (1==1), прочитать это можно так: "Ничего не делай, пока 1 будет равна 1". Этот цикл никогда не прекратит свою работу, так как 1 всегда будет равен 1 (ого). Он нужен для того, чтобы программа не прошла дальше и не завершилась.

Все вместе выглядит вот так:

if(e.MessageType == MessageType.Text) { }

Это условный оператор. Если условие в скобках верно, то код в фигурных скобках выполняется. У нас в скобках e.MessageType == MessageType.Text. "e" это переменная, в которой хранится вся информация о сообщении. "e.MessageType" можно прочитать как "тип сообщения "e"". MessageType хранит все возможные типы сообщений. "MessageType.Text" означает "тип сообщения - текст". И мы сравниваем две эти штуки. Человеческим языком: "Если тип сообщения "e"- текст, то выполняем код в фигурных скобках". А в них мы пишем

await bot.SendTextMessageAsync(e.Message.Chat.Id, "Вот твой текст "+e.Message.Text);

await используется в асинхронных методах, таких, как наш. bot.SendTextMessage - отправка сообщения. В скобках два поля (кому, что). Сначала указываем, кому отправить, написав там e.Message.Chat.Id, что в переводе на человеческий означает "ID чата, который прислал сообщение", а после запятой "Вот твой текст "+e.Message.Text. Слева от плюса текст в кавычках это просто текст, он будет отправлен в таком виде, в каком он есть. Плюс означает, что мы к этому тексту прилепим еще что-то. Справа от плюса то, что мы прилепим. e.Message.Text переводится как "текст присланного сообщения". То есть, мы этой командой отправим в чат, откуда сообщение пришло, текстовое сообщение "Вот твой текст " и текст, который отправили боту.

Вот весь код на данный момент:

Дальше пойдет монотонная работа. Копируем строчки с условием и отправкой сообщения и вставляем их ниже.

Нужно только немного его подкорректировать, и получится что-то новое.

В условии MessageType.Text заменим на MessageType.Audio, таким образом это будет выполняться, если нашему боту отправить какое-либо аудио (не голосовое сообщение). А "Вот твой текст "+e.Message.Text заменим на "Классная песня!". Теперь наш бот умеет реагировать на аудио.

Повторяем операцию. Копируем, заменяя MessageType.Audio на MessageType.Video, а текст на "Смешное видео". Потом снова, заменяя MessageType.Video на MessageType.Document, а текст на "Надо посмотреть".

Далее, куда пойдет воображение. Если ввести MessageType и нажать ".", то программа сама выдаст все типы сообщений, можно два раза нажать на тип, и программа сама его допишет. Осталось лишь для каждого прописать свой текст.

Вот вся программа:

Можно запускать бота! Нажимаем на зеленый треугольник, и после того, как откроется консоль, можно писать боту!

Бот отвечает на текст и другие сообщения

Спасибо за прочтение!