Telegram bot программирование: Как создавать ботов в Telegram / Хабр
Как создавать ботов в Telegram / Хабр
24 июня разработчики Telegram
открыли
платформу для создания ботов. Новость кого-то обошла стороной Хабр, однако многие уже начали разрабатывать викторины. При этом мало где указаны хоть какие-то примеры работающих ботов.
Прежде всего, бот для Telegram — это по-прежнему приложение, запущенное на вашей стороне и осуществляющее запросы к
Telegram Bot API
. Причем API довольное простое — бот обращается на определенный URL с параметрами, а Telegram отвечает JSON объектом.
Рассмотрим API на примере создания тривиального бота:
1. Регистрация
Прежде чем начинать разработку, бота необходимо зарегистрировать и получить его уникальный id, являющийся одновременно и токеном. Для этого в Telegram существует специальный бот —
@BotFather
.
Пишем ему /start и получаем список всех его команд.
Первая и главная — /newbot — отправляем ему и бот просит придумать имя нашему новому боту. Единственное ограничение на имя — оно должно оканчиваться на «bot». В случае успеха BotFather возвращает токен бота и ссылку для быстрого добавления бота в контакты, иначе придется поломать голову над именем.
Для начала работы этого уже достаточно. Особо педантичные могут уже здесь присвоить боту аватар, описание и приветственное сообщение.
Не забудьте проверить полученный токен с помощью ссылки api.telegram.org/bot<TOKEN>/getMe, говорят, не всегда работает с первого раза.
2. Программирование
Создавать бота буду на Python3, однако благодаря адекватности этого языка алгоритмы легко переносятся на любой другой.
Telegram позволяет не делать выгрузку сообщений вручную, а поставить webHook, и тогда они сами будут присылать каждое сообщение. Для Python, чтобы не заморачиваться с cgi и потоками, удобно использовать какой-нибудь реактор, поэтому я для реализации выбрал tornado.web. (для GAE удобно использовать связку Python2+Flask)
Каркас бота:
URL = "https://api.telegram.org/bot%s/" % BOT_TOKEN
MyURL = "https://example.com/hook"
api = requests.Session()
application = tornado.web.Application([
(r"/", Handler),
])
if __name__ == '__main__':
signal.signal(signal.SIGTERM, signal_term_handler)
try:
set_hook = api.get(URL + "setWebhook?url=%s" % MyURL)
if set_hook.status_code != 200:
logging.error("Can't set hook: %s. Quit." % set_hook.text)
exit(1)
application.listen(8888)
tornado.ioloop.IOLoop.current().start()
except KeyboardInterrupt:
signal_term_handler(signal.SIGTERM, None)
Здесь мы при запуске бота устанавливаем вебхук на наш адрес и отлавливаем сигнал выхода, чтобы вернуть поведение с ручной выгрузкой событий.
Приложение торнадо для обработки запросов принимает класс tornado.web.RequestHandler, в котором и будет логика бота.
class Handler(tornado.web.RequestHandler):
def post(self):
try:
logging.debug("Got request: %s" % self.request.body)
update = tornado.escape.json_decode(self.request.body)
message = update['message']
text = message.get('text')
if text:
logging.info("MESSAGE\t%s\t%s" % (message['chat']['id'], text))
if text[0] == '/':
command, *arguments = text.split(" ", 1)
response = CMD.get(command, not_found)(arguments, message)
logging.info("REPLY\t%s\t%s" % (message['chat']['id'], response))
send_reply(response)
except Exception as e:
logging.warning(str(e))
Здесь CMD — словарь доступных команд, а send_reply — функция отправки ответа, которая на вход принимает уже сформированный объект
Message
.
Собственно, её код довольно прост:
def send_reply(response):
if 'text' in response:
api.post(URL + "sendMessage", data=response)
Теперь, когда вся логика бота описана можно начать придумывать ему команды.
3. Команды
Перво-наперво, необходимо соблюсти соглашение Telegram и научить бота двум командам: /start и /help:
def help_message(arguments, message):
response = {'chat_id': message['chat']['id']}
result = ["Hey, %s!" % message["from"].get("first_name"),
"\rI can accept only these commands:"]
for command in CMD:
result.append(command)
response['text'] = "\n\t".join(result)
return response
Структура message[‘from’] — это объект типа User, она предоставляет боту информацию как id пользователя, так и его имя. Для ответов же полезнее использовать message[‘chat’][‘id’] — в случае личного общения там будет User, а в случае чата — id чата. В противном случае можно получить ситуацию, когда пользователь пишет в чат, а бот отвечает в личку.
Команда /start без параметров предназначена для вывода информации о боте, а с параметрами — для идентификации. Полезно её использовать для действий, требующих авторизации.
После этого можно добавить какую-нибудь свою команду, например, /base64:
def base64_decode(arguments, message):
response = {'chat_id': message['chat']['id']}
try:
response['text'] = b64decode(" ".join(arguments).encode("utf8"))
except:
response['text'] = "Can't decode it"
finally:
return response
Для пользователей мобильного Telegram, будет полезно сказать @BotFather, какие команды принимает наш бот: I: /setcommands
BotFather : Choose a bot to change the list of commands.
I: @******_bot
BotFather: OK. Send me a list of commands for your bot. Please use this format:
command1 — Description
command2 — Another description
I:
whoisyourdaddy — Information about author
base64 — Base64 decode
BotFather: Success! Command list updated. /help
C таким описанием, если пользователь наберет /, Telegram услужливо покажет список всех доступных команд.
4. Свобода
Как можно было заметить, Telegram присылает сообщение целиком, а не разбитое, и ограничение на то, что команды начинаются со слеша — только для удобства мобильных пользователей. Благодаря этому можно научить бота немного говорить по-человечески.
UPD: Как верно подсказали, такое пройдет только при личном общении. В чатах боту доставляются только сообщения, начинающиеся с команды (/<command>) (https://core.telegram.org/bots#privacy-mode)
- All messages that start with a slash ‘/’ (see Commands above)
- Messages that mention the bot by username
- Replies to the bot’s own messages
- Service messages (people added or removed from the group, etc.)
Чтобы бот получал все сообщения в группах пишем @BotFather команду /setprivacy и выключаем приватность.
Для начала в Handler добавляем обработчик:
if text[0] == '/':
...
else:
response = CMD["<speech>"](message)
logging.info("REPLY\t%s\t%s" % (message['chat']['id'], response))
send_reply(response)
А потом в список команд добавляем псевдо-речь:
RESPONSES = {
"Hello": ["Hi there!", "Hi!", "Welcome!", "Hello, {name}!"],
"Hi there": ["Hello!", "Hello, {name}!", "Hi!", "Welcome!"],
"Hi!": ["Hi there!", "Hello, {name}!", "Welcome!", "Hello!"],
"Welcome": ["Hi there!", "Hi!", "Hello!", "Hello, {name}!",],
}
def human_response(message):
leven = fuzzywuzzy.process.extract(message.get("text", ""), RESPONSES.keys(), limit=1)[0]
response = {'chat_id': message['chat']['id']}
if leven[1] < 75:
response['text'] = "I can not understand you"
else:
response['text'] = random.choice(RESPONSES.get(leven[0])).format_map(
{'name': message["from"].get("first_name", "")}
)
return response
Здесь эмпирическая константа 75 относительно неплохо отражает вероятность того, что пользователь всё-таки хотел сказать. А format_map — удобна для одинакового описания строк как требующих подстановки, так и без нее. Теперь бот будет отвечать на приветствия и иногда даже обращаться по имени.
5. Не текст.
Боты, как и любой нормальный пользователь Telegram, могут не только писать сообщения, но и делиться картинками, музыкой, стикерами.
Для примера расширим словарь RESPONSES:
RESPONSES["What time is it?"] = ["<at_sticker>", "{date} UTC"]
И будем отлавливать текст :
if response['text'] == "<at_sticker>":
response['sticker'] = "BQADAgADeAcAAlOx9wOjY2jpAAHq9DUC"
del response['text']
Видно, что теперь структура Message уже не содержит текст, поэтому необходимо модифицировать send_reply:
def send_reply(response):
if 'sticker' in response:
api.post(URL + "sendSticker", data=response)
elif 'text' in response:
api.post(URL + "sendMessage", data=response)
И все, теперь бот будет время от времени присылать стикер вместо времени:
6. Возможности
Благодаря удобству API и быстрому старту боты Telegram могут стать хорошей платформой для автоматизации своих действий, настройки уведомлений, создания викторин и task-based соревнований (CTF, DozoR и прочие).
Вспоминая статью про умный дом, могу сказать, что теперь извращений меньше, а работа прозрачнее.
7. Ограничения
К сожалению, на данный момент существует ограничение на использование webHook — он работает только по https и только с валидным сертификатом, что, например для меня пока критично за счет отсутствия поддержки сертифицирующими центрами динамических днс.
К счастью, Telegram также умеет работать и по ручному обновлению, поэтому не меняя кода можно создать еще одну службу Puller, которая будет выкачивать их и слать на локальный адрес:
while True:
r = requests.get(URL + "?offset=%s" % (last + 1))
if r.status_code == 200:
for message in r.json()["result"]:
last = int(message["update_id"])
requests.post("http://localhost:8888/",
data=json.dumps(message),
headers={'Content-type': 'application/json',
'Accept': 'text/plain'}
)
else:
logging.warning("FAIL " + r.text)
time.sleep(3)
P.S. По пункту 7 нашел удобное решение — размещение бота не у себя, а на heroku, благо все имена вида *.herokuapp.com защищены их собственным сертификатом.
UPD: Telegram улучшили Бот Апи, из-за чего, теперь не обязательно иметь отдельную функцию для отправки сообщений при установленном вебхуке, а в ответ на POST запрос можно отвечать тем же сформированным JSON с ответным сообщением, где одно из полей устанавливается как ч ‘method’: ‘sendMessage’ (или любой другой метод, используемый ботом).
Bot API: часто задаваемые вопросы
Предупреждение
Если вы незнакомы с ботами в Telegram, рекомендуется сначала прочитать ознакомительную статью.
Также, возможно, вас заинтересует описание Bot API.
Общие вопросы
Как я могу создать бота?
Создание бота для Telegram крайне простое, однако, вам понадобится кое-какой опыт в программировании. Для работы вашего бота вам необходимо осуществить первоначальную настройку через бота @BotFather, а затем подключить его к вашему серверу через API.
К сожалению, какого-либо способа создать бота без программирования не существует. Поэтому, если вы не разработчик, лучше поищите себе готового бота или закажите его разработку.
Можно посмотреть примеры кода?
Вот два бота-образца, написанных на PHP:
- Hello Bot: демонстрация основных возможностей Bot API.
- Simple Poll bot: более сложный бот, поддерживающий оба способа получения обновлений (long-polling и вебхуки).
Примечание
Многие разработчики создают своих ботов с открытым исходным кодом. Мы собираем их на специальной странице.
Добавьте в ботов фичу X!
API ботов — весьма молодой проект. Есть ещё масса возможностей, которые уже рассматриваются к реализации. Пока что администрация Telegram наблюдает за тем, как пользователи используют своих ботов, чтобы понять, в каком направлении необходимо развивать платформу.
Если у вас есть мысли по этому поводу, вы можете высказать их пользователю @BotSupport (на английском).
Какие сообщения может получать мой бот?
При создании бота у него автоматически включается режим приватности, который влияет на получения сообщений в группах. Это значит, что ваш бот будет получать сообщения из групп только при следующих условиях:
- Сообщение было ответом боту или нажатием на его клавиатуру
- В сообщении есть @упоминание бота по его имени пользователя
- В сообщении содержится общая команда (напр.,
/start
) или команда, предназначающаяся вашему боту (напр.,/start@YourBot
) - Сообщение является служебным (о смене названия группы, выходе кого-либо из чата, и т. д.)
При выключении режима приватности, ваш бот будет получать все сообщения из групп, за исключением:
- Сообщений от других ботов
- Команд для других ботов (напр.,
/start@NotYourBot
) - Ответов на сообщения от других ботов, за исключением случаев, когда в сообщении содержится @упоминание вашего бота.
Почему мой бот не видит сообщений от других ботов?
Диалог двух ботов может привести к нежелательным бесконечным циклам, когда боты отвечают друг другу по кругу. Поэтому было принято решение не давать ботам возможности видеть сообщения от других ботов.
Получение обновлений
Как можно получать обновления?
На текущий момент доступно два способа. Вы можете использовать либо опрос, либо вебхуки. Обратите внимание: если вы используете вебхуки, метод getUpdates
работать не будет.
Принципиальное отличие: при опросе вашему приложению самому нужно запрашивать обновления у API, а используя вебхуки — сервера Telegram будут отправлять на ваш сервер каждое обновление с помощью HTTPS POST-запроса.
Предупреждение
Вебхуки могут работать только через HTTPS, допустимо использование самозаверенного сертификата.
Доступные порты: 443, 80, 88, 8443.
Опрос всегда выдаёт один и тот же результат!
Метод getUpdates
выдаёт 100 последних неподтверждённых обновлений. Чтобы подтвердить обновление, используйте параметр offset
при вызове getUpdates
вот так:
offset = update_id последнего обработанного обновления + 1
Все обновления с update_id
меньшим или равным offset
будут отмечены как подтверждённые и не будут больше возвращаться сервером.
У меня проблема с вебхуками
Если вы успешно задали адрес вебхука, но не получаете обновлений, убедитесь, что:
- SSL-сертификат вашего вебхука валиден и корректен
- При использовании самозаверенного сертификата, вы передаёте его публичный ключ в поле
certificate
метода setWebhook. Необходимо загружатьInputFile
, отправка строки не сработает. - Ваш вебхук работает на одном из допустимых портов: 443, 80, 88, 8443.
У меня проблема с самозаверенным сертификатом
Ознакомьтесь с инструкцией по созданию сертификатов. Если после прочтения у вас остались вопросы, напишите пользователю @BotSupport.
Как мне убедиться, что запросы идут с серверов Telegram?
Для этого включите ваш токен в адрес вебхука, примерно так:
https://example.com/your_token
Так как никто посторонний не знает вашего токена, запросы на этот адрес смогут отсылать только сервера Telegram.
Как делать запросы в HTTP-ответах к обновлениям?
Это возможно при использовании вебхуков. Преимуществом является сокращение числа запросов, недостатком — невозможность получения результата запроса и его статуса.
Всякий раз при получении обновления на вебхук, у вас есть два варианта:
1. Отправить POST-запрос к https://api.telegram.org/botTOKEN/МЕТОД
2. Ответить напрямую, указав метод в виде JSON в HTTP-ответе:
Примечание
Пример реализации этой возможности на PHP можно посмотреть в коде HelloBot.
Как скачивать файлы?
Для этого используйте метод getFile
.
Предупреждение
Этот метод работает только для файлов объёмом до 20 МБ.
Как закачать большой файл?
На текущий момент боты могут отправлять файлы объёмом до 50 МБ, так что крупные файлы отправить не получится. Возможно, это ограничение будет снято в будущем.
Как долго хранится file_id у файлов?
file_id
у отправленных вашим ботом файлов будут удалены после отправления нескольких тысяч файлов.
Для принятых файлов file_id
можно считать вечным и неизменным.
Массовая рассылка
Каков лимит сообщений в секунду?
При работе с отдельным чатом, избегайте отправки более 1 сообщения в секунду. Конечно, допустимы небольшие пики, но со временем вы начнёте получать ошибку 429.
При рассылке уведомлений нескольким пользователям, API не позволит отправлять более 30 сообщений в секунду. Для преодоления этого лимита вам необходимо разбить отправку на части с большим интервалом между собой (около 8-12 часов).
При работе с группой ограничение установлено на 20 сообщений в минуту.
Как получить список всех подписчиков моего бота?
К сожалению, пока сделать это встроенными методами нельзя. Возможно, в будущем будут добавлены пару строк для управления подписчиками.
Чтобы максимально эффективно рассылать сообщения, вам необходимо разбивать отправку на несколько частей с интервалом в 8-12 часов. Также недопустимо отправление более 30 сообщений разным пользователям в секунду — иначе вы будете получать ошибку 429.
См. также: Каков лимит сообщений в секунду?
инструкция по созданию собственного бота с помощью Telegram Bot API
Боты «Телеграма» быстро вошли в жизнь почти каждого человека. Они делают общение в приложении легким и интересным.
Существующие боты работают на разных операционных системах. Сегодня поговорим о телеграм api.
Сервис API Telegram
Сервис api telegram org создан для разработчиков, которые хотят написать собственные приложения на основе мессенджера. Исходные кодировки каждого абонента имеют открытый доступ, поддерживают все принципы безопасности. Для начала работы с «Эйпи» следует выполнить регистрацию приложения и разработчика.
Что такое Telegram API Bot
Telegram API Bot.
Боты и разнообразные программы дали еще больший толчок к развитию мессенджера. Они могут быть созданы любым пользова-телем со средним уровнем знания програм-мирования.
Telegram api бот – это небольшая утилита для программирования собственного bot api. Поддерживает русскоязычный клиент.
Если «Апи» – это встроенный интерфейс для взаимодействия приложения и ОС, то Telegram API позволяет посылать команды «Телеграма» компьютеру на понятном языке.
Предназначение
«Апи» состоит из команд и объектов, необходимых для выполнения установки «Телеграм-бота». Используя имеющийся интерфейс, вы получите возможность самостоятельно создавать помощников, которые будут выполнять отведенные им функции при каждом запуске Telegram.
Боты telegram на «Эйпи» могут выполнять следующие операции:
- Работать с документацией.
- Посылать и получать файлы от других роботов или клиентов.
- Скачивать видео, фильмы, музыку, книги.
- Отправлять, принимать message.
- Загружать фото, видео, аудиокниги.
Элементы управления
Робот «Телеграм» API имеет простые элементы управления, представляющие собой объекты JSON. Проще говоря, они выражаются в виде заданных по неким правилам строк. Применение такого алгоритма позволяет выполнять быстрый обмен данными. Он достигается путем использования набора «ключ:значение».
Управление может осуществляться по следующим методам:
- Получение информации и поиск обновлений.
- Работа в чате.
- Передача разнообразных элементов.
- Написание и отправка сообщений.
- Обновление базы онлайн флибусты.
- Online режим.
- Работа с платежной информацией, расчетными операциями (обменник, расчетные безналичные и наличные операции).
Telegram bot api на языке русском пока не создан. Используемый браузером стандартный перевод справляется с поставленной задачей.
Обмен сообщениями
Отправка сообщения ботом «Апи» не представляет никакой сложности. Для этого следует прописать всего пару команд.
Порядок выполняемых действий:
- Импортируем контакт по имени пользователя или номеру телефона.
- Отправляем сообщен
Пишем телеграмм бота на Python / Бот по выбору языка программирования
Простая инструкция по созданию легкого и удобного бота по выбору языка программирования.
Для работа с API телеграмма необходимо использовать одну из возможных библиотек. Библиотек много, но давайте сейчас остановимся на pyTelegramBotAPI как на одной из наиболее продвинутых библиотек.
Сперва выполняем её установку в проект. После установки импортируем её, а также устанавливаем API ключ для бота.
Получить ключ для бота можно через другого специального бота в телеграмме. Этот бот называется BotFather. Работать с ботом очень просто и всё что нам нужно сделать, так это обратиться к «папе боту», создать в нём нового бота, придумать название и после этого получить API ключ. Кстати, здесь же вы можете указать описание для бота, фото и прочую инфу. Если захотите, то с этим неплохо можно поиграться.
Вставляем полученный ключ в программу.
Теперь создайте весь необходимый функционал. Весь код представлен ниже:
import telebot
from telebot import types
bot = telebot.TeleBot('ВАШ_API_КЛЮЧ')
@bot.message_handler(commands=['website'])
def open_website(message):
markup = types.InlineKeyboardMarkup()
markup.add(types.InlineKeyboardButton("Перейти на сайт", url="https://itproger.com"))
bot.send_message(message.chat.id,
"Отличный выбор, нажмите на кнопку ниже и начинайте изучения курсов прямо сейчас",
parse_mode='html', reply_markup=markup)
@bot.message_handler(commands=['insta'])
def instagram(message):
markup = types.InlineKeyboardMarkup()
markup.add(types.InlineKeyboardButton("Перейти в Инстаграм", url="https://www.instagram.com/itproger_official/"))
bot.send_message(message.chat.id, "Нажмите на кнопку ниже и погрузитесь в мир IT прямо сейчас", parse_mode='html', reply_markup=markup)
@bot.message_handler(commands=['vk'])
def vk(message):
markup = types.InlineKeyboardMarkup()
markup.add(types.InlineKeyboardButton("Посетить группу Вк", url="https://vk.com/prog_life"))
bot.send_message(message.chat.id, "Нажмите на кнопку ниже и погрузитесь в мир IT прямо сейчас", parse_mode='html', reply_markup=markup)
@bot.message_handler(commands=['start'])
def start(message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=3)
btn1 = types.KeyboardButton('Создание игр')
btn2 = types.KeyboardButton('Мобильные приложения')
btn3 = types.KeyboardButton('Веб разработка')
btn4 = types.KeyboardButton('Софт для компьютеров')
btn5 = types.KeyboardButton('Обработка данных')
btn6 = types.KeyboardButton('Создание ИИ')
markup.add(btn1, btn2, btn3, btn4, btn5, btn6)
send_mess = f"<b>Привет {message.from_user.first_name} {message.from_user.last_name}</b>!\nКакое направление тебя интересует?"
bot.send_message(message.chat.id, send_mess, parse_mode='html', reply_markup=markup)
@bot.message_handler(content_types=['text'])
def mess(message):
get_message_bot = message.text.strip().lower()
if get_message_bot == "начать тест заново":
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=3)
btn1 = types.KeyboardButton('Создание игр')
btn2 = types.KeyboardButton('Мобильные приложения')
btn3 = types.KeyboardButton('Веб разработка')
btn4 = types.KeyboardButton('Софт для компьютеров')
btn5 = types.KeyboardButton('Обработка данных')
btn6 = types.KeyboardButton('Создание ИИ')
markup.add(btn1, btn2, btn3, btn4, btn5, btn6)
final_message = "Решил попробовать что-то ещё? \nВыбери какое направление тебя интересует:"
elif get_message_bot == "создание игр":
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=3)
btn1 = types.KeyboardButton('Под мобильные телефоны')
btn2 = types.KeyboardButton('Компьютеры и консоли')
btn3 = types.KeyboardButton('Виртуальная реальность')
btn4 = types.KeyboardButton('Web игра')
btn5 = types.KeyboardButton("Начать тест заново")
markup.add(btn1, btn2, btn3, btn4, btn5)
final_message = "Отлично, геймдев крутая тема, но под что хочется разрабатывать?"
elif get_message_bot == "под мобильные телефоны":
markup = types.InlineKeyboardMarkup()
markup.add(types.InlineKeyboardButton("Посмотреть курсы по Unity", url="https://itproger.com/tag/unity"))
final_message = "Для разработки игр под мобильные устройства зачастую используется игровой движок <a href='https://itproger.com/tag/unity'>Unity</a>\nДвижок прост в изучении и вы можете просмотреть курсы по нему по кнопке ниже"
# Здесь различные дополнительные проверки и условия
else:
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=3)
btn1 = types.KeyboardButton('Создание игр')
btn2 = types.KeyboardButton('Мобильные приложения')
btn3 = types.KeyboardButton('Веб разработка')
btn4 = types.KeyboardButton('Софт для компьютеров')
btn5 = types.KeyboardButton('Обработка данных')
btn6 = types.KeyboardButton('Создание ИИ')
markup.add(btn1, btn2, btn3, btn4, btn5, btn6)
final_message = "Так, так, так\nПостой, лучше нажми на одну из интерактивных кнопок ниже"
bot.send_message(message.chat.id, final_message, parse_mode='html', reply_markup=markup)
bot.polling(none_stop=True)
Наш бот
Сейчас каждый может протестировать нашего бот по этой ссылочке. Как видите, реализация бота это просто и никаких особых усердий не требуется.
Видео на эту тему
Также вы можете просмотреть детальное видео по разработке данного бота:
Дополнительный курс
На нашем сайте также есть углубленный курс по изучению языка Питон. В ходе огромной программы вы изучите не только язык Питон, но также научитесь создавать веб сайты за счёт веб технологий и фреймворка Джанго. За курс вы изучите массу нового и к концу программы будете уметь работать с языком Питон, создавать на нём полноценные ПК приложения на основе библиотеки Kivy, а также создавать веб сайты на основе библиотеки Джанго.
Разработка чат-ботов Telegram. Полный курс.
Курс: «Разработка чат-ботов Telegram. Полный курс.» Если вы хотели научиться разрабатывать собственных ботов в телеграм — данный материал для вас. Курс идеально подойдет для новичков, так как автор все рассказывает простыми словами с примерами. Поймет любой. Отзывы о материале хорошие. Материал прислал анонимный пользователь без комментариев.
Материал может быть удален по запросу правообладателя!
Описание курса:
Курс написан таким образом, что разобраться в нем будет очень просто. Было затрачено много времени, чтобы описать сложные процессы простыми словами. Поймет девушка-гуманитарий, школьник или тот, кто впервые видит компьютер! Для работы потребуется только браузер и интернет, работать можно как с компьютера, так и с планшета/смартфона с большим экраном.
Практическая часть:
- Создаем первого рабочего бота
- Получаем бесплатно сервер
- Структурируем код, используем удобную среду разработки
- Настройка множественных вариантов ответа
- Настройка встроенных и собственных команд
- Настройка админ-панели
- Включение и отключение предпросмотра ссылок
- Использование кнопок и клавиатур
- Отправка изображений
- Настройка многоуровневого бота с возможностью перехода на любой уровень
- Настройка рассылок пользователям
- Настройка реферальной системы
- Привязка платежной системы free-kassa
- Настройка обработки платежей (автоматическая выдача товара после оплаты)
Что потребуется:
- браузер (н-р, Google Chrome)
Если Вы не видите ссылку для скачивания материала — отключите блокиратор рекламы и добавьте наш сайт в список исключений. Если Вы против рекламы на нашем сайте — покупайте контент напрямую у авторов.
Ссылка на скачивание этого материала доступна только зарегистрированным пользователям сайта. Регистрация на сайте бесплатная и не займет много времени. Если у Вас уже есть аккаунт — Вы можете авторизоваться.
Материал предоставлен исключительно для ознакомления!
Опубликовано: Анонимно
Запускаем телеграм-бота на сервере
Не так давно мы создали телеграм-бота на Python: можно было написать ему свой знак зодиака, а он в ответ давал предсказание о долгой счастливой жизни. Но у бота есть недостаток: он работает, пока запущена программа на нашем компьютере. Если мы её остановим или выключим компьютер, бот тоже перестанет отвечать на сообщения.
Вот что мы сделаем, чтобы бот работал независимо от всего:
- Выберем сервер.
- Подготовим программу для работы на нём.
- Зальём программу на сервер.
- Настроим сервер, чтобы он исполнял программу.
Выбираем сервер
Нам нужен сервер, который умеет работать с Python и запускать файлы программы автоматически. На самом деле он у нас уже есть — на нём крутится сайт mihailmaximov.ru. Если вы всё пропустили — держите подборку:
Тот хостинг, который мы выбрали для проектов, уже умеет запускать Python-файлы. Если вы пользуетесь другим сервисом, то проверьте, умеет ли он то же самое.
Готовим программу и отправляем её на сервер
Единственное, что нужно добавить в наш код телеграм-бота, — специальную команду интерпретатору, чтобы он знал, как работать с нашим файлом. Но перед этим нужно проверить, какая версия Python на нём установлена.
Чтобы это узнать, соединимся с сервером по протоколу SSH и спросим у него напрямую. Для этого используем программу Putty, а настройки подключения возьмём в личном кабинете хостинга:
Этих данных достаточно, чтобы управлять сервером по SSH.
Вставляем их в Putty и подключаемся. Помните, что для безопасности во время ввода пароля курсор стоит на месте, чтобы никто не смог выяснить, сколько символов вы набираете. Когда подключились, вводим команду python3.3 -V — она покажет, есть ли на сервере поддержка этой версии Python:
Сервер говорит, что у него установлена версия Python 3.3.5 — нам этого хватит.
Теперь добавляем в самое начало нашего файла с программой такую строчку:
#!/usr/bin/python3.3
В статье о том, как опубликовать сайт в интернете, мы рассказывали, как залить файлы на сервер. Это умение нам сейчас пригодится: сохраняем нашу программу с гороскопом как файл с расширением .py и отправляем его на сервер в папку cgi-bin (то, что лежит в этой папке, никто не увидит):
Настраиваем сервер
Теперь научим сервер понимать, как работать с нашей программой. Для этого в корне сайта находим файл .htaccess и добавляем в него такую строчку:
AddHandler cgi-script .py
Если у вас такого файла нет — создайте его и не забудьте про точку в самом начале названия.
Последнее, что осталось сделать, — настроить права доступа у файла с программой. Находим её среди файлов хостинга и выставляем права 755 или rwxrwxr-x:
Теперь с помощью Putty снова подключаемся к серверу и настраиваем рабочее окружение. Это как будто виртуальная песочница, где мы сможем ставить нужные модули для Python, чтобы не мешать остальным пользователям сервера.
Всё, что мы будем делать дальше, относится к хостингу SpaceWeb. Если у вас другой хостинг, то, возможно, часть команд вам не пригодится и Python будет работать напрямую. У нас так не работает, поэтому делаем виртуальное окружение.
В SSH-терминале пишем по очереди такие команды (вместо .thecode можно написать название каталога, которое вам по душе):
virtualenv .thecode
source .thecode/bin/activate
Эти две команды создадут виртуальное пространство для запуска Python-файлов.
Теперь установим Python-модуль для работы с Телеграмом:
pip install pytelegrambotapi
Когда установка закончится, пишем такую команду:
nohup python3 /home/t/thecode/osebe/public_html/cgi-bin/telegoroskop.py
/home/t/thecode/osebe/ — это наш путь к папке cgi-bin, а у вас он будет другим. Поменяйте путь на свой и запускайте.
Чтобы программа продолжала работать после того, как мы закроем SSH-клиент, в самом начале пишем команду nohup.
Результат проекта — бот @TheCode_Baboolya_bot.
Что дальше
Мы сделали самые базовые вещи — запустили скрипт на сервере и сделали так, чтобы он работал там постоянно. Но вот как можно это улучшить:
- сделать так, чтобы программа сама перезапускалась, если остановится;
- написать отдельный сервис, через который мы сможем запускать и останавливать бота;
- прикрутить этот сервис к другому телеграм-боту, чтобы в итоге боты управляли всем миром.
Telegram Bot API
Bot API — это интерфейс на основе HTTP, созданный для разработчиков, заинтересованных в создании ботов для Telegram.
Чтобы узнать, как создать и настроить бота, обратитесь к разделу Introduction to Bots и FAQ по ботам .
Последние изменения
Подпишитесь на @BotNews, чтобы первым узнавать о последних обновлениях и присоединяться к обсуждению в @BotTalk
4 июня 2020
API ботов 4.9
- Добавлено новое поле via_bot в объект сообщения. Теперь вы можете узнать, какой бот использовался для отправки сообщения.
- Поддерживаются эскизы видео для встроенной анимации GIF и MPEG4.
- Поддерживается новая анимация баскетбола для случайных игральных костей. Выбирайте между различными анимациями (игра в кости, дартс, баскетбол), указав параметр emoji в методе sendDice.
24 апреля 2020
API ботов 4.8
- Поддерживаемые объяснения викторин 2.0. Добавьте пояснения, указав параметры объяснение и объяснение_парс_режим в методе sendPoll.
- Добавлены поля объяснение и объяснение_ентити к объекту опроса.
- Поддерживаются опросы по времени, которые автоматически закрываются в определенную дату и время. Настройте, указав параметр open_period или close_date в методе sendPoll.
- Добавлены поля open_period и close_date в объект Poll.
- Поддерживается новая анимация дартса для мини-игры в кости. Выберите между анимацией игральных костей по умолчанию и анимацией дартса, указав параметр emoji в методе sendDice.
- В объект Dice добавлено поле emoji .
30 марта 2020
Бот API 4.7
- Добавлен метод sendDice для отправки сообщения о кубиках, которое будет иметь случайное значение от 1 до 6.(Да, нам известно о «правильном» в единственном числе die . Но это неудобно, и мы решили помочь ему измениться. По одной кости за раз!)
- Добавлен кубик поля в объект сообщения.
- Добавлен метод getMyCommands для получения текущего списка команд бота.
- Добавлен метод setMyCommands для изменения списка команд бота через Bot API вместо @BotFather.
- Добавлена возможность создавать наборы анимированных стикеров путем указания параметра tgs_sticker вместо png_sticker в методе createNewStickerSet.
- Добавлена возможность добавлять анимированные стикеры в наборы, созданные ботом, указав параметр tgs_sticker вместо png_sticker в методе addStickerToSet.
- Добавлено поле thumb в объект StickerSet.
- Добавлена возможность изменять эскизы наборов стикеров, созданных ботом с помощью метода setStickerSetThumb.
См. Более ранние изменения »
Авторизация бота
При создании каждому боту выдается уникальный токен аутентификации.Маркер выглядит примерно так: 123456: ABC-DEF1234ghIkl-zyx57W2v1u123ew11
, но вместо этого в этом документе мы будем использовать просто
Запросы
Все запросы к Telegram Bot API должны обслуживаться через HTTPS и должны быть представлены в следующей форме: https://api.telegram.org/bot
. Как это например:
https: // api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/getMe
Мы поддерживаем HTTP-методы GET и POST . Мы поддерживаем четыре способа передачи параметров в запросах Bot API:
- Строка запроса URL
- приложение / x-www-form-urlencoded
- application / json (кроме загрузки файлов)
- multipart / form-data (используется для загрузки файлов)
Ответ содержит объект JSON, который всегда имеет логическое поле «ok» и может иметь необязательное поле String «description» с понятным для человека описанием результата.Если «ok» равно true, запрос был успешным, и его результат можно найти в поле «результат». В случае неудачного запроса «ok» равно false, а ошибка объясняется в «описании». Также возвращается целочисленное поле error_code, но его содержимое может измениться в будущем. Некоторые ошибки могут также иметь необязательное поле «параметры» типа ResponseParameters, которое может помочь автоматически обработать ошибку.
- Все методы в Bot API не чувствительны к регистру.
- Все запросы должны выполняться с использованием UTF-8.
Запросы при получении обновлений
Если вы используете webhooks , вы можете выполнить запрос к Bot API при отправке ответа на webhook. Используйте тип содержимого ответа application / json или application / x-www-form-urlencoded или multipart / form-data для передачи параметров. Укажите вызываемый метод в параметре method запроса.Невозможно узнать, что такой запрос был успешным, или получить его результат.
Примеры можно найти в нашем FAQ.
Получение обновлений
Существует два взаимоисключающих способа получения обновлений для вашего бота — метод getUpdates с одной стороны и Webhooks с другой. Входящие обновления хранятся на сервере до тех пор, пока бот не получит их в любом случае, но они не будут храниться дольше 24 часов.
Независимо от того, какой вариант вы выберете, в результате вы получите JSON-сериализованные объекты обновления.
Обновление
Этот объект представляет входящее обновление.
Максимум один дополнительных параметров может присутствовать в любом данном обновлении.
Поле | Тип | Описание |
---|---|---|
update_id | Целое число | Уникальный идентификатор обновления. Идентификаторы обновления начинаются с определенного положительного числа и последовательно увеличиваются. Этот идентификатор становится особенно удобным, если вы используете Webhooks, поскольку он позволяет игнорировать повторяющиеся обновления или восстанавливать правильную последовательность обновлений, если они выходят из строя.Если новых обновлений нет хотя бы неделю, то идентификатор следующего обновления будет выбран случайно, а не последовательно. |
сообщение | Сообщение | Дополнительно . Новое входящее сообщение любого типа — текст, фото, стикер и т. Д. |
edited_message | Сообщение | Дополнительно . Новая версия сообщения, известная боту и отредактированная |
channel_post | Сообщение | Необязательно .Новые входящие сообщения на канале любого типа — текст, фото, стикеры и т. Д. |
edited_channel_post | Сообщение | Необязательно . Новая версия известного боту сообщения канала отредактирована |
inline_query | InlineQuery | Необязательно . Новый входящий встроенный запрос |
selected_inline_result | ChosenInlineResult | Необязательно . Результат встроенного запроса, который был выбран пользователем и отправлен своему партнеру по чату.Пожалуйста, ознакомьтесь с нашей документацией по сбору отзывов, чтобы узнать, как включить эти обновления для вашего бота. |
callback_query | CallbackQuery | Необязательно . Новый входящий запрос обратного вызова |
shipping_query | Запрос на доставку | Необязательно . Новый входящий запрос на доставку. Только для счетов с гибкой ценой |
pre_checkout_query | PreCheckoutQuery | Необязательно .Новый входящий предварительный запрос. Содержит полную информацию о кассе |
опрос | Опрос | Необязательно . Новое состояние опроса. Боты получают только обновления об остановленных опросах и опросах, которые отправляет бот |
poll_answer | Ответ на опрос | Необязательно . Пользователь изменил свой ответ в неанонимном опросе. Боты получают новые голоса только в опросах, которые отправил сам бот. |
getUpdates
Используйте этот метод для получения входящих обновлений с помощью длительного опроса (wiki).Возвращается массив объектов обновления.
Параметр | Тип | Обязательно | Описание |
---|---|---|---|
смещение | Целое число | Дополнительно | Идентификатор первого возвращаемого обновления. Должен быть на единицу больше, чем самый высокий среди идентификаторов ранее полученных обновлений. По умолчанию возвращаются обновления, начиная с самого раннего неподтвержденного обновления. Обновление считается подтвержденным, как только вызывается getUpdates со смещением на выше, чем его update_id .Отрицательное смещение может быть указано для получения обновлений, начиная с -offset update от конца очереди обновлений. Все предыдущие обновления будут забыты. |
предел | Целое число | Дополнительно | Ограничивает количество получаемых обновлений. Принимаются значения от 1 до 100. По умолчанию 100. |
тайм-аут | Целое число | Дополнительно | Тайм-аут в секундах для длительного опроса. По умолчанию 0, т.е.е. обычный короткий опрос. Должен быть положительным, короткий опрос следует использовать только в целях тестирования. |
allowed_updates | Массив строк | Дополнительно | Сериализованный в формате JSON список типов обновлений, которые должен получать бот. Например, укажите [«message», «edited_channel_post», «callback_query»], чтобы получать обновления только этих типов. См. Обновление для получения полного списка доступных типов обновлений. Укажите пустой список для получения всех обновлений независимо от типа (по умолчанию).Если не указано, будет использоваться предыдущая настройка. Обратите внимание, что этот параметр не влияет на обновления, созданные до вызова getUpdates, поэтому нежелательные обновления могут быть получены в течение короткого периода времени. |
Примечания
1. Этот метод не будет работать, если настроен исходящий веб-перехватчик.
2. Чтобы избежать дублирования обновлений, пересчитывайте смещение после каждого ответа сервера.
набор Webhook
Используйте этот метод, чтобы указать URL-адрес и получать входящие обновления через исходящий веб-перехватчик. При каждом обновлении для бота мы будем отправлять HTTPS-запрос POST на указанный URL-адрес, содержащий сериализованное обновление JSON. В случае неудачного запроса мы откажемся от него после разумного количества попыток. В случае успеха возвращает True .
Если вы хотите убедиться, что запрос Webhook исходит от Telegram, мы рекомендуем использовать секретный путь в URL-адресе, например.грамм. https://www.example.com/ <токен>
. Поскольку никто другой не знает токен вашего бота, можете быть уверены, что это мы.
Параметр | Тип | Обязательно | Описание |
---|---|---|---|
URL | Строка | Есть | URL HTTPS для отправки обновлений. Используйте пустую строку, чтобы удалить интеграцию веб-перехватчика |
сертификат | Входной файл | Дополнительно | Загрузите сертификат открытого ключа, чтобы можно было проверить используемый корневой сертификат.См. Подробности в нашем самоподписанном руководстве. |
max_connections | Целое число | Дополнительно | Максимально допустимое количество одновременных HTTPS-подключений к веб-перехватчику для доставки обновлений, 1–100. По умолчанию 40 . Используйте более низкие значения, чтобы ограничить нагрузку на сервер вашего бота, и более высокие значения, чтобы увеличить пропускную способность вашего бота. |
allowed_updates | Массив строк | Дополнительно | Сериализованный в формате JSON список типов обновлений, которые должен получать бот.Например, укажите [«message», «edited_channel_post», «callback_query»], чтобы получать обновления только этих типов. См. Обновление для получения полного списка доступных типов обновлений. Укажите пустой список для получения всех обновлений независимо от типа (по умолчанию). Если не указано, будет использоваться предыдущая настройка. Обратите внимание, что этот параметр не влияет на обновления, созданные до вызова setWebhook, поэтому нежелательные обновления могут быть получены в течение короткого периода времени. |
Примечания
1. Вы не сможете получать обновления с помощью getUpdates, пока настроен исходящий веб-перехватчик.
2. Чтобы использовать самозаверяющий сертификат, вам необходимо загрузить свой сертификат открытого ключа, используя параметр сертификат . Пожалуйста, загрузите как InputFile, отправка строки не будет работать.
3. В настоящее время поддерживаются порты для Webhooks : 443, 80, 88, 8443 .НОВИНКА! Если у вас возникли проблемы с настройкой веб-перехватчиков, ознакомьтесь с этим замечательным руководством по веб-перехватчикам.
удалитьWebhook
Используйте этот метод, чтобы удалить интеграцию с веб-перехватчиком, если вы решите вернуться к getUpdates. В случае успеха возвращает True . Не требует параметров.
getWebhookInfo
Используйте этот метод, чтобы получить текущий статус веб-перехватчика. Не требует параметров. В случае успеха возвращает объект WebhookInfo. Если бот использует getUpdates, он вернет объект с пустым полем url .
WebhookInfo
Содержит информацию о текущем состоянии веб-перехватчика.
Поле | Тип | Описание |
---|---|---|
URL | Строка | URL-адрес веб-перехватчика, может быть пустым, если веб-перехватчик не настроен |
has_custom_certificate | логический | Верно, если для проверки сертификатов веб-перехватчика был предоставлен настраиваемый сертификат |
pending_update_count | Целое число | Количество обновлений, ожидающих доставки |
last_error_date | Целое число | Необязательно .Время Unix для самой последней ошибки, которая произошла при попытке доставить обновление через webhook |
last_error_message | Строка | Необязательно . Сообщение об ошибке в удобочитаемом формате для самой последней ошибки, которая произошла при попытке доставить обновление через webhook |
max_connections | Целое число | Необязательно . Максимально допустимое количество одновременных HTTPS-подключений к веб-перехватчику для доставки обновлений |
allowed_updates | Массив строк | Необязательно .Список типов обновлений, на которые подписан бот. По умолчанию для всех типов обновлений |
Доступные типы
Все типы, используемые в ответах Bot API, представлены как JSON-объекты.
Можно безопасно использовать 32-разрядные целые числа со знаком для хранения всех полей Integer , если не указано иное.
Необязательные поля могут не возвращаться, если они неактуальны.
Пользователь
Этот объект представляет пользователя или бота Telegram.
Поле | Тип | Описание |
---|---|---|
id | Целое число | Уникальный идентификатор этого пользователя или бота |
is_bot | логический | Верно, если этот пользователь бот |
first_name | Строка | Имя пользователя или бота |
фамилия | Строка | Необязательно .Фамилия пользователя или бота |
имя пользователя | Строка | Необязательно . Имя пользователя или бота |
language_code | Строка | Необязательно . Языковой тег IETF языка пользователя |
can_join_groups | логический | Необязательно . Правда, если бота можно приглашать в группы. Вернулся только в getMe. |
can_read_all_group_messages | логический | Необязательно .Верно, если для бота отключен приватный режим. Вернулся только в getMe. |
supports_inline_queries | логический | Необязательно . Правда, если бот поддерживает встроенные запросы. Вернулся только в getMe. |
Чат
Этот объект представляет чат.
Поле | Тип | Описание |
---|---|---|
id | Целое число | Уникальный идентификатор этого чата.Это число может быть больше 32 бит, и некоторые языки программирования могут иметь затруднительные / скрытые дефекты при его интерпретации. Но он меньше 52 бит, поэтому 64-битное целое число со знаком или плавающий тип двойной точности безопасны для хранения этого идентификатора. |
тип | Строка | Тип чата, может быть «частным», «групповым», «супергрупповым» или «канальным» |
название | Строка | Необязательно . Заголовок, для супергрупп, каналов и групповых чатов |
имя пользователя | Строка | Необязательно .Имя пользователя, для приватных чатов, супергрупп и каналов, если есть |
first_name | Строка | Необязательно . Имя собеседника в приватном чате |
фамилия | Строка | Необязательно . Фамилия собеседника в приватном чате |
фото | Чат Фото | Необязательно . Фото чата. Вернул только в getChat. |
описание | Строка | Необязательно .Описание, для групп, супергрупп и чатов каналов. Вернул только в getChat. |
invit_link | Строка | Необязательно . Ссылка для приглашения в чат для групп, супергрупп и чатов каналов. Каждый администратор в чате генерирует свои собственные пригласительные ссылки, поэтому бот должен сначала создать ссылку с помощью exportChatInviteLink. Вернул только в getChat. |
pinned_message | Сообщение | Необязательно .Закрепленное сообщение для групп, супергрупп и каналов. Вернул только в getChat. |
разрешения | ChatPermissions | Необязательно . Разрешения участников чата по умолчанию для групп и супергрупп. Вернул только в getChat. |
slow_mode_delay | Целое число | Необязательно . Для супергрупп — минимально допустимая задержка между последовательными сообщениями, отправляемыми каждым непривилегированным пользователем. Вернул только в getChat. |
имя_набора_наклей | Строка | Необязательно . Для супергрупп — название набора групповых стикеров. Вернул только в getChat. |
can_set_sticker_set | логический | Необязательно . Правда, если бот умеет менять групповой набор стикеров. Вернул только в getChat. |
Сообщение
Этот объект представляет сообщение.
Поле | Тип | Описание |
---|---|---|
message_id | Целое число | Уникальный идентификатор сообщения в этом чате |
из | Пользователь | Необязательно .Отправитель, пусто для сообщений, отправленных на каналы |
дата | Целое число | Дата отправки сообщения по времени Unix |
чат | Чат | Цепочка, которой принадлежит сообщение |
вперед_от | Пользователь | Необязательно . Для пересылаемых сообщений отправитель исходного сообщения |
forward_from_chat | Чат | Необязательно .Для сообщений, пересылаемых с каналов, информация об исходном канале |
forward_from_message_id | Целое число | Необязательно . Для сообщений, пересылаемых из каналов, идентификатор исходного сообщения в канале |
forward_signature | Строка | Необязательно . Для сообщений, пересылаемых с каналов, подпись автора сообщения, если есть |
forward_sender_name | Строка | Необязательно .Имя отправителя для сообщений, пересылаемых от пользователей, которые не разрешают добавлять ссылку на свою учетную запись в пересылаемых сообщениях |
forward_date | Целое число | Необязательно . Для пересылаемых сообщений дата отправки исходного сообщения по времени Unix |
reply_to_message | Сообщение | Необязательно . Для ответов — исходное сообщение. Обратите внимание, что объект сообщения в этом поле не будет содержать дополнительных полей reply_to_message , даже если он сам является ответом. |
via_bot | Пользователь | Необязательно . Бот, через который было отправлено сообщение |
edit_date | Целое число | Необязательно . Дата последнего редактирования сообщения в системе Unix |
media_group_id | Строка | Необязательно . Уникальный идентификатор группы мультимедийных сообщений, к которой принадлежит это сообщение. |
автор_подпись | Строка | Необязательно .Подпись автора поста для сообщений в каналах |
текст | Строка | Необязательно . Для текстовых сообщений фактический текст сообщения в кодировке UTF-8, 0-4096 символов |
организаций | Массив MessageEntity | Необязательно . Для текстовых сообщений специальные объекты, такие как имена пользователей, URL-адреса, команды ботов и т. Д., Которые появляются в тексте |
анимация | Анимация | Необязательно .Сообщение — это анимация, информация об анимации. Для обратной совместимости, когда это поле установлено, поле документа также будет установлено |
аудио | Аудио | Необязательно . Сообщение — аудиофайл, информация о файле |
документ | Документ | Необязательно . Сообщение — это общий файл, информация о файле |
фото | Массив PhotoSize | Необязательно .В сообщении есть фото, доступные размеры фото |
наклейка | Наклейка | Необязательно . Сообщение — наклейка, информация о наклейке |
видео | Видео | Необязательно . Сообщение это видео, информация о видео |
video_note | VideoNote | Необязательно . Сообщение — видеозаметка, информация о видеосообщении |
голос | Голос | Необязательно .Сообщение — голосовое сообщение, информация о файле |
подпись | Строка | Необязательно . Подпись к анимации, аудио, документу, фотографии, видео или голосу, 0-1024 символов |
caption_entities | Массив MessageEntity | Необязательно . Для сообщений с заголовком в заголовке используются специальные объекты, такие как имена пользователей, URL-адреса, команды ботов и т. Д. |
контакт | Контакт | Необязательно .Сообщение — общий контакт, информация о контакте |
игральные кости | Игральные кости | Необязательно . Сообщение представляет собой игральную кость со случайным значением от 1 до 6 |
игра | Игра | Необязательно . Сообщение — это игра, информация об игре. Подробнее об играх » |
опрос | Опрос | Необязательно . Сообщение — нативный опрос, информация о опросе |
площадка | Заведение | Необязательно .Сообщение — это место проведения, информация о месте проведения. Для обратной совместимости, когда это поле установлено, поле location также будет установлено |
расположение | Расположение | Необязательно . Сообщение является общим местоположением, информация о местоположении |
new_chat_members | Массив пользователей | Необязательно . Новые участники, которые были добавлены в группу или супергруппу, и информация о них (сам бот может быть одним из этих участников) |
left_chat_member | Пользователь | Необязательно .Участник удален из группы, информация о нем (этим участником может быть сам бот) |
new_chat_title | Строка | Необязательно . Название чата было изменено на это значение |
new_chat_photo | Массив PhotoSize | Необязательно . Фотография чата была изменена на это значение |
delete_chat_photo | Правда | Необязательно . Служебное сообщение: фото чата удалено |
group_chat_created | Правда | Необязательно .Служебное сообщение: группа создана |
supergroup_chat_created | Правда | Необязательно . Служебное сообщение: супергруппа создана. Это поле нельзя получить в сообщении, приходящем через обновления, потому что бот не может быть членом супергруппы при ее создании. Его можно найти в reply_to_message только в том случае, если кто-то отвечает на самое первое сообщение в непосредственно созданной супергруппе. |
Как развернуть бота Telegram
12 июня 2017 г., Python,
26515 Представления
Часть 1 — Как создать бота Telegram с использованием Python
Это вторая часть моего небольшого руководства по созданию бота Telegram с использованием Python и Django.Сегодня я собираюсь показать вам, как развернуть наше приложение Django на хостинге Digital Ocean VPS, мы собираемся использовать версию Linux Ubuntu 14.04 LTS.
Чему вы собираетесь научиться:
- Как развернуть приложение django (или любое приложение WSGI) в Digital Ocean с использованием доступа SSH
- Как работать с gunicorn и nginx
- Как управлять своими процессами с помощью supervisord
- Настройка virtualenv с использованием pyenv
- Добавление нашего приложения в автозапуск системы (init.d)
Даже несмотря на то, что мы собираемся работать с приложением Django, эта инструкция будет применима для любого веб-приложения Python WSGI, поэтому не стесняйтесь использовать ее с Pyramid, Flask, Bottle или любой другой популярной платформой веб-приложений на Python. экосистема. В этом посте я собираюсь использовать VPS (Virtual Private Server) на популярном хостинге Digital Ocean. Кстати, если вы зарегистрируетесь по моей ссылке, вы сразу получите кредит в размере 10 долларов на свой счет, деньги можно использовать для покупки небольших серверов и использования их в своих целях.
Более того, нет необходимости развертывать ваше приложение на общедоступных серверах, все может быть выполнено на вашем локальном компьютере с Ubuntu или с помощью инструментов администратора, таких как VirtualBox или Vagrant (но в этом случае вы не сможете настроить веб-перехватчик). Давайте начнем.
Создание VPS
Я предполагаю, что вы уже зарегистрировались на Digital Ocean. Итак, войдите в систему и нажмите Create Droplet в самом верху.
Теперь выберем самую дешевую каплю для нашей цели (5 долларов в месяц).Выберите Ubuntu 14.04.5 LTS или самую новую версию.
Прокрутите вниз и выберите центр обработки данных. Обычно я предпочитаю Frankfunt из-за самого низкого пинга у меня дома. Когда все будет готово, нажмите кнопку Create . Ваша капля (VPS) будет готова в течение 60 секунд, вы найдете учетные данные для удаленного доступа в своем почтовом ящике.
Конфигурация сервера
Когда сервер будет готов, вы должны войти в систему и изменить свой пароль root.
Обновим пакеты.
# apt-get update
# apt-get -y upgrade
А затем создайте пользователя sudo.
# adduser django
# adduser django sudo
После добавления пользователя sudo войдите в систему под этим пользователем с именем django .
Теперь установим пакеты, которые мы собираемся использовать для развертывания.
$ sudo apt-get install -y build-essential
$ sudo apt-get install -y python-dev libreadline-dev libbz2-dev libssl-dev libsqlite3-dev libxslt1-dev libxml2-dev
$ sudo apt-get install -y git
В самом начале я упомянул, что мы собираемся использовать pyenv для установки последней версии Python (обычно я не работаю с системным Python, когда дело касается пользовательских скриптов и веб-приложений).Если вы не знаете, что такое Pyenv и как с ним работать, взгляните на мой пост на русском языке (переведу как можно скорее).
$ pyenv установить 2.7.13
Скачивание Python-2.7.13.tgz ...
-> https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz
Установка Python-2.7.13 ...
Установлен Python-2.7.13 в /home/django/.pyenv/versions/2.7.13
Чтобы загрузить, скомпилировать и установить новейшую версию Python, потребуется некоторое время, проявите терпение 🙂 Ubuntu 14.04 имеет Python 2.7.6, который довольно старый, имеет некоторые проблемы с безопасностью TLS и не поддерживает TLS 1.2.
Теперь нам нужно клонировать репо. Если вы забыли ссылку, вот она.
$ cd ~
$ git clone https://github.com/adilkhash/planetpython_telegrambot.git
$ cd planetpython_telegrambot /
Настройте изолированную виртуальную среду Python с помощью pyenv.
$ pyenv virtualenv 2.7.13 telegram_bot
$ pyenv локальный telegram_bot
Пора установить зависимости с помощью pip.
pip install -r requirements.txt
Я внес некоторые изменения, которые не описаны в предыдущем посте о боте Telegram. Я переместил некоторые настройки переменных в файл .env, которым управляет многоразовое приложение django под названием django-envrion . Взгляните на изменения.
Создайте файл .env из файла .env-шаблона, а затем вы должны предоставить свои собственные учетные данные.
$ cd blog_telegram && mv.env-template .env && vi .env
Вы должны изменить DEBUG на False, поместить свой токен бота Telegram и указать дополнительное имя хоста (если у вас несколько хостов, они должны быть разделены запятыми).
ALLOWED_HOSTS = 127.0.0.1, bot.khashtamov.com
Пример показывает, что у меня есть 2 хоста: loopback и дополнительный хост поддомена для бота Telegram (который будет использоваться для настройки веб-хука).
Настройка действующего SSL-сертификата
В моем последнем посте о Telegram я упомянул, что есть 2 способа взаимодействия с ботом Telegram:
- Использование getUpdates API-вызов
- Настройка веб-перехватчика с использованием setWebhook API-метода
Более того, если вы решите использовать веб-перехватчик, вам необходимо получить действующий сертификат SSL или создать свой собственный самозаверяющий сертификат, используя такие инструменты, как OpenSSL.Мы собираемся получить действующий, используя бесплатный сервис Let’s Encrypt. У меня есть статья на русском, в которой описан процесс выдачи SSL-сертификата (переведу как можно скорее).
$ cd ~ && git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt /
$ ./letsencrypt-auto certonly --standalone -d bot.khashtamov.com
Вы должны ответить на несколько вопросов относительно веб-сайта, и когда все будет готово, ваш новый сертификат будет расположен в / etc / letsencrypt / live / bot.khashtamov.com/. Обратите внимание на параметр «-d» в скрипте letsencrypt-auto, укажите собственное доменное имя.
Настройка веб-сервера Nginx
Пришло время настроить прокси-сервер для нашего приложения Django. Я решил взять nginx , который является одним из самых надежных веб-серверов и считается лучшим методом развертывания в производственной среде. Nginx будет передавать все входящие запросы нашему приложению, которое будет обслуживаться сервером WSGI под названием Gunicorn.Давайте посмотрим на файл конфигурации:
$ sudo apt-get install -y nginx
$ cd / etc / nginx / sites-available /
$ sudo nano telegram_bot.conf
содержимое telegram_bot.conf должно быть:
сервер {
слушать 80;
слушайте 443 ssl;
имя_сервера bot.khashtamov.com;
ssl_certificate /etc/letsencrypt/live/bot.khashtamov.com/fullchain.pem;
ssl_certificate_key / etc / letsencrypt / live / bot.khashtamov.com/privkey.pem;
место расположения / {
proxy_set_header Хост $ http_host;
proxy_redirect выключен;
proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $ remote_addr;
proxy_set_header X-Scheme $ scheme;
proxy_pass http: // localhost: 8001 /;
}
}
Не забудьте заменить имя хоста! Теперь нам нужно перезапустить сервер.
$ cd / etc / nginx / с поддержкой сайтов /
$ sudo ln -s ../sites-available/telegram_bot.conf telegram_bot.conf
$ sudo service nginx перезапуск
Что мы только что сделали?
- Предоставьте действующий SSL-сертификат для нашего домена (bot.khashtamov.com)
- Настройте прокси. Все входящие http-запросы будут проксироваться на localhost: 8001 (где будет запущен Gunicorn)
- Предоставьте дополнительные HTTP-заголовки (IP-адрес, имя хоста, http-схему и т. Д.)). Если вы хотите узнать больше, взгляните на документы.
В целях тестирования и чтобы убедиться, что все настроено правильно, мы можем запустить сервер разработки django на порту 8001:
$ cd ~ / planetpython_telegrambot /
$ python manage.py runserver 8001
Откройте браузер и перейдите к настроенному хосту
URL-адрес не найден. Ошибка — это нормально, потому что у нас есть только 1 действительный URL-адрес для нашего бота для получения команд (и, конечно, URL-адрес администратора django).
Создание Gunicorn и Supervisor
Теперь давайте настроим наш готовый к производству сервер WSGI gunicorn , которым будет управлять менеджер процессов supervisord .
Что такое супервайзер?
Supervisor — это служебная программа диспетчера процессов. Он отслеживает процессы и следит за их правильной работой. Например, если наш сервер Gunicorn умирает, супервизор пытается перезапустить его и предоставляет обратную связь. Обратите внимание, что если вы хотите управлять процессом через супервизор , убедитесь, что ваша программа работает в режиме переднего плана .
Напишем конфигурационный файл для gunicorn:
[программа: Gunicorn]
command = / home / django / .pyenv / versions / telegram_bot / bin / gunicorn blog_telegram.wsgi: application -b 127.0.0.1:8001 -w 1 --timeout = 60 --graceful-timeout = 60 --max-requests = 1024
каталог = / домой / django / planetpython_telegrambot /
пользователь = django
redirect_stderr = Правда
stdout_logfile = / tmp / gunicorn.log
stderr_logfile = / tmp / gunicorn_err.log
autostart = true
autorestart = true
startsecs = 10
stopwaitsecs = 10
приоритет = 999
Сохраните как Gunicorn.conf . Мы уже установили gunicorn через pip (это наша зависимость в файле requirements.txt).
Содержание конфигурационного файла нашего супервизора:
[unix_http_server]
файл = / tmp / telgram_bot_supervisord.sock
[супервайзер]
файл журнала = / tmp / telgram_bot_supervisord.log
logfile_maxbytes = 50 МБ
logfile_backups = 10
loglevel = информация
pidfile = / tmp / telgram_bot_supervisord.pid
nodaemon = ложь
minfds = 1024
minprocs = 200
[rpcinterface: руководитель]
руководитель.rpcinterface_factory = supervisor.rpcinterface: make_main_rpcinterface
[supervisorctl]
serverurl = unix: ///tmp/telgram_bot_supervisord.sock
[включают]
files = /home/django/planetpython_telegrambot/gunicorn.conf
Сохраните его в ~ / planetpython_telegrambot / supervisord.conf и запустите через:
$ супервайзер
Если ваши настройки верны, сообщений об ошибках быть не должно.
Супервизор управляется утилитой supervisorctl .
$ supervisorctl
gunicorn RUNNING pid 20901, время работы 0:04:18
руководитель>
Если вам нужна помощь, наберите:
supervisor> помощь остановить
остановить Остановить процесс
stop: * Остановить все процессы в группе
stop Остановить несколько процессов или групп
остановить все Остановить все процессы
руководитель>
Если супервизор запущен, ваш Telegram-бот уже в сети.
Запуск супервизора после перезапуска системы
Что произойдет, если ваш VPS будет перезапущен (сбой в центре обработки данных, обновление системы, ошибка администратора и т. Д.)? Ничего. Ваши веб-приложения не будут перезапущены. Мы должны это исправить.
Мы собираемся использовать сценарий инициализации выскочки.
description "Supervisor Telegram bot django app start handler"
начать на уровне запуска
телеграмма. Сообщение — Python Telegram Bot 13.0 документация
телеграмма.Сообщение — документация Python Telegram Bot 13.0
Python Telegram Bot
- класс
телеграмма.
Сообщение
( message_id: int , date: datetime.datetime , chat: telegram.chat.Chat , from_user: telegram.user.User = None , forward_from: telegram.user.User = Нет , forward_from_chat: телеграмма.chat.Chat = None , forward_from_message_id: int = None , forward_date: datetime.datetime = None , reply_to_message: Message = None , edit_date: datetime.datetime = None , text: str = None , объектов: Список [telegram.messageentity.MessageEntity] = Нет , caption_entities: Список [telegram.messageentity.MessageEntity] = Нет , audio: telegram.files.audio.Audio = Нет , документ: телеграмма.files.document.Document = Нет , игра: telegram.games.game.Game = Нет , фото: Список [telegram.files.photosize.PhotoSize] = Нет , наклейка: telegram.files.sticker.Sticker = Нет , видео: telegram.files.video.Video = Нет , voice: telegram.files.voice.Voice = Нет , video_note: telegram.files.videonote.VideoNote = Нет , new_chat_members: List [telegram.user.User] = Нет , подпись: str = Нет , контакт: телеграмма.files.contact.Contact = Нет , Местоположение: telegram.files.location.Location = Нет , Место проведения: telegram.files.venue.Venue = Нет , left_chat_member: telegram.user.User = Нет , new_chat_title: str = None , new_chat_photo: List [telegram.files.photosize.PhotoSize] = None , delete_chat_photo: bool = False , group_chat_created: bool = False , supergroup_chat_created: bool_chat_created: bool27 = False Channel : bool = False , migrate_to_chat_id: int = None , migrate_from_chat_id: int = None , pinned_message: Message = None , invoice: telegram.payment.invoice.Invoice = Нет , успешная_плата: telegram.payment.successfulpayment.SuccessfulPayment = Нет , forward_signature: str = Нет , author_signature: str = Нет , media_group_id: str = Нет , str = Нет , анимация: telegram.files.animation.Animation = Нет , паспортные данные: telegram.passport.passportdata.PassportData = Нет , опрос: telegram.poll.Poll = Нет , forward_sender_name: str = Нет , reply_markup: телеграмма.inline.inlinekeyboardmarkup.InlineKeyboardMarkup = None , bot: Bot = None , dice: telegram.dice.Dice = None , via_bot: telegram.user.User = None , ** kwargs ) Основания:
te
.