H Склад мемов или Бот для Telegram — Часть 1 в черновиках Tutorial

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

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

Запускаем мессенджер Telegram и в поисковую строку вводим «botfather». В переводе с английского «отец ботов». image Нажимаем кнопку 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 под видео. На Хабре я комментарии не читаю.–>

ОБЛАСТЬ ПРИМЕНЕНИЯ: Пакет SDK версии 4

Вы можете настроить взаимодействие бота с другими пользователями с помощью программы для обмена сообщениями Telegram. В этой статье описывается, как создать бот Telegram и подключить его к боту на портале Azure.

Совет

Сведения о том, какие функции поддерживаются на каждом канале, см. в справочной статье о каналах .

Предварительные требования

  • Учетная запись Azure. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начать работу.
  • Существующий бот, опубликованный в Azure.
  • Устройство с установленной телеграммой и учетной записью Telegram.

Создание бота Telegram с помощью BotFather

Создайте бот Telegram с помощью BotFather перед подключением бота к Telegram.

  1. Начните новую беседу с BotFather.

  2. Отправить /newbot , чтобы создать бот Telegram.

  3. При появлении запроса введите имя бота.

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

  5. Скопируйте и сохраните маркер доступа бота Telegram для дальнейших действий.

Настройка Telegram на портале Azure

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

  1. Войдите на портал Azure .
  2. Перейдите к боту. Затем выберите каналы из параметров.
  3. Выберите Telegram в списке доступных каналов.
  4. Введите токен, скопированный ранее в поле маркера доступа , и нажмите кнопку “Применить“.

Теперь бот успешно настроен для взаимодействия с пользователями в Telegram.

Дополнительные сведения

Сведения об использовании действий, относящихся к Telegram, в сообщениях см. в статье о реализации функций, относящихся к каналу.

05.04.2021 easy

Пошаговая инструкция для тех, кому нужен секретарь.

У нас уже есть несколько статей и проектов с ботами для телеграма, но это были учебные проекты — мы на них учились, но реальной пользы они не приносили. Настало время это исправить и написать полноценного рабочего бота в помощь нашей редакции.

Какую задачу решаем

Проблема: сейчас у нас есть новостная редакция — её сотрудники каждый день читают новости в интернете и отбирают интересные. Но новостей много, а сотрудников мало, поэтому иногда интересные новости проходят мимо нас.

Что можно сделать: сказать всем, что если нашли интересную новость — присылайте её нам напрямую, в личные сообщения в телеграме. Но если новостей окажется слишком много, то у редактора новостей в личке начнётся ад.

Решение: сделать телеграм-бота, которому можно отправить сообщение, а он перешлёт его куда нужно. Чтобы не плодить личные сообщения от бота, можно сделать так:

  1. Сделать внутренний чат новостной редакции
  2. Добавить в него бота
  3. Настроить бота так, чтобы он отправлял сообщения пользователей в этот чат.

Что в итоге: когда у отдела новостей есть время, они заглядывают в этот чат и видят, кто что написал и что из этого можно взять в работу. Лишние сообщения не приходят, личные чаты не засоряются.

Сложный вариант — написать своего бота и поставить его на сервер (мы не стали так делать)

Кажется, что если мы — издание про технологии и у нас есть программисты и свои виртуальные серверы, то проще всего будет написать бота на питоне и отправить на сервер. Но на самом деле с таким подходом есть много сложностей:

  • нужно найти программиста на питоне, который сможет написать код;
  • этот код потом нужно поддерживать, если понадобится добавить новые функции;
  • нужно подготовить сервер к постоянной фоновой работе python-кода;
  • следить за тем, чтобы бот работал круглосуточно, а если падал, то сам умел перезапускаться;
  • следить за самим сервером и в случае чего — перезапускать его и все программы на нём.

Всё это требует внимания, времени и квалификации. В итоге простая задача превращается в целый рабочий процесс с отдельным человеком, который отвечает за бесперебойную работу сервера и всего, что на нём крутится.

👉 Свой бот на своём сервере — это правильный подход, если у вас в компании уже настроен подобный процесс и есть отдельная команда, которая за это отвечает. В маленькой команде разворачивать всю эту систему ради одного бота — перебор.

Простой вариант — использовать конструктор

Мы уже писали про онлайн-конструкторы ботов и собирали тестового бота в одном из них. С таким подходом мы решаем большинство проблем из первого варианта:

  • не нужно следить за сервером, потому что за это отвечает сервис с конструктором;
  • не нужно искать программиста с необходимой квалификацией;
  • чем меньше кода, тем проще поддерживать готовый продукт.

Но появляются и свои риски и особенности:

  • сервис может закрыться, и бот перестанет работать;
  • если нужно добавить что-то, что не предусмотрено сервисом, то либо это будет сложно и громоздко, либо вообще не получится сделать.

👉 Что касается оплаты, то платить за ежемесячную подписку за сервис в среднем получается дешевле, чем платить системному администратору и программисту за настройку и поддержку всех программ.

Это наш выбор.

Логика проекта

  1. Создаём нового бота и добавляем его в чат.
  2. Получаем нужные параметры для настройки бота.
  3. Создаём бота в конструкторе.
  4. Настраиваем чат для полноценной работы в редакции.

Сделаем всё по очереди.

Создаём нового бота и добавляем его в чат

Регистрируем нового бота через @BotFather — делаем это точно так же, как в материале про бота на питоне. Мы создали бота @Eto_v_Kod_bot и назвали его «Это в Код»:

Мы закрасили токен для управления ботом, он нам понадобится для подключения к конструктору

Теперь создаём публичный чат и добавляем в него бота. Публичный чат нам нужен, чтобы получить ID чата, потом сделаем его приватным. Именно в этот чат бот будет пересылать полученные сообщения.

Чат редакции с добавленным ботом

Узнаём ID чата

В телеграме у каждого чата есть свой ID — уникальный идентификатор, с помощью которого можно отличать один чат от другого. Чтобы наш бот пересылал сообщения в нужный чат, узнаем его ID. Для этого сначала пишем боту любое сообщение (неважно, что он ещё не работает), а затем делаем такую магию — переходим в браузере по адресу

https://api.telegram.org/bot<ВАШ_ТОКЕН>/getUpdates

👉 Перед тем, как это делать, отключите бота от конструктора или выключите его там в настройках, иначе магия не сработает.

Это значит, что мы должны:

  1. Взять наш токен.
  2. Подставить его  вместо <ВАШ_ТОКЕН>. 
  3. Скопировать всё, что получилось.
  4. Вставить результат в адресную строку и перейти по этому адресу.

Например, в нашем случае адрес будет такой:

https://api.telegram.org/bot1738394823: AAF4h6dkgjKH88lKanJ899lpH-Jqkd5k2399sjKo/getUpdates

Когда мы перейдём по этому адресу, браузер нам напишет что-то такое:

{“update_id”:8393,”message”:{“message_id”:3,”from”:{“id”:7474,”first_name”:”AAA”},”chat”:{“id”-1034423424553:,”title”:”Eto_v_Kod”},”date”:25497,”new_chat_participant”:{“id”:71,”first_name”:”NAME”,”username”:”Eto_v_Kod”_bot”}}}

Нам нужно то, что написано после chat id: -1034423424553 — это и есть ID нашего чата, дефис перед числом тоже важен.

👉 Теперь чат снова можно сделать приватным, на ID это не повлияет.

Собираем бота в конструкторе — стартовый экран

Мы используем конструктор BotMother — мы уже рассказывали, как с ним работать и собрать своего тестового бота. Если что-то по ходу описания будет непонятно, почитайте сначала ту статью.

Стартовый экран — это то, что выполняет бот по команде /start. Сделаем на стартовом экране выбор из двух кнопок: отправить новость и отправить статью:

Здесь три компонента: текстовый блок и две кнопки

Теперь нам нужно сделать так, чтобы при нажатии на каждую из этих кнопок бот делал то, что нам нужно. Для этого создаём два экрана: «Предложить новость» и «Предложить статью» и настраиваем действия по кнопкам:

Всё, стартовый экран готов, идём к новостям

Собираем экраны «Предложить новость» и «Предложить статью»

Логика экрана будет такой:

  1. Пишем текст с пояснением, что нужно сделать — написать текст новости или дать ссылку на неё.
  2. Сохраняем ответ в отдельной переменной news1.
  3. Отправляем в наш новостной чат сообщение от бота с именем посетителя, который написал новость, и текст самой новости.
  4. Чтобы сообщения не слипались, вдогонку отправляем в тот же чат отбивку — линию-разделитель из нескольких дефисов.
  5. Если мы дошли до последнего пункта и всё прошло без ошибок — показываем посетителю экран «Всё хорошо», а если на каком-то этапе была ошибка — сразу перебрасываем его на экран «Что-то не так».

Сначала посмотрим на готовый экран, а потом разберём его по шагам:

Первые два экрана соответствуют тому, что мы писали в алгоритме, а два остальных — это и есть наша отправка сообщений в чат

Каждую отправку мы сделали через запрос POST к API телеграма. Когда сервер телеграма получает специальным образом подготовленный запрос, он выполняет какое-то действие — это называется работа по API и про это у нас есть отдельная статья.

В нашем случае все запросы используют метод sendMessage, у которого всегда есть два параметра:

  1. ID получателя.
  2. Текст сообщения.

В общем виде команда выглядит так:

https://api.telegram.org/bot<ТОКЕН_БОТА>/ sendMessage?chat_id=&text=<Сообщение>

Мы уже знаем токен бота и ID чата, куда хотим отправить сообщение — это ID нашего чата, который мы выяснили до этого. Подставляем эти значения и получаем команду:

https://api.telegram.org/bot1738394823: AAF4h6dkgjKH88lKanJ899lpH-Jqkd5k2399sjKo /sendMessage?chat_id=-1034423424553&text=<Сообщение>

Первым сообщением мы отправляем имя того, кто предложил новость, и сам текст новости, поэтому сообщение будет выглядеть так:

Новость, отправил @{{this_user.username}} → {{news1}}

Здесь {{this_user.username}} и {{news1}}  — это переменные. Первая переменная стандартная в конструкторе BotMother, а вторую сделали мы сами на этом же экране. Полный текст запроса выглядит так:

https://api.telegram.org/bot1738394823: AAF4h6dkgjKH88lKanJ899lpH-Jqkd5k2399sjKo/sendMessage? chat_id=-1034423424553&text=Новость, отправил @{{this_user.username}} → {{news1}}

Сделаем по аналогии вторую команду, которая присылает отбивку в чат, чтобы отделить одну новость от другой:

https://api.telegram.org/bot1738394823: AAF4h6dkgjKH88lKanJ899lpH-Jqkd5k2399sjKo/ sendMessage?chat_id=-1034423424553&text=------------

👉 Вместо двух запросов на отправку сообщения можно было использовать функцию API телеграма forvardMessage, которая просто пересылает сообщения. Для этого нам понадобился бы порядковый номер сообщения в переписке. Если бы мы писали бота на питоне, с этим бы не было никаких проблем, но в этом конструкторе проще сделать отправкой, как у нас.

Что такое API

Точно так же собираем экран «Предложить статью»:

Генератор лабиринтов

Рисуем лабиринты любого размера.

hard Как поклеить обои

Поручим это машине.

easy Собственный текстовый редактор: делаем красиво

Самое простое и полезное введение в CSS.

medium Красивые ссылки… с анимацией!

Невероятные… Фантастические… Ни капельки не бесящие.

easy Простая работа с исключениями

Чтобы программа не падала из-за разных ошибок

easy Телеграм-бот на Python

15 минут — и можете запускать своего первого бота.

medium Задачка с собеседования: как перевести число в римскую систему счисления и обратно

Простая задача с приятным решением

easy Текстовый дождь, как в «Матрице»

Приятная кодовая безделушка.

medium Тестируем и исправляем калькулятор на JavaScript

В нём много ошибок, но мы их пофиксим

medium Абсолютня: генератор новых слов на Python

Проект, достойный ваших мемов

medium Домашний кинотеатр на Raspberry Pi

Превращаем любой телевизор в умный гаджет.

easy Как добавить кнопки «Поделиться» на страницу

Простой рецепт от Яндекса.

easy Красивые ссылки на вашем сайте

Меняем стандартное подчёркивание на дизайнерское.

medium easy zero-codeЗолотой фондпрограммированиепроект

  1. Запрограммировать логику работы Телеграм-бота.
  2. Зарегистрировать нового бота в Telegram.
  3. Связать бота и его логику воедино.

Запрограммировать логику работы Телеграм-бота

Чтобы упростить задачу, мы написали пример такого бота. Его исходный код доступен по ссылке github.com/selectel/cloud-telegram-bot. Он понимает команды:

  • /start с приветственным сообщением;
  • /sticker с ответом в виде стикера;
  • /getwebhook чтобы вы могли получить информацию о настройках вашего бота;
  • /setwebhook для настройки вашего бота, но об этом позже.

Пройдите следующие шаги с нашим примером бота, чтобы освоиться:

  1. Скачайте исходный код как архив («Clone or download» → «Download ZIP») и распакуйте его.
  2. Внутри должно быть:
    • «setup.py» с минимальным кодом, чтобы Python-окружение приняло содержимое папки за модуль для установки;
    • «requirements.txt» с описанием зависимостей;
    • «bot» — папка с исходным кодом нашего бота.
  3. Выделите все эти файлы и папки, а затем создайте из них новый ZIP-архив, тогда исходный код внутри архива не будет иметь лишних папок (как в случае с архивом, скачанным с github).
  4. Перейдите в панели управления в раздел Облачная ПлатформаФункции и нажмите кнопку Создать функцию.
  5. Выберите среду выполнения и задайте имя, например Bot.
  6. В поле Загрузить выберите Архив.
  7. Загрузите ZIP-файл в качестве Кода функции.
  8. Укажите Путь к файлу как /bot/tele_bot.py.
  9. Укажите Вызываемую функцию как main.
  10. Получите токен по инструкции и в поле Переменные окружения добавьте его ключ и значение.
  11. Нажмите кнопку Сохранить и развернуть.
  12. Чтобы получить ссылку для вызова функции, перейдите на вкладку Триггеры и нажмите на тумблер HTTP-запрос.

Теперь у нас есть API, реализующее логику ответов бота. Следующим этапом мы зарегистрируем его в Telegram.

Зарегистрировать нового бота в Telegram

Чтобы Telegram знал о существовании нашего бота, его нужно зарегистрировать. Для этого существует только один способ:

  1. Найдите бота @BotFather в Телеграм. Это официальный бот, созданный специально для управления ботами.
  2. Отправьте ему команду:

    /newbot
  3. @BotFather спросит вас, как вы назовёте вашего бота. Следующим сообщением отправьте его название, заканчивающееся на «_bot».

  4. Запишите полученный токен от @BotFather — это ключ для работы с Telegram API.

Теперь у нас API, регистрация бота в Telegram и его токен. Осталось связать это вместе.

Как связать бота и его логику воедино?

На этом этапе надо сделать так, чтобы бот знал токен пользователя, а Telegram знал, где его API:

  1. Найдите переменную окружения «TOKEN» в настройках функции. Мы оставили её пустой на первом этапе.
  2. Укажите в этой переменной токен вашего бота, который получили от @BotFather.
  3. Нажмите Сохранить и развернуть.

Далее нужно направить сообщения, которые пользователи отправляют в Telegram, нашему боту — в то API, которое для него создали.

Способ 1. Через бота @SelectelServerless_bot

  1. Найдите бота @SelectelServerless_bot в Телеграме.
  2. Введите команду:

    /setwebhook <Токен от вашего бота> 
  3. Бот ответит тем, что получит из Telegram API. Если всё хорошо, это будет «true».

  4. Чтобы удостовериться в том, что всё корректно, отправьте команду:

    /getwebhook <Токен от вашего бота>
  5. В ответ должна прийти информация о webhook, в том числе указанный вами URL.

Способ 2. Из заготовленной формы

Откройте форму (или скопируйте её к себе в Облачное хранилище). Вставьте токен от вашего бота в первое поле, URL облачной функции во второе и нажмите на кнопку «Set Webhook». Произойдёт обращение к api.telegram.org, и вы увидите результат.

Примечание: может понадобиться наличие VPN.

Итог

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

Вступление

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

Шаг первый. Создаем оформление бота через Botfather

В этот шаг я скопировал часть статьи из бота на php, так как тут все действия у нас будут полностью идентичны.

BotFather — это такой бот(официальный), через которого регистрируют все остальные боты. Без него нам никак не обойтись, поэтому давайте откроем telegram и перейдем по ссылке — BotFather

Там все крайне просто, вбиваем /help и смотрим на список доступных команд:

Собственно сейчас нас интересует команда /newbot, пишем ее и создаем бота указывая его название. В данном случае я назову своего бота — Рев.ком.стих и будет он у нас выдавать стихи о Маяковского и Есенина (когда я его доделаю, однако весь процесс в эту статью я включать не буду).

Нам выдадут токен, на скриншоте он замазан в целях…, ну вы сами понимаете. Этот токен нам и нужен, сохраните его куда-нибудь в текстовый файл, он нам еще пригодится.

Далее можно задать оформление для бота. Например картинку — логотип. Для этого используем команду /setuserpic после чего загружаем картинку. Так-же задаются описание бота и прочие вещи до которых вы допрете и без моего участия.

Ну и чтобы проверить установилась картинка или нет переходим на бота вбивая его имя через собачку в поиск

Теперь надо сделать боту доступ к сообщениям пользователей, то есть выключить нахер приватный режим. Если мы планируем добавлять бота в группы или конфы, назовите как хотите, в любом случае приватность нам нахер не нужна. Чтобы ее выключить вбиваем команду /setprivacy после чего выбираем пункт — disabled. Обязательно выполните этот шаг, если вы хотите сделать действительно интерактивного бота.

Теперь самое время заняться backend частью, а именно написанием кода для команд нашего бота, но сначала настроим среду разработки.

Шаг второй. Среда разрабтки

В случае с c# мы будем использовать кроссплатформенную и совершенно бесплатную ide — SharpDevelop в которую уже предустановлены все необходимые для нас плагины такие как nuget package manager. Это во первых экономит мне время, во вторых ресурсы. Тяжелая visual studio тащит за собой кучу уже давно неакутальных и ненужных вещей, да к тому-же платная. Выглядит она конечно приятнее, но для меня такие мелочи не самое главное, мне главное — результат (это нифига не мелочи, Visual Studio 2017 стоит 37 000 рублей).

Короче если у вас не стоит — установите, она весит не много. К тому-же проекты написанные в ней целиком совместимы с visual studio, то есть написанное можно будет потом перенести и туда тоже.

Создаем File->New->Solution

И выбираем тип, так как писать мы будем на C# то выбор очевиден:

И вот среда для разработки у нас готова:

Собственно время устанавливать нужные нам компоненты.

Шаг третий. Установка компонент

В качестве обертки для работы с API мы будем использовать пакет под названием telegram.bot, его мы и будем устанавливать в наш проект. Идем в Project->Manage Packages

Перед нами появится менджер пакетов, который сам найдет нужный нам пакет из интернета, скачает его и установит в ваше приложение для использования. Ищем там наш компонент и тыкаем «Add»:

И вот наш пакет добавился, его видно в solution explorer’е

Отлично, если вы проделали все эти действия то можно переходить уже и к кодингу.

Шаг третий. Написание кода

Собственно для начала сделаем простейший интерфейс. Переключаемся на вкладку MainForm -> Design, после чего кидаем на форму одну кнопку и одно текстовое поле.

Вообще я рассчитываю что у вас есть некий базовый опыт программирования на C#, потому что полностью описывать тут все действия у меня просто не хватит места. В любом случае после оформления стоит перейти к написанию кода.

Для начала стоит вспомнить о главном преимуществе C# — асинхронности. Я буду писать код в двух потоках и в качестве второго потока буду использовать класс BackgroundWorker. Просто создаем переменную этого класса и среда сама предложит нам установить необходимые зависимости.

Да, это еще одна вещ за которую я просто обожаю C#. Мне достаточно знать имя класса, а где он находится система знает и без меня.

Далее добавляем инициализацию нашей переменной в конструкторе класса, а так-же запилим запуск воркера по клику кнопочки.

                BackgroundWorker bw;  public MainForm(){ // // The InitializeComponent() call is required for Windows Forms designer support. // InitializeComponent();  // // TODO: Add constructor code after the InitializeComponent() call. //  this.bw = new BackgroundWorker(); this.bw.DoWork += this.bw_DoWork; // метод bw_DoWork будет работать асинхронно }  void bw_DoWork(object sender, DoWorkEventArgs e) { var worker = sender as BackgroundWorker; // получаем ссылку на класс вызвавший событие  }  void BtnRunClick(object sender, EventArgs e) // обработка клика кнопки {     if (this.bw.IsBusy != true) // если не запущен     {         this.bw.RunWorkerAsync(); // запускаем     } }

вот примерно так и должно быть у вас в начале. Теперь нам надо передать токен из текстового поля формы в обработчик воркера и там использовать. Звучит конечно писец как сложно но делается очень просто:

void bw_DoWork(object sender, DoWorkEventArgs e) { var worker = sender as BackgroundWorker; var key = e.Argument as String; // получаем ключ из аргументов   }  void BtnRunClick(object sender, EventArgs e) { var text = txtKey.Text; // получаем содержимое текстового поля txtKey в переменную text if (text && this.bw.IsBusy != true)     {         this.bw.RunWorkerAsync(text); // передаем эту переменную в виде аргумента методу bw_DoWork     } } }

Вообще тот кто кодил на C# по больше моего конечно смог бы реализовать это все элегантнее, наверное, но я не из таких. К тому-же далеко не всем известны примочки многопоточности встроенные в этот язык. Там еще есть классы Thread и ThreadPool, а еще полу-асинхронные async и await.

Теперь настало время получения данных из бота. То есть время работы с API телеграма. Собственно инициализация API выглядит так:

var Bot = new Telegram.Bot.Api(key);

Так как мы не используем WebHook то … будем получать обновления бота «вручную», я не знаю как это можно более корректно назвать. Короче раз в секунду телеграм предоставляет ботам информацию о всех сообщениях, которые за это время поступили в бота. Эту информацию можно получать автоматически на https домен, так мы делали на php, а можно получать в бесконечном цикле внутри потока, что мы сейчас и собираемся сделать. Поток у нас есть, осталось сделать цикл и получать обновления. Собственно последнее выполняется вызовом Bot.GetUpdatesAsync(offset) который возврщает массив обновлений начиная с отступа «offset».

async void bw_DoWork(object sender, DoWorkEventArgs e)         {             var worker = sender as BackgroundWorker;             var key = e.Argument as String; // получаем ключ из аргументов             try             {                 var Bot = new Telegram.Bot.TelegramBotClient(key); // инициализируем API                 await Bot.SetWebhookAsync("");                 //Bot.SetWebhook(""); // Обязательно! убираем старую привязку к вебхуку для бота                 int offset = 0; // отступ по сообщениям                 while (true)                 {                     var updates = await Bot.GetUpdatesAsync(offset); // получаем массив обновлений                                          foreach(var update in updates) // Перебираем все обновления                     {                         Console.WriteLine(update.Type);                         offset = update.Id + 1;                     }                  }             }             catch (Telegram.Bot.Exceptions.ApiRequestException ex)             {                 Console.WriteLine(ex.Message); // если ключ не подошел - пишем об этом в консоль отладки             }          }

И так, в цикле мы перебираем обновления, теперь надо взять обновления нужного нам типа, получить их содержимое и обработать. В данном случае давайте обработаем команду «/saysomething», для этого нам надо отловить обновление типа текстовое сообщение и если текст этого сообщения совпадает с «/saysomething» значит выдать в ответ в тот-же чат строчку «тест».

foreach(var update in updates) // Перебираем все обновления { var message = update.Message; if (message.Type == Telegram.Bot.Types.Enums.MessageType.TextMessage) { if (message.Text == "/saysomething") { // в ответ на команду /saysomething выводим сообщение await Bot.SendTextMessage(message.Chat.Id, "тест",    replyToMessageId: message.MessageId); } } offset = update.Id + 1; }

Запустим теперь наше приложение, вставим токен и нажмем кнопку «поехали». Отлично, а теперь в телеграм-боте вобьем нашу команду и посмотрим придет ли ответ:

Наш бот работает. Без регистрации домена, указания SSL, подключения cloudflare и прочих муторных вещей.

Отправка картинок

Чтобы отправить картинку надо отправить ссылку на нее самому telegram’у, он сам все загрузит и сделает за нас. Заставим нашего бота по команде «/getimage» отсылать нам вот эту картинку.

if (message.Text == "/getimage") { // в ответ на команду /getimage выводим картинку await Bot.SendPhotoAsync(message.Chat.Id, "http://aftamat4ik.ru/wp-content/uploads/2017/03/photo_2016-12-13_23-21-07.jpg","Revolution!"); }

Запускаем, тыкаем кнопочку  и тестируем:

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

Задаем список команд

Как это сделать я уже писал и не вижу ни малейшего смысла писать это снова. Просто прочитайте тут.

Заключение

Как вы уже поняли данный способ создания бота позволяет вам обойтись без покупки сервера, домена и прочих вещей, так как вы можете разместить бота прямиком на своем собственном ноутбуте/компьютере. Причем без велосипедов вроде денвера или опен-сервера.

То-же самое можно написать и на nodejs, к примеру.

Надеюсь эта статья поможет вам.

Скачать исходники

Без исходников все мои слова были бы бесполезны. Как говорится можно десять раз прочитать и не понять, а можно один раз посмотреть код и все понять. Да, к стати, проект открывается в visual studio, я проверял.

Бот для Telegram на C# Скачано: 74, размер: 4.5 MB, дата: 28.Мар.2017

Запись Пишем бота telegram на C# впервые появилась Личный блог Гарри.

Источник

Комментарии (9):

Войдите или зарегистрируйтесь чтобы оставить комментарий

О блоге

Оцените статью
Рейтинг автора
4,8
Материал подготовил
Егор Новиков
Наш эксперт
Написано статей
127
А как считаете Вы?
Напишите в комментариях, что вы думаете – согласны
ли со статьей или есть что добавить?
Добавить комментарий