Создание ботов для Telegram: с использованием языка программирования Python и облачной операционной системы Corezoid::Журнал СА 05.2016
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Наука и технологии
Подписка
Где купить
Авторам
Рекламодателям
Архив номеров
Контакты
   

  Опросы
  Статьи

Электронный документооборот  

5 способов повысить безопасность электронной подписи

Область применения технологий электронной подписи с каждым годом расширяется. Все больше задач

 Читать далее...

Рынок труда  

Системные администраторы по-прежнему востребованы и незаменимы

Системные администраторы, практически, есть везде. Порой их не видно и не слышно,

 Читать далее...

Учебные центры  

Карьерные мечты нужно воплощать! А мы поможем

Школа Bell Integrator открывает свои двери для всех, кто хочет освоить перспективную

 Читать далее...

Гость номера  

Дмитрий Галов: «Нельзя сказать, что люди становятся доверчивее, скорее эволюционирует ландшафт киберугроз»

Использование мобильных устройств растет. А вместе с ними быстро растет количество мобильных

 Читать далее...

Прошу слова  

Твердая рука в бархатной перчатке: принципы soft skills

Лауреат Нобелевской премии, специалист по рынку труда, профессор Лондонской школы экономики Кристофер

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 9887
Комментарии: 0
Потоковая обработка данных

 Читать далее...

19.03.2018г.
Просмотров: 8103
Комментарии: 0
Релевантный поиск с использованием Elasticsearch и Solr

 Читать далее...

19.03.2018г.
Просмотров: 8201
Комментарии: 0
Конкурентное программирование на SCALA

 Читать далее...

19.03.2018г.
Просмотров: 5195
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 5873
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

Друзья сайта  

 Создание ботов для Telegram: с использованием языка программирования Python и облачной операционной системы Corezoid

Архив номеров / 2016 / Выпуск №5 (162) / Создание ботов для Telegram: с использованием языка программирования Python и облачной операционной системы Corezoid

Рубрика: Наука и технологии

Без фото КОЛОСКОВ В.Л., студент 4-го курса бакалавриата, НИУ ВШЭ, Москва, vlkoloskov@edu.hse.ru

Без фото ПАВЛОВ И.Ю., студент 4-го курса бакалавриата, НИУ ВШЭ, Москва, pavlov.ilya.y@gmail.com

Без фото ИВАНОВ Е.Б., студент 4-го курса бакалавриата, НИУ ВШЭ, Москва, ebivanov@edu.hse.ru

Создание ботов для Telegram:
с использованием языка программирования Python и облачной операционной системы Corezoid

В наше время бурного развития ИТ-технологий огромную популярность набирают мессенджеры для телефонов и планшетов. Одним из самых совершенных и технологически продвинутых мессенджеров является Telegram Messenger, который получает все большее распространение в русскоязычной части интернета. Одна из особенностей этого приложения, отличающая его от конкурентов, – это боты, или «умные помощники». В данной статье описывается процесс создания ботов для Telegram с помощью языка программирования Python и операционной системы Corezoid. В начале работы рассматривается процесс регистрации бота и некоторые простейшие команды. Заканчивается статья рассмотрением преимуществ и недостатков двух этих способов разработки

Общие сведения о ботах в Telegram

В современном обществе возможность оставаться на связи, обмениваться фотографиями и видео привлекает миллионы людей. Практически у каждого владельца смартфона установлен как минимум один мессенджер по умолчанию. Вместе с подобными сервисами появились и роботы (или просто боты) для них, которые могут выполнять практически любые задачи – например, рассылать новости, регистрировать пользователей на сайте и многое другое. На заре развития данной технологии создание бота было прерогативой программистов, но в связи с широким распространением мессенджеров, а также усовершенствованием технологии некоторые мессенджеры предлагают каждому создать свой бот. Одним из таких приложений является Telegram.

Боты в Telegram представляют собой специальные аккаунты, которые могут автоматически обрабатывать и отправлять сообщения. Раньше они, так же как и большинство ботов, создавались программистами, но в одном из обновлений была добавлена функция создания ботов с помощью простых команд, что дало возможность пользователям, не обладающим навыками программирования, также создавать себе «умных помощников».

Возможности ботов

Прежде всего бот для Telegram – это приложение, которое запущенно на стороне пользователя и осуществляет отправку запросов к Telegram Bot API [1]. Обычно боты отвечают наспециальные команды, а также они способны производить поиск в интернете и выполнять иные интересные задачи. На официальном сайте Telegram представлен онлайн-каталог ботов Telegram. Возможности ботов возрастают с каждым днем, и в будущем вполне реальна ситуация, когда эта технология вытеснит другие продукты со схожими идеями.

Ограничения ботов на данный момент:

  • Принимает аудио только в одном формате, а именно (.ogg).
  • Бот не может отправлять сообщение другому боту (к примеру, реализовать ситуацию, когда вы пишите боту, а тот отправляет это сообщение другому боту, на данный момент невозможно).
  • Бот не умеет «забирать» фото от пользователей.
  • Бот не может писать первым, он должен обязательно отозваться на команду пользователя.

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

Регистрация бота

Перед тем как приступить к созданию бота, нужно установить Telegram и зарегистрироваться в этом сервисе. Далее в поисковой строке находим Manybot и набираем команду:

/start

выбираем язык и вводим команду добавления бота:

/addbot

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

Для этого нужно перейти или найти BotFather, послать ему команду для создания бота:

/newbot

после чего бот попросит придумать имя новому боту.

В принципе ограничений на имя бота не существует, кроме одного – имя в конце должно заканчиваться на «bot». Вводим название бота и его имя, к примеру, «Бот для теста» (этосообщение-приветствие) и test141bot.

В случае успеха действий BotFather присваивает боту HTTP API token и возвращает его вместе со ссылкой для быстрого добавления бота в контакты, в противном случае нужно подумать над другим именем для бота. В нашем случае токен, полученный от BotFather, имеет вид: 189563781:AAEgM3Jog39WScLnUTK7fe_oI2SeSildubI.

Теперь переходим в Manybot и подтверждаем, что API token скопирован, и получаем подтверждение вместе со ссылкой на бот @test141bot. Manybot предлагает протестировать вновь созданный бот – тестируем его, убеждаемся, что бот реагирует на наши действия. Выбираем наш бот для теста и «просим» его отправить наш первый пост «Hello World!» спомощью команды:

/newpost

и, т.к. мы являемся подписчиками, видим, что он отправляет наше сообщение всем подписчикам. Убедившись в этом, продолжаем.

Боты могут автоматически постить из Twitter, YouTube или VK. Для примера продемонстрируем репостинг из VK (все делается по аналогии). Посылаем нашему боту команду:

/autoposting

и выбираем, откуда мы хотим получать репосты – у нас это VK. Теперь нужно отправить боту ссылку на человека, сообщество или группу. После этого бот начинает «мониторить» эту страницу.

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

Corezoid – облачная операционная система на основе теории конечных автоматов, которая позволяет создавать боты (и не только) с помощью блок-схем, без программирования [2]. Преимущество Corezoid в том, что не нужно держать отдельный сервер для бота, потому что вся информация хранится в облаке.

Бот создан, теперь для начала работы нужно зарегистрироваться в Corezoid на официальном сайте ОС. Качать ничего не нужно – все действия происходят в браузере. На рис. 1 представлена рабочая среда Corezoid.

Рисунок 1. Рабочая среда Corezoid

Рисунок 1. Рабочая среда Corezoid

Далее заходим во вкладку Processes и находим шаблоны для Telegram, в данном случае мы будем делать погодный бот, поэтому выбираем WeatherBot v1 и копируем его во вновь созданную папку.

После всех этих действий бот привязывается к WeatherBot, для этого открываем информационное окно и в нем находим поле Add a Channel.

Затем нажимаем на Telegram, и появляется окно добавления канала, в него вставляем токен бота и сохраняем его. Окно добавления канала представлено на рис. 2.

Рисунок 2. Окно добавления канала

Рисунок 2. Окно добавления канала

Теперь рассмотрим, как работает WeatherBot. На рис. 3 представлена блок- схема алгоритма работы бота.

Рисунок 3. Блок-схема работы бота

Рисунок 3. Блок-схема работы бота

Начнем с Telegram bot key. Этот блок нужен для связки Telegram-бота с блок-схемой, в поле код снова вводится токен бота. Далее следует блок, который работает в режиме ожидания команды /start. Если она приходит, то в ответ отправляется сообщение из блока Send info about bot и начинает выполняться блок Location?. Если в ответ бот получит локацию, то вответ отсылается погода с учетом вашей локации, в противном случае, если ввести город, будет выслана погода в этом городе.

Принцип работы блока. В качестве примера возьмем блок начала работы бота – блок /start. Нужно выбрать тип блока в редакторе блоков. Блок проверяет, пришла ли команда /start отнашего бота, для такой проверки потребуется блок Condition. На рис. 4 представлен интерфейс выбора типа блока.

Рисунок 4. Выбор типа блока

Рисунок 4. Выбор типа блока

Блок создан, теперь в него нужно добавить проверочное условие и объединить с предыдущим блоком, чтобы он мог получать информацию для проверки. Для этого выбираем блок Condition. Справа в редакторе появится контекстное меню, в нем и будет наше условие. На рис. 5 представлено контекстное меню для настройки блока. Если пришло сообщение /start, значит, блок выполняется. На рис. 6 показан пример реализации запроса.

Рисунок 5. Настройка блока

Рисунок 5. Настройка блока

Рисунок 6. Пример работы запроса

Рисунок 6. Пример работы запроса

Создание простого погодного бота с помощью кода

Как язык разработки был выбран Python [3]. В связи с его адаптивностью алгоритмы, написанные на этом языке, достаточно легко переносятся на любой другой язык. В данной работе для разработки бота будет использована библиотека для Python pyTelegramBotAPI, которая существенно упрощает процесс программирования, взяв на себя все нюансы отправки и получения запросов и позволяя сконцентрироваться непосредственно на логике. Для написания скрипта используется среда разработки PyCharm. Прежде чем приступить к написанию кода, нужно установить последнюю версию Python, а также компилятор PyCharm. После установки среды разработки необходимо установить две библиотеки, необходимые для правильного функционирования бота, – библиотеку pyTelegramBotAPI и библиотеку pywapi [4].

Перейдем к делу. Напишем бот, который будет сообщать нам погоду в двух столицах – Москве и Санкт-Петербурге. Для начала создаем новый проект в PyCharm. Внутрь этого проекта помещаем два файла: main.py и constants.py. В первом из них будет находиться скрипт нашего бота, а второй, в свою очередь, будет содержать все константы (такие какприветственное сообщение, сообщение для команды /help и другие), чтобы не засорять код в main.py.

Токен позволяет управлять ботом как угодно, а мы не хотим, чтобы управление нашим ботом случайно оказалось в руках какого-либо злоумышленника, поэтому лучше не вставлять токен в основной код программы, а вынести его в отдельный файл. В нашем случае мы поместим его вместе с константами в constants.py.

Сейчас constants.py имеет следующий вид:

# Здесь введите токен бота, который вам вернул botFather

token = 'BotToken'

startAnswer = "Ну что же, приступим. Погоду в каком городе вы

хотели бы узнать?"

helpAnswer = """Доброго времени суток!

Меня зовут TwoCapitalsWeatherBot! Я – самый лучший погодный

бот во всем Telegram!

Я знаю все о погоде, но… только в двух городах… двух

столицах – Москве и Санкт-Петербурге

Для получения сводки о погоде в Москве нажмите /moscow

Вы хотите знать, что приготовила для вас питерская погода?

Нажмите /piter""

На этом файл constants.py можно сохранить и закрыть, т.к. к нему больше возвращаться не будем.

Перейдем к main.py. Для начала импортируем все необходимые нам файлы и создадим объект нашего бота:

import telebot

import constants

import pywapi

где:

  • Telebot – файл, который существенно упрощает нам процесс создания бота.
  • Constants – созданный нами файл с константами и токеном бота.
  • Pywapi – поможет нам получить новостную сводку [4].

Для начала создадим объект бота, через который будет осуществляться обращение к API Telegram с использованием методов, о которых рассказано на сайте Telegram в описании Bot API. Для создания нужно вызвать его конструктор и в качестве параметра передать токен бота.

bot = telebot.TeleBot(constants.token)

По мере усложнения функций бота код начинает расти, что становится проблемой. Чтобы не загромождать код огромным количеством циклов и конструкций if-elif-else, в библиотеке pyTelegramBotAPI существует хэндлеры или декораторы, которые помогают справиться с этой проблемой. Декораторы указывают библиотеке, что следующая дальше функция должна быть вызвана, когда боту приходит сообщение с подходящим типом содержимого. Хэндлеры существуют для всех типов сообщений, что удобно и позволяет разделить код налогичные части, не нагромождая его в одном месте, повышая читабельность. Важно отметить, что сообщение будет обработано только в одном декораторе. Декораторы будут проверяться в порядке их следования в коде. Использоваться будет тот, который подошел под тип сообщения первым [5].

Внутри декораторов мы будем производить работу с текстом входящих сообщений. Для того чтобы отправлять сообщение, нам нужно знать id чата или пользователя. Id чата и id пользователя, которому планируется отправить сообщение, совпадут только в том случае, если переписка осуществляется в приватном чате типа «пользователь – бот». Поэтому рекомендуется использовать from_user.id вместо chat.id, но в нашем примере бот пишется для приватного чата, поэтому можно воспользоваться chat.id.

Напишем три декоратора: первый предназначен для отправления «вступительного сообщения» при начале работы с ботом, когда пользователь отправит команду /start, второй будет посылать сообщение при получении команды /help, третий станет с помощью pywapi получать погоду с сайта weather.com и преобразовывать полученный json-объект в удобный дляпользователя вид:

# декоратор для отправки сообщения при получении команды /help

@bot.message_handler(commands=['help'])

def handle_text(message):

bot.send_message(message.chat.id, constants.helpAnswer)

log(message, constants.helpAnswer)

#декоратор для отправки приветственного сообщения

@bot.message_handler(commands=['start'])

def handle_start(message):

bot.send_message(message.chat.id, constants.startAnswer)

# декоратор для получения прогноза погоды с сайта weather.com

@bot.message_handler(content_types=['text'])

def handle_text(message):

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

city = pywapi.get_location_ids(message.text)

# перебираем словарь в целях получения последнего элемента

for i in city:

cityCode = i

# отправляем запрос на сайт, чтобы получить нужную нам метеорологическую сводку. cityCode содержит id нужного нам города

weather_com_result = pywapi.get_weather_from_weather_com(cityCode)

# формирование сообщения с погодой из json-объекта,полученного от сайта

weatherReport = "It is " + weather_com_result['current_conditions']['text'].lower() + " and " + weather_com_result['current_conditions']['temperature'] + "°C now in " + message.text + "." + "\n" + "Feels like " + weather_com_result['current_conditions']['feels_like'] + "°C. \n" + "Last update - " + weather_com_result['current_conditions']['last_updated']

bot.send_message(message.chat.id, weatherReport)

Разберемся для начала с тем, каким образом боты принимают сообщения. Первый и наиболее простой вариант заключается в периодическом опросе серверов Telegram на предмет наличия новой информации. Осуществляется этой с помощью механизма, называемого Long Polling, при котором на непродолжительное время открывается соединение и всеобновления тут же прилетают боту. Этот способ прост, но не очень надежен. Первая причина, почему этот метод не надежен, – это проблемы с серверами Telegram. Cерверы Telegram периодически могут возвращать ошибку 504 (Gateway Timeout), из-за чего некоторые боты впадают в ступор. Даже использование библиотеки pyTelegramBotAPI не всегда может помочь избежать такой ситуации. Второй причиной может стать одновременный запуск нескольких ботов, что повышает вероятность столкнуться с ошибками.

Альтернативой первому варианту являются веб-хуки, которые работают несколько иначе. При установке веб-хука отпадает необходимость периодически самому опрашивать серверы, тем самым исчезает неприятная причина падений ботов. Однако за это приходится платить необходимостью установки полноценного веб-сервера на ту машину, на которой планируется запускать боты. Для примера погодного бота мы воспользуемся самым простым вариантом на основе Long Polling [5].

Для того чтобы наш код не останавливался после одного выполнения, нужно заставить скрипт постоянно опрашивать сервер об обновлениях. Для этой цели можно использовать цикл, но Telebot позволяет нам обойтись без цикла. Библиотека pyTelegramBotAPI предоставляет нам функцию polling. Функция polling запускает Long Polling, а параметры none_stop=True и interval = 0 говорят, что бот должен стараться не прекращать работу при возникновении каких-либо ошибок и обновляться без задержек. При этом за ботом всеравно нужно следить, поскольку серверы Telegram периодически перестают отвечать на запросы или делают это с большой задержкой, приводя к ошибкам 5xх.

bot.polling(none_stop=True, interval=0)

Проверяем в Telegram работу нашего бота. На рис. 7 показан пример работы бота. Все отлично работает.

Рисунок 7. Пример работы бота

Рисунок 7. Пример работы бота

Теперь разберем одну из особенностей Bot API, а именно кастомные клавиатуры. Такие клавиатуры представляют собой обычные шаблоны сообщений. Важной особенностью таких клавиатур является то, что команда, отправляемая кнопкой клавиатуры, полностью соответствует ее названию. К примеру, если кнопка называется /hellobot, то команда, которая отправляется при нажатии на эту кнопку, будет /hellobot. В связи с этим использовать кастомные клавиатуры нужно осторожно. Для создания кастомной клавиатуры нужно создать объект типа ReplyKeyboardMarkup(). Далее добавляем построчно элементы (также существует возможность сделать автоматическое разделение на строки, используя аргумент row_width), после чего передаем в метод send_message(). Для того чтобы убрать кастомную клавиатуру, к примеру, заменив ее на кнопку [/], необходимо вместо объекта ReplyKeyboardMarkup() создать объект ReplyKeyboardHide() и также передать его в send_message() [1]. Добавим кастомную клавиатуру, состоящую из трех клавиш: /help, /moscow и/piter. Немного изменим код декоратора для команды /start, который теперь будет выглядеть следующим образом:

#декоратор для отправки приветственного сообщения

@bot.message_handler(commands=['start'])

def handle_start(message):

user_markup = telebot.types.ReplyKeyboardMarkup(True, False)

user_markup.row('/moscow', '/piter')

user_markup.row('/help')

bot.send_message(message.chat.id, constants.startAnswer, reply_markup=user_markup)

log(message, constants.startAnswer)

Теперь при отправке боту команды /start, кроме приветственного сообщения, мы получим еще и кастомную клавиатуру с клавишей /help в нижнем ряду и клавишами /moscow и /piter в верхнем. Для клавиши /moscow и /piter добавим декораторы, которые при нажатии на эти клавиши отправят запрос на сайт в целях получения прогноза погоды для Москвы иСанкт-Петербурга соответственно:

#декоратор для клавиши /moscow

@bot.message_handler(commands=['moscow'])

def handle_start(message):

weather_com_result = pywapi.get_weather_from_weather_com('RSXX0063')

weatherReport = "It is " + weather_com_result['current_conditions']['text'].lower() + " and " + weather_com_result['current_conditions']['temperature'] + "°C now in " + weather_com_result['location']['name'] + "." + "\n" + "Feels like " + weather_com_result['current_conditions']['feels_like'] + "°C. \n" + "Last update - " + weather_com_result['current_conditions']['last_updated']

bot.send_message(message.chat.id, weatherReport)

print(weather_com_result)

# декоратор для клавиши /piter

@bot.message_handler(commands=['piter'])

def handle_start(message):

weather_com_result = pywapi.get_weather_from_weather_com('RSXX0091')

weatherReport = "It is " + weather_com_result

['current_conditions']['text'].lower() + " and " + weather_com_result['current_conditions']['temperature'] + "°C now in " + weather_com_result['location']['name'] + "." + "\n" + "Feels like " + weather_com_result['current_conditions']['feels_like'] + "°C. \n" + "Last update - " + weather_com_result['current_conditions']['last_updated']

bot.send_message(message.chat.id, weatherReport)

Наш бот готов. Осталось проверить его работоспособность. На рис. 8 представлен пример реализации бота с кастомной клавиатурой.

Рисунок 8. Пример реализации бота с кастомной клавиатурой

Рисунок 8. Пример реализации бота с кастомной клавиатурой

Все отлично работает. Пример простого погодного бота для Telegram реализован успешно!

Заключение

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

Метод Corezoid основан на использовании облачной операционной системы Corezoid. Основными преимуществами являются:

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

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

Главным преимуществом метода «классического» программирования (Python) являются гибкость процесса создания и функции бота, а недостатком – необходимость установки полноценного веб-сервера на машину с запущенным ботом. Также надо иметь собственный SSL-сертификат, т.к. веб-хуки в телеграмме работают только по HTTPS. К счастью, сейчас появилась поддержка самоподписанных сертификатов. eof

  1. Сайт с описанием Bot API – https://core.telegram.org/bots/api.
  2. Сайт облачной операционной системы Corezoid – https://www.corezoid.com.
  3. Документация Python – https://www.python.org/doc.
  4. Сайт с библиотекой pywapi – https://pypi.python.org/pypi/pywapi.
  5. Сайт библиотеки pyTelegramBotAPI – https://pypi.python.org/pypi/pyTelegramBotAPI.

Ключевые слова: Python, Corezoid, Telegram, bot, бот, разработка.


Bot development for Telegram: by using Python programming language and cloud operating system Corezoid

Koloskov V.L., a student of the 4th year undergraduate, vlkoloskov@edu.hse.ru

Pavlov I.Y., a student of the 4th year undergraduate, pavlov.ilya.y@gmail.com

Ivanov E.B., a student of the 4th year undergraduate, ebivanov@edu.hse.ru

Higher School of Economics, Moscow

Summary: In our time of rapid development of IT technologies, messenger for phones and tablets are gaining immense popularity. One of the most sophisticated and technologically advanced messengers is Telegram Messenger, which gained popularity in Runet. The main feature of this application are bots, or «intelligent assistant» which distinguishe it from competitors. This article describes the process of bot development for Telegram by using Python programming language and cloud operating system Corezoid. The process of the bot registration and some simple commands are considered in the beginning of the work. This paper ends with an information about pros and cons of these two development approaches.

Keywords: Python, Corezoid, Telegram, bot, development.


Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-41
Fax: (499) 277-12-45
E-mail: sa@samag.ru