Как использовать file id в любом боте
Перейти к содержимому

Как использовать file id в любом боте

  • автор:

Делаем простого бота в Telegram на Python. Интеграция с Excel

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

Краткое описание бота

Наш бот будет создан на тематику Белого движения в гражданской войне в России (1917-1922) /сегодня разговор не о политике. Это просто пример/

  • По команде /start бот будет приветствие и посылать стикер;
  • После приветствия появится клавиатура под строкой набора сообщений с двумя кнопками «Вывести случайную цитату белогвардейца» и «Литература»
  • Нажатие на первую кнопку выведет рандомную цитату из excel файла (такое извращение нужно для подготовки к будущему проекту)
  • Нажатие на кнопку «Литература» выдаст инлайновую клавиатуру (далее будет прояснение, для тех кто не понял что это) с названиями произведений белогвардейских авторов или о белогвардейцах.После нажатия клавиатура пропадёт (просто этим навыком, думаю, необходимо обладать), начнётся загрузка pdf файла и появится оповещение «Приятного чтения!»

Вот такой простенький бот у нас по выйдет.

Начало. Создание бота и добавление библиотек.

Для начала добавим библиотеку pyTelegramBotAPI обычным пипом в cmd.

pip install pyTelegramBotAPI

А также загрузим простенькую библиотеку для работы с Excel. (ЧИТАЕТ ТОЛЬКО .xls. )

pip install xlrd

Время импортировать все необходимые библиотеки.

import telebot #импорт pyTelegramBotAPI from telebot import types #также достанем типы import random #рандом обязательно import xlrd #библиотка чтения экселевских файлов

Далее нужно создать самого бота в телеграме. Для этого пройдёмся по следующим шагам:

  1. Найти в поиске телеграма @BotFather
  2. Написать ему команду /newbot
  3. Первым сообщение отправить имя бота, а вторым его юзернейм (который пишется с @). Он должен быть уникальный и оканчиваться на Bot или _bot

После этих шагов батя пришлёт нам ссылку на нашёго бота и его API.

Нужно скопировать всю строку, которая на скрине закрыта красным прямоугольником

Если коротко, то API — это контракт, который предоставляет программа. «Ко мне можно обращаться так и так, я обязуюсь делать то и это».
(Более подробная инфа тут API)

Кодим

Раз библиотеки уже добавили, значит создаём переменную, определяющую бота с помощью API.

bot = telebot.TeleBot("TOKEN")

В начале, при написании команды /start, бот у нас выдаст приветствие. Соответственно, вставляем декоратор обработчика сообщений.

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

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

Коротко: Декораторы — это, по сути, просто своеобразные «обёртки», которые дают нам возможность делать что-либо до и после того, что сделает декорируемая функция, не изменяя её.

Теперь наш бот понимает команду /start, но ещё ничего не делает. Создаём функцию приветственного сообщения.

@bot.message_handler(commands=['start']) def send_welcome(message): stic = open('stic/welcome.webp', 'rb') #чтение файла в двоичном формате # клавиатура markup = types.ReplyKeyboardMarkup(resize_keyboard=True) but1 = types.KeyboardButton("Вывести случайную цитату белогвардейца") but2 = types.KeyboardButton("Литература") markup.add(but1, but2) bot.reply_to(message, "Здравствуй, \nСмотрю, ты за Единую, Великую и Недилимую".format(message.from_user) ,parse_mode='html',reply_markup=markup) bot.send_sticker(message.chat.id,stic)

Пробежимся по коду

Строкой stic = open(‘stic/welcome.webp’, ‘rb’) мы записываем в переменную путь к нашему стикеру в формате .webp (скачать его можно из сообщений телеграма правой кнопкой мыши, «сохранить как»)

Ниже происходит создание клавиатуры
markup = types.ReplyKeyboardMarkup(resize_keyboard=True) , а точнее запись в переменную подстрочной клавиатуры. Параметр resize_keyboard=True подгоняет кнопки по высоте до возможного минимума. Также создаём две кнопочки и добавляем в клавиатуру:

but1 = types.KeyboardButton("Вывести случайную цитату белогвардейца") but2 = types.KeyboardButton("Литература") markup.add(but1, but2)

Клавиатура готова, но пока не используется. Пока оставим её и переключимся на сообщение. Одной строкой мы указываем боту отправить сообщение с текстом, именем отправителя ( , а вытягивает его он из .format(message.from_user) мы можем дописать .format(message.from_user, bot.get_me()) и вызвать имя бота, добавив в текст ), правилом оформления parse_mode=’html’ ( также можно выбрать ‘markdown’) и определением клавиатуры, которую создали выше.

bot.reply_to(message, "Здравствуй, \nСмотрю, ты за Единую, Великую и Недилимую".format(message.from_user) ,parse_mode='html',reply_markup=markup)

Последней строкой отправляем стикер bot.send_sticker(message.chat.id,stic)

Приветственное сообщение и клавиатура

Время дать возможность боту коммуницировать

@bot.message_handler(func=lambda message: True) def menu(message): if message.chat.type == 'private': if message.text == "Вывести случайную цитату белогвардейца": #достаём циататы из ворда rb = xlrd.open_workbook('citat/citat.xls', formatting_info=True) sheet = rb.sheet_by_index(0) for rownum in range(sheet.nrows): rand = int(random.randint(0,rownum)) row = sheet.row_values(rand) bot.send_message(message.chat.id, row) elif message.text == "Литература": #инлайновая клавиатура inMurkup = types.InlineKeyboardMarkup(row_width=1) but1 = types.InlineKeyboardButton("И.Ф. Плотников - Александр Васильевич Колчак. Исследователь, адмирал, Верховный правитель России",callback_data='book1') but2 = types.InlineKeyboardButton("А.В. Туркул - Дроздовцы в огне", callback_data='book2') but3 = types.InlineKeyboardButton("П.Н. Врангель - Записки", callback_data='book3') but4 = types.InlineKeyboardButton("М.Г. Дроздовский - Дневник", callback_data='book4') inMurkup.add(but1, but2, but3, but4) bot.send_message(message.chat.id, "Книги на любой вкус", reply_markup=inMurkup) else: bot.send_message(message.chat.id, "Я не знаю что и ответить")

Букв много, но сейчас всё раскидаем. Берём знакомый декоратор и делаем проверку лямбдой сообщение. Если не в курсе что такое лямбда-функция, то сюда. Бот у нас работает через личные сообщения, поэтому пропишем if message.chat.type == ‘private’: , если требуется, то можете указать условия для “group”, “supergroup” или “channel” , но нам это не нужно.

Далее идёт строка с текстом. ВАЖНО текст должен совпадать с названием кнопки клавиатуры, которую указывали выше.

Создаём экселевский файлик, в первую колонку вписываем цитаты, сохраняем в формате .xls в папку, как делали со стикером.

Со спокойной душой вызываем на файл на чтение
rb = xlrd.open_workbook(‘citat/citat.xls’, formatting_info=True), указываем лист с которого считываем инфу sheet = rb.sheet_by_index(0) индексы как у массива (первый элемент нулевой).

Далее определяем диапазон заполненных строк в листе и записываем их количество в rownum . Используем эту переменную как верхнюю границу до которой может сгенерироваться случайное число rand = int(random.randint(0,rownum)) . Получив ячейку, вытаскиваем из неё значение row = sheet.row_values(rand) отправляем его bot.send_message(message.chat.id, row) .

Вышло как-то так

Для литературы будем использовать инлайновую клавиатуру.

elif message.text == "Литература": #инлайновая клавиатура inMurkup = types.InlineKeyboardMarkup(row_width=1) but1 = types.InlineKeyboardButton("И.Ф. Плотников - Александр Васильевич Колчак. Исследователь, адмирал, Верховный правитель России", callback_data='book1') but2 = types.InlineKeyboardButton("А.В. Туркул - Дроздовцы в огне", callback_data='book2') but3 = types.InlineKeyboardButton("П.Н. Врангель - Записки", callback_data='book3') but4 = types.InlineKeyboardButton("М.Г. Дроздовский - Дневник", callback_data='book4') inMurkup.add(but1, but2, but3, but4) bot.send_message(message.chat.id, "Книги на любой вкус", reply_markup=inMurkup)

Определяем клавиатуру inMurkup = types.InlineKeyboardMarkup(row_width=1) параметр row_width=1 говорит о том, что на одной строке будет одна кнопка. Принцип кнопок создания такой же как и у обычной клавиатуры, но появляется параметр callback_data значения которого примет бот после нажатия на кнопку и поймёт что нужно сделать (далле это всё опишем).

Последней строкой отправляем сообщение и цепляем к нему инлайновую клавиатуру.

Работа с callback_data

@bot.callback_query_handler(func=lambda call: True) def callback_inline(call): try: if call.message: if call.data == 'book1': doc = open('boo/Plotnikov_Ivan-Aleksandr_Vasilevich_Kolchak_Issledovatel_admiral_Verhovnyi_pravitel_Rossii.pdf', 'rb') bot.send_document(call.message.chat.id, doc) elif call.data == 'book2': doc = open('boo/Turkul_-_Drozdovtsy_v_ogne.pdf','rb') bot.send_document(call.message.chat.id, doc) elif call.data == 'book3': doc = open('boo/Vrangel_P_Zapiski_a4.pdf', 'rb') bot.send_document(call.message.chat.id, doc) elif call.data == 'book4': doc = open('boo/Drozdovsky_dnevnik_1963__ocr.pdf', 'rb') bot.send_document(call.message.chat.id, doc) #удаляем инлайновую клаву bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Книги на любой вкус", reply_markup=None) #Создаём уведомление bot.answer_callback_query(callback_query_id=call.id, show_alert=False, text='Приятного чтения!') except Exception as e: print(repr(e))

Первым делом вызываем декоратор обработки колбэка и подтверждаем, что он был получен @bot.callback_query_handler(func=lambda call: True) . Далее создаём функцию с конструкцией try-except (Что это? Чекай). Код хоть и приличный по объёму, но весь однотипный. Через if мы понимает какая «дата» пришла от кнопки, например
if call.data == ‘book1’: отвечает за первую кнопку с книгой про Колчака. Соответственно, командой

doc = open('boo/Plotnikov_Ivan-Aleksandr_Vasilevich_Kolchak_Issledovatel_admiral_Verhovnyi_pravitel_Rossii.pdf', 'rb')

мы создаём переменную doc в которую «суём» pdf файл, который сохранили в папку «boo» заранее.

Теперь строкой bot.send_document(call.message.chat.id, doc) отправляем файл в чат.

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

Вызываем функцию bot.edit_message_text По тексту определяется сообщение и
в параметр, который мы использовали для добавления клавиатуры reply_markup вносим значение None .

Уведомление призывается заклинанием

Параметр show_alert отвечает за вид оповещения (False простое временное уведомление, True уведомление с кнопкой «Ок»)

1 — False, 2 — True

Завершаем эту ступень кода конструкцией проверки исключений (ошибок).

except Exception as e: print(repr(e))
bot.polling(none_stop=True)

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

В итоге получился такой код:

import telebot from telebot import types import random import xlrd bot = telebot.TeleBot("TOKEN") @bot.message_handler(commands=['start']) def send_welcome(message): stic = open('stic/welcome.webp', 'rb') # клавиатура markup = types.ReplyKeyboardMarkup(resize_keyboard=True) but1 = types.KeyboardButton("Вывести случайную цитату белогвардейца") but2 = types.KeyboardButton("Литература") markup.add(but1, but2) bot.reply_to(message, "Здравствуй, \nСмотрю, ты за Единую, Великую и Недилимую".format(message.from_user),parse_mode='html',reply_markup=markup) bot.send_sticker(message.chat.id,stic) @bot.message_handler(func=lambda message: True) def menu(message): if message.chat.type == 'private': if message.text == "Вывести случайную цитату белогвардейца": #достаём циататы из ворда rb = xlrd.open_workbook('citat/citat.xls', formatting_info=True) sheet = rb.sheet_by_index(0) for rownum in range(sheet.nrows): rand = int(random.randint(0,rownum)) row = sheet.row_values(rand) bot.send_message(message.chat.id, row) elif message.text == "Литература": #инлайновая клавиатура inMurkup = types.InlineKeyboardMarkup(row_width=1) but1 = types.InlineKeyboardButton("И.Ф. Плотников - Александр Васильевич Колчак. Исследователь, адмирал, Верховный правитель России", callback_data='book1') but2 = types.InlineKeyboardButton("А.В. Туркул - Дроздовцы в огне", callback_data='book2') but3 = types.InlineKeyboardButton("П.Н. Врангель - Записки", callback_data='book3') but4 = types.InlineKeyboardButton("М.Г. Дроздовский - Дневник", callback_data='book4') inMurkup.add(but1, but2, but3, but4) bot.send_message(message.chat.id, "Книги на любой вкус", reply_markup=inMurkup) else: bot.send_message(message.chat.id, "Я не знаю что и ответить") #обработка callback @bot.callback_query_handler(func=lambda call: True) def callback_inline(call): try: if call.message: if call.data == 'book1': doc = open('boo/Plotnikov_Ivan-Aleksandr_Vasilevich_Kolchak_Issledovatel_admiral_Verhovnyi_pravitel_Rossii.pdf', 'rb') bot.send_document(call.message.chat.id, doc) elif call.data == 'book2': doc = open('boo/Turkul_-_Drozdovtsy_v_ogne.pdf','rb') bot.send_document(call.message.chat.id, doc) elif call.data == 'book3': doc = open('boo/Vrangel_P_Zapiski_a4.pdf', 'rb') bot.send_document(call.message.chat.id, doc) elif call.data == 'book4': doc = open('boo/Drozdovsky_dnevnik_1963__ocr.pdf', 'rb') bot.send_document(call.message.chat.id, doc) #удаляем инлайновую клаву bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Книги на любой вкус", reply_markup=None) #Создаём уведомление bot.answer_callback_query(callback_query_id=call.id, show_alert=False, text='Приятного чтения!') except Exception as e: print(repr(e)) bot.polling(none_stop=True)

Пара слов от автора

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

Больше функций, параметров и всего прочего находится в документации. Справочник на русском. Библиотеки pyTelegramBotAPI и xlrd.

Огромное спасибо за прочтение статьи! Надеюсь она оказалась полезной. А если понравилась, то поднимай статью в рейтинге и оставляй комменты)

Приглашаю прочесть мои статьи:

Автор обитает тут: ВК, Инстаграм

Как создать бота в Telegram: большая инструкция

Как создать бота в Telegram: большая инструкция

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

Освойте профессию
«Python-разработчик»

Что такое Telegram-бот?

Telegram — популярный мессенджер, позволяющий пользователям обмениваться сообщениями, видео, музыкой и файлами. Блогеры используют сервис для публикации своего контента, а бизнес — чтобы продавать товары и услуги. Кроме всего прочего, в Telegram есть возможность создавать собственных ботов — программы внутри мессенджера, автоматизирующие общение. У каждого бота есть уникальное имя, поэтому его можно легко найти в строке поиска Telegram. Также ботов можно добавлять в чаты и каналы, чтобы они выполняли роль модератора или администратора. С недавних пор Telegram-боты могут быть полноценными веб-приложениями с собственным пользовательским интерфейсом.

Python-разработчик
Освойте Python, самый популярный язык программирования
3 383 ₽/мес 6 150 ₽/мес

dffsdd (3)

Какими бывают боты в Telegram

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

Боты для автоматизации задач

как создать бота в телеграмме

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

Боты для продвижения и продаж

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

как создать своего бота в телеграмме как сделать бота в телеграммеЧатбот поможет в форме непринужденной беседы подвести клиента к покупке вашего продукта. Источник

Боты для общения и развлечения

создание бота телеграмм

Telegram-боты нужны не только для того, чтобы продавать. Они также могут помочь выбрать кино на вечер, предложить забавный тест или сгенерировать мем. Например, студенты Skillfactory разработали для Московского зоопарка Telegram-бот, который имитирует общение с манулом Тимофеем и предлагает поучаствовать в викторине.

Конструкторы для настройки ботов

Для создания простых ботов можно использовать сервисы-конструкторы. С их помощью получится реализовать наиболее частые сценарии использования: ответы на вопросы, выдачу информации по запросу и обработку данных пользователя. Такие сервисы не требуют знания программирования, их можно освоить за несколько часов. Популярные конструкторы для создания ботов Telegram: Manybot — сервис для создания ботов с помощью сообщений в чате. Подойдет для самых простых сценариев использования. У Manybot есть встроенная реклама и нет возможности отключить ее с помощью подписки; botmother — редактор ботов, который умеет работать не только с Telegram, но и с другими популярными мессенджерами. Есть возможность обрабатывать медиа, файлы и обращаться к сторонним сервисам. PuzzleBot — мощный конструктор, позволяющий создать бота практически любой сложности и без единой строчки кода. При этом важно понимать основы программирования: переменные, циклы и условия. Есть премиальная версия по подписке.

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

Какие технологии нужны, чтобы создать чат-бота в Telegram с нуля?

Если от бота нужны нестандартные сценарии использования или в проекте важно полностью контролировать поведение и обработку данных, то без программирования не обойтись. У Telegram открытое API с хорошей документацией, поэтому ботов можно разрабатывать практически на любом языке программирования, но удобнее использовать для этого уже готовые библиотеки. Разработчики Telegram активно развивают мессенджер, поэтому от библиотеки важно, чтобы она обновлялась так же часто и поддерживала все новшества сервиса. Ботов чаще всего пишут на Python из-за простоты и удобства этого языка. Для Python существуют следующие библиотеки для ботов Telegram: aiogram — комплексная библиотека с отличной документацией, поддержкой и активным сообществом. Есть русскоязычное сообщество разработчиков, которое поможет с трудностями и ответит на вопросы. Библиотека aiogram поддерживает асинхронность, работу с машиной состояний и рассчитана на разработку сложных ботов с большим количеством ежедневных пользователей. Сейчас у aiogram две активные версии, и лучше сразу выбирать версию 3.0, которая пока находится в бете, но работает стабильно. Библиотека подразумевает глубокие знания Python и опыт в программировании, поэтому может быть сложной для начинающих; telebot (pyTelegramBotAPI) — библиотека для простых ботов с небольшим количеством пользователей, поддерживающая работу с основными методами Telegram API. С telebot сложнее организовать асинхронность и управлять большой нагрузкой, но новичкам в разы легче и приятнее с ней работать.

Читайте также Полезные библиотеки для Python: чем пользуются разработчики

В статье мы будем использовать библиотеку telebot и писать код на Python, поэтому нам понадобится редактор кода. Сейчас разработчики в основном используют один из двух редакторов: Visual Studio Code — бесплатный редактор кода от компании Microsoft с задатками полноценной среды разработки. VS Code можно использовать практически с любыми языками программирования и технологиями. Для этого компания предусмотрела маркетплейс плагинов, расширяющих возможности редактора. VS Code полностью бесплатный и доступен для Windows, macOS и Linux. PyCharm — полноценная среда разработки на Python от компании JetBrains. Более тяжеловесная, чем VS Code, и включает в себя дополнительные инструменты для профессиональной работы над большими проектами. Есть как бесплатная версия, так и продвинутая по подписке. Для разработки даже самых сложных ботов хватит возможностей бесплатной версии PyCharm.

Как создать своего бота в Telegram

Разработка Telegram-бота начинается с его создания в мессенджере. Для этого команда сервиса предусмотрела специального бота BotFather, через которого осуществляется управление другими ботами пользователя. Важно отметить, что BotFather доступен только под этим именем и оснащен синей галочкой верификации. Найти его можно через строку поиска или по ссылке. BotFather для создания ботов в ТелеграммПосле перехода в BotFather нажимаем на кнопку «Начать». В чат придет сообщение со списком всех команд, доступных в боте. Так как мы создаем нового бота, то нам нужна команда `/newbot`. Ее можно выбрать из списка или ввести с клавиатуры и отправить в чат. Начало создания бота в BotFatherПосле этого BotFather попросит ввести название бота, которое пользователи будут видеть в его профиле и списке своих чатов. Оно может быть любым, но должно передавать суть бота и его возможности. Мы разрабатываем бота для комплиментов, так его и назовем — «Комплименты». разработка бота для комплиментов в BotFatherТеперь нашему боту надо задать имя пользователя, по которому его можно будет найти в Telegram. В этом случае уже есть несколько правил оформления:

  • имя бота должно заканчиваться словом `bot`: к примеру, `SuperBot` или `super_bot`. Это обязательное требование Telegram, чтобы пользователи могли отличать обычные профили от ботов. Исключение делается только для внутреннего BotFather, имя которого начинается с ключевого слова, а не заканчивается им;
  • имя бота должно быть уникальным, а учитывая, что многие создают ботов ради эксперимента и не удаляют их, то найти подходящий свободный вариант может быть проблематично.

Исходя из всего этого, подбираем звучное имя, состоящее из ключевых слов, которые бы точно описывали его суть. Для экспериментов можно использовать просто набор символов. В нашем случае имя `compliment_bot` уже было занято, поэтому использовали `super_compliment_bot`. Получилось слишком длинно, но отражает суть.

После регистрации BotFather передаст нам токен для доступа к нашему боту и подскажет ссылки на официальную документацию по разработке ботов для Telegram. Важно запомнить, что токен надо держать в секрете. С его помощью можно полностью управлять ботом и сообщениями, которые он отправляет. Посторонние лица, не имеющие отношения к разработке вашего бота, не должны его знать.

токен для вашего бота в BotFather

Оформление бота

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

оформление своего бота в телеграмм

Для этого опять откроем BotFather, введем команду `/mybots` и выберем из списка только что созданного бота. Перед нами откроется меню управления ботом.

меню управления ботом в BotFather

Коротко о каждом пункте меню:

API Token — можно узнать токен, если потеряли его. Также можно отозвать имеющийся токен и сгенерировать новый, если кто-то все же узнал его и перехватил на себя управление ботом;

Edit Bot — меню редактирования бота, в котором можно изменить имя, добавить описание, иконку, приветственное изображение и команды;

Bot Settings — тут можно выдавать боту права на взаимодействия с сообщениями в групповых чатах и каналах, добавлять кнопки и включить инлайн-режим;

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

Transfer Ownership — бот принадлежит пользователю, который его создал, но права на владение и управление можно передать с помощью этого пункта меню;

Delete Bot — если бот больше не нужен, то его можно удалить, освободив список свободных уникальных имен.

У нашего бота пока есть только название. Теперь зададим ему описание, которое будет видно в окне его профиля. Для этого в меню бота выбираем Edit Bot → Edit About и присылаем в чат короткое описание. После зададим расширенное описание, выводящееся в чате новым пользователям. Переходим в Edit Bot → Edit Description и присылаем текст.

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

  • формат файла должен быть jpg или png;
  • квадратное изображение не меньше 300×300px и не больше 1280×1280px. Лучше всего использовать изображения размером 500×500px;
  • изображение надо отправить BotFather в виде фото, а не файла.

Также боту можно задать изображение с описанием его возможностей. Его будут видеть новые пользователи при переходе в чат. Можно использовать картинки размером 640×360px или гифки 320×120px/640×360px. На таком изображении можно тезисно указать возможности бота и оставить QR-код с ссылкой на сайт компании или разработчика для пользователей, которые используют настольную версию Telegram.

Иконку бота можно задать, перейдя в Edit Bot → Edit Botpic, а изображение-описание — Edit Bot → Edit Description Picture. После настройки наш Telegram-бот выглядит так:

создаем иконку бота в настройках

Начинаем программировать

Теперь у нас есть готовый оформленный бот, который ничего не умеет. Если открыть и запустить бота командой `/start` или кнопкой, то ничего не произойдет. Поэтому надо его оживить и научить обрабатывать сообщения от пользователя. Наш бот будет присылать в чат случайный комплимент из собственной коллекции.

Сперва надо установить среду разработки. В этой статье будем использовать PyCharm от JetBrains. Скачать установочный файл можно с официального сайта разработчика. Скачать и установить Python можно с официального портала. Проверить установленную версию Python можно с помощью следующей команды:

проверка установленной версии Python

При создании бота мы будем в основном работать с библиотекой telebot. Поэтому ее надо установить. Заходим в PyCharm и создаем новый проект с названием `bot`. PyCharm создаст необходимое окружение, в котором мы установим библиотеку. Для этого надо открыть вкладку Terminal в редакторе кода и ввести команду `pip install pyTelegramBotAPI` для Windows или `pip3 install pyTelegramBotAPI` для macOS.

В папке проекта должен был автоматически появиться файл `main.py`. Если этого не произошло, то создаем его сами. Теперь научим нашего бота здороваться. Для этого в файле `main.py` импортируем `telebot`, создадим переменную `token` с нашим токеном и передадим его экземпляру бота.

import telebot # Импортируем telebot token = ('Ваш токен') bot = telebot.TeleBot(token)

Теперь создадим хендлер для обработки команды `/start`. Хендлер (Heandler) или обработчик — функция, которая вызывается в ответ на наступление определенного события. В случае с Telegram хендлер запускает функцию при получении сообщения.

В самом хендлере создадим функцию `start_message` с текстом сообщения, которым бот будет отвечать на полученную команду. Нам нужно бесконечное выполнение кода, чтобы бот работал всегда и был доступен в любое время суток. Поэтому завершим все строкой `bot.polling(none_stop=*True*, interval=0)`, которая будет запускать бесконечное выполнение.

import telebot # импортируем telebot # передаём значение переменной с кодом экземпляру бота token = ('Ваш токен') bot = telebot.TeleBot(token) # хендлер и функция для обработки команды /start @bot.message_handler(commands=['start']) def start_message(message): bot.send_message(message.chat.id, "Привет ✌️") # бесконечное выполнение кода bot.polling(none_stop=True, interval=0) Встроить код

Сейчас можно попробовать запустить код в PyCharm и открыть бота в Telegram. Если отправить ему команду `/start`, то он ответит сообщением, которое мы передали ему в коде. Бот работает, значит, можно наращивать его возможности.

запускаем код бота в PyCharm

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

Поэтому создадим в папке проекта файл `secrets.py` и в файле инициализируем словарь с ключом `BOT_API_TOKEN` и самим токеном в виде значения ключа.

secrets = Встроить код

Теперь вернемся к файлу `main.py`, импортируем словарь из файла `secrets.py` и сделаем так, чтобы токен подтягивался из файла, а не находился в коде.

import telebot # импортируем telebot from secrets import secrets # импортируем словарь с токеном из файла secrets.py # передаём значение переменной с кодом экземпляру бота token = secrets.get('BOT_API_TOKEN') bot = telebot.TeleBot(token) # хендлер и функция для обработки команды /start @bot.message_handler(commands=['start']) def start_message(message): bot.send_message(message.chat.id, "Привет ✌️") # бесконечное выполнение кода bot.polling(none_stop=True, interval=0)

Снова запускаем код и проверяем. Бот продолжает отвечать на команду `/start`, но в его коде уже нет токена. Поэтому можно спокойно делиться файлом `main.py` и не бояться за безопасность.

Разработчики могут встраивать кнопки для удобного общения с Telegram-ботами. Воспользуемся этой возможностью и создадим несколько кнопок для автоматической отправки команд. Нам потребуется определение типов сообщений, поэтому для этого импортируем `types` из `telebot`. Часть с импортами в коде будет выглядеть так:

import telebot # импортируем telebot from secrets import secrets # импортируем словарь с токеном из файла secrets.py from telebot import types # для определения типов

Теперь перепишем хендлер для обработки команды `/start`. Он будет не только отправлять приветственное сообщение, но и инициализировать кнопки бота. В нашем боте две кнопки: «Старт» будет выводить краткую инструкцию по использованию бота, а «Комплимент» — присылать приятное сообщение из коллекции. Сами кнопки украсим эмодзи.

Вместе с этим заменим текст приветственного сообщения. Будем обращаться к пользователю по имени. Мы не можем знать имен всех пользователей, но их знает Telegram, поэтому спросим у него с помощью конструкции « . Весь код хендлера выглядит так:

# хендлер и функция для обработки команды /start @bot.message_handler(commands=['start']) def start_message(message): markup = types.ReplyKeyboardMarkup(resize_keyboard=True) start_button = types.KeyboardButton("�� Старт") action_button = types.KeyboardButton("�� Комплимент") markup.add(start_button, action_button) bot.send_message(message.chat.id, text="Привет, ��\nВоспользуйся кнопками".format(message.from_user), reply_markup=markup)

текст приветственного сообщения в боте

Бот обзавелся красивыми кнопками, но если попробовать нажать на них, то ничего не произойдет. Исправим это, дописав функции для ответа. Кнопка в Telegram просто отправляет в чат то, что на ней написано. Поэтому надо научить бота анализировать полученные сообщения и отвечать на сообщения-триггеры.

Для начала создадим коллекцию комплиментов в отдельном файле `compliments.py`:

compliments = ('Выглядишь лучшее всех!', 'Сегодня будет замечательный день!', 'Ты обязательно всё сможешь!', 'Я не встречал людей добрее тебя!', 'С тобой приятно проводить время!',)

После этого импортируем файл и модуль для работы со случайными числами:

import random # для выбора случайного комплимента from compliments import compliments # коллекция комплиментов

Теперь можно приступать к созданию хендлера для обработки кнопок. В условии будем отслеживать, какой текст пришел от пользователя. Если встречаем «�� Старт», то выводим краткое описание возможностей, если «�� Комплимент» — присылаем случайное сообщение из коллекции. На все остальные сообщения будем отвечать просьбой воспользоваться кнопками. Весь код хендлера выглядит так:

# хендлер для обработки нажатий кнопок @bot.message_handler(content_types=['text']) def buttons(message): if (message.text == "�� Старт"): bot.send_message(message.chat.id, text="Я могу поддержать тебя и поднять настроение. Просто попроси об этом") elif (message.text == "�� Комплимент"): bot.send_message(message.chat.id, text=f"") else: bot.send_message(message.chat.id, text="Я могу отвечать только на нажатие кнопок")

ваш бот в телеграмм готов

Бот готов, исправно работает, отвечает на сообщения и присылает в чат случайные комплименты из собственной коллекции, а его полный код выглядит так:

import telebot # импортируем telebot from secrets import secrets # словарь с токеном из файла secrets.py from telebot import types # для определения типов import random # для выбора случайного комплимента from compliments import compliments # коллекция комплиментов # передаём значение переменной с кодом экземпляру бота token = secrets.get('BOT_API_TOKEN') bot = telebot.TeleBot(token) # хендлер и функция для обработки команды /start @bot.message_handler(commands=['start']) def start_message(message): # создаём кнопки бота markup = types.ReplyKeyboardMarkup(resize_keyboard=True) start_button = types.KeyboardButton("�� Старт") action_button = types.KeyboardButton("�� Комплимент") markup.add(start_button, action_button) # приветсвенное сообщение для команды /start bot.send_message(message.chat.id, text="Привет, ��\nВоспользуйся кнопками".format(message.from_user), reply_markup=markup) # хендлер для обработки нажатий кнопок @bot.message_handler(content_types=['text']) def buttons(message): if (message.text == "�� Старт"): bot.send_message(message.chat.id, text="Я могу поддержать тебя и поднять настроение. Просто попроси об этом") elif (message.text == "�� Комплимент"): bot.send_message(message.chat.id, text=f"") else: bot.send_message(message.chat.id, text="Я могу отвечать только на нажатие кнопок") # бесконечное выполнение кода bot.polling(none_stop=True, interval=0)

А полное дерево файлов в проекте выглядит так:

. └── bot/ ├── main.py ├── secrets.py └── compliments.py

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

Как добавить функционал и настроить ответы для бота в Телеграме?

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

Как опубликовать и запустить бота в Телеграме?

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

Как продвигать и увеличить популярность своего бота в Телеграме?

Расскажите о своем боте на сайте, в социальных сетях и в email-рассылке. Для тестового периода лучше привести в бот теплую аудиторию, которая вас уже знает и читает. Они могут попробовать бот, написать вам об ошибках. После этого можно заняться платной рекламой: купить ее у Telegram или обратиться к блогерам.

На каком языке лучше написать бота?

На любом, который вы знаете. Ботов можно писать на Python, C, Java. Чаще всего для этой задачи выбирают Python, потому что он прост в использовании.

Python-разработчик

Освойте Python с нуля. Подготовим к трудоустройству: дадим много практики, реальные проекты для портфолио, поможем с резюме. Лучшие студенты пройдут стажировки в проектах компаний-партнеров.

Всё, о чём должен знать разработчик Телеграм-ботов

Вы вряд ли найдете в интернете что-то про разработку ботов, кроме документаций к библиотекам, историй «как я создал такого-то бота» и туториалов вроде «как создать бота, который будет говорить hello world». При этом многие неочевидные моменты просто нигде не описаны.

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

Подробный гайд о том, как работать с ботами — под катом.

Привет из 2023!

Эта статья устарела. С момента её выхода в Телеграме появилось ещё больше фич, а я собрал ещё больше советов.

Читайте новый хендбук о разработке ботов: https://handbook.tmat.me/

Начало работы

Telegram API vs Telegram Bot API

Рассказываю по порядку.

Телеграм использует собственный протокол шифрования MTProto. MTProto API (он же Telegram API) — это API, через который ваше приложение Телеграм связывается с сервером. Telegram API полностью открыт, так что любой разработчик может написать свой клиент мессенджера.

Для написания ботов был создан Telegram Bot API — надстройка над Telegram API. Перевод с официального сайта:

Чтобы использовать Bot API, вам не нужно ничего знать о том, как работает протокол шифрования MTProto — наш вспомогательный сервер будет сам обрабатывать все шифрование и связь с Telegram API. Вы соединяетесь с сервером через простой HTTPS-интерфейс, который предоставляет простую версию Telegram API.

Среди упрощений Bot API: работа через вебхуки, упрощенная разметка сообщений и прочее.

Почему-то мало кто знает о том, что боты могут работать напрямую через Telegram API. Более того, таким образом можно даже обойти некоторые ограничения, которые даёт Bot API.

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

На чём пишут Телеграм-ботов

Бот должен уметь отправлять запросы Телеграм-серверу и получать от него апдейты (updates, обновления).

Как получать апдейты в Bot API

Получать апдейты можно одним из двух способов:

  • Поллинг — просто регулярно отправлять запрос к серверу Телеграма для получения обновлений,
  • Вебхук — сделать так, чтобы Телеграм сам отправлял запросы по нужному URL.

Конечно, удобнее использовать библиотеки, чем делать http-запросы «руками».

Если вы попробуете загуглить, как написать Телеграм-бота на Python, вам предложат воспользоваться библиотеками python-telegram-bot и telebot. Но не стоит.

Ну, если вы только хотите познакомиться с разработкой ботов и написать своего hello-world-бота, то можете, конечно использовать и их. Но эти библиотеки могут далеко не всё. Среди разработчиков ботов лучшей библиотекой для ботов на Python считается aiogram. Она асинхронная, использует декораторы и содержит удобные инструменты для разработки. Ещё был хороший Rocketgram, но он давно не обновлялся.

Также ботов часто пишут на JavaScript, для этого обычно используется Telegraf. Библиотеки есть и для многих других языков, но используют их реже.

Если же вы хотите использовать Telegram API, то можете воспользоваться Python’овскими Telethon и Pyrogram.

Пример кода бота

Если вы хотите получить какое-то представление о том, как вообще выглядит код бота, вот вам пример использования на aiogram с его странички на GitHub:

import asyncio from aiogram import Bot, Dispatcher, types async def start_handler(event: types.Message): await event.answer( f"Hello, ?!", parse_mode=types.ParseMode.HTML, ) async def main(): bot = Bot(token=BOT-TOKEN) try: disp = Dispatcher(bot=bot) disp.register_message_handler(start_handler, commands=) await disp.start_polling() finally: await bot.close() asyncio.run(main()) 

Этот бот будет отвечать на команды /start и и /restart.

Создание бота

Единственная информация о Телеграм-ботах, которой в интернете полным-полно: как создать бота. Это делается через специального бота BotFather. Когда вы создадите бота, BotFather даст вам его токен. Токен выглядит примерно так: 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw . Именно с помощью токена вы сможете управлять ботом.

Один пользователь может создать до 20 ботов.

В BotFather удобно управлять ботами своими командой /mybots .

Юзернеймы

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

Как поменять юзернейм бота

Если у вас есть бот, и вы хотите дать ему более короткий юзернейм (который может быть занят неработающим ботом), то вы, теоретически, можете это сделать через @BotSupport.

Для этого бот должен (внезапно) быть рабочим, а также поддерживать английский язык.

Принято использовать такой формат обращения в поддержку:

  1. @old_username,
  2. @new_username,
  3. Что бот делает.

Если вы везунчик 9999 lvl — вам ответят.

Юзернейм бота выглядит как обычный юзернейм, но он должен заканчиваться на «bot».
Вы могли видеть ботов с именами @pic, @vid, @sticker, @gamee — это официальные боты Телеграма. Им можно нарушать все правила 🙂

Очень многие юзернеймы уже заняты. Свободных коротких юзернеймов осталось очень мало. И что самое грустное: почти все эти боты мертвы. Просто не отвечают на сообщения. Наверное, это просто разные любопытные люди хотят сделать бота, создают его, а потом забивают. У меня самого есть несколько лежащих ботов. Так что, думаю, лимит в 20 ботов на одного владельца вполне оправдан 🙂

Оформление бота

Открыв бота, пользователи могут увидеть его профиль.

Оформление бота настраивается в BotFather: меню /mybots → Edit Bot . Там можно изменить:

  1. Имя бота.
  2. Описание (Description) — это текст, который пользователи будут видеть в начале диалога с ботом под заголовком «Что может делать этот бот?»
  3. Информация (About) — это текст, который будет виден в профиле бота.
  4. Аватарка. Аватарки ботов, в отличие от аватарок пользователей и чатов, не могут быть анимированными. Только картинки.
  5. Команды — тут имеются ввиду подсказки команд в боте. Подробнее о командах ниже.
  6. Inline Placeholder — об инлайн-режиме см. ниже.

Стандартный совет: Потратьте свое время и заполните описание и информацию бота, чтобы пользователям было понятнее и проще его использовать. Можете оставить там свои контакты. И поставьте аватарку, чтобы бота было проще отличать от других чатов в списке.

Сообщения и чаты

Запуск бота пользователем

Когда пользователь впервые открывает бота, он видит кнопку «Запустить» или «Начать» (зависит от платформы пользователя), на английском — «Start». Нажимая на эту кнопку, он отправляет команду /start .

Таким образом, первое сообщение от пользователя — это всегда /start (либо /start с параметрами, об этом ниже в разделе «Диплинки»).

. если пользователь использует официальный клиент

На стороне сервера это не проверяется, поэтому теоретически пользователь может отправить боту любое сообщение через Telegram API.

Сообщения

Понятно, что главная функция бота — отправлять и получать сообщения.

И то, и другое можно делать со всеми видами сообщений (фото и видео, файлы, опросы, голосовые сообщения и т. д.).

В Телеграме можно делиться файлами до 2 ГБ, но в Bot API более жесткие лимиты: боты могут скачивать файлы до 20 МБ и отправлять файлы до 50 МБ.

Работа с файлами в Bot API

Если бот уже загрузил файл на сервер Телеграма, то он может использовать file_id, чтобы отправлять этот файл.

Загружать файл на сервер можно в том числе и по URL файла.

Куда может писать бот

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

Боты не могут писать другим ботам.

Бота можно добавить в группу (если в BotFather включена соответствующая настройка). По умолчанию он видит не все сообщения (об этом ниже, в разделе «Видимость сообщений в группах»).

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

В одной группе может быть до 20 ботов. В публичные группы (группы с юзернеймом) ботов могут добавлять только админы.

Также бота можно добавить в канал, причем только как администратора. Самый частый способ использования ботов в каналах — добавление кнопок под постами («лайки», ссылки и прочее).

Как боты добавляют кнопки

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

Подробнее о кнопках тоже ниже.

Супергруппы

На самом деле многие группы в Телеграме являются супергруппами.

Почему так? Раньше было четкое разделение на группы и супергруппы. По задумке, супергруппы — это группы для сообществ. Супергруппы могут иметь больше участников, публичные ссылки и другие плюшки.

Со временем, видимо, решили, что это неудобная концепция. Теперь обычная группа становится супергруппой, когда у группы меняются какие-нибудь настройки (подробнее тут). Вот такой костыль.

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

Супергруппу нельзя обратно превратить в группу. С точки зрения API супергруппа устроена так же, как и канал. Важное отличие супергрупп от обычных групп состоит в нумерации сообщений: о нём чуть ниже.

id пользователей и чатов

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

В токене бота первая часть — это его id. Например, токен 110201874:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw принадлежит боту с id 110201874 .

В Bot API перед id супергрупп и каналов пишется -100. Так, id 1356415630 превращается в -1001356415630 .

Не следует хранить id пользователей и чатов в 32-битном типе числа: теперь id могут превышать 2 31 -1.

id сообщений

Каждое сообщение в Телеграме имеет свой id. Это относится и к системным сообщениям (пользователь зашел в группу, изменилось название группы и т. д.)

Через Telegram API боты могут получать по запросу сообщения в любом чате по их id.

id сообщений в супергруппах и каналах уникальны для чата: первое сообщение в чате имеет номер 1, второе имеет номер 2 и так далее.

id сообщений в личных сообщениях и обычных группах работают по другому. Там, можно сказать, нумерация сквозная: id сообщения уникально для каждого отправившего его пользователя. Так, первое сообщение от пользователя во всех личках и группах имеет номер 1, второе сообщение от того же пользователя имеет номер 2 и так далее.

Видимость сообщений в группах

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

Но если боту нужно видеть все сообщения в группе (например, если это чат-бот или антиспам-бот), для него можно отключить Privacy mode.

Privacy mode — настройка в BotFather, которая по умолчанию включена. В таком режиме бот в группах видит только такие сообщения:

  • Сообщения с упоминанием бота,
  • Ответы на сообщение бота, ответы на ответы и так далее,
  • Системные сообщения,
  • Команды — о них в следующем пункте.

А если Privacy mode выключен, то бот видит все сообщения в группе.

Если бот — админ в группе, то он в любом случае видит все сообщения.

Бот, работающий через Bot API, в любом случае не будет видеть сообщения от других ботов.

Бот видит не все сообщения

Я включил Privacy mode, а он не работает

Нужно удалить бота из группы и добавить заново.

Исправленный баг с видимостью сообщений

Недавно был найден баг: боты не могли видеть некоторые сообщения от юзеров, если сообщения выглядят как команды с юзернеймом пользователя на конце.

Это могло нарушить работу антиспам- и других ботов.

Сейчас баг уже исправлен.

Сообщения от лица групп и каналов

В группах могут быть не только сообщения от пользователей, но и:

  • Сообщения в группе из привязанного канала (с точки зрения API это пересланные сообщения)
  • Сообщения от лица группы от анонимных администраторов той же группы
  • Сообщения от лица публичных каналов от любых пользователей

Учитывайте это при разработке ботов для групп.

Команды

Часто используемый способ «общения» пользователей с ботом — команды. Команды начинаются на «/» и состоят из латинских букв (можно использовать цифры и нижние подчеркивания).

Команды подсвечиваются как ссылки: нажатие отправляет команду в чат.

В группах, чтобы различать команды от разных ботов, Телеграм предлагает ставить в конце команды юзернейм бота. Например: /start@examplebot .

В BotFather можно указать подсказки команд для бота. Он будут отображаться при вводе «/» и команд. Если есть подсказки, рядом с кнопкой «Отправить» появляется кнопка для открытия меню команд.

Если в подсказках команд есть /help , в профиле бота появляется кнопка «Помощь с ботом». Нажатие на кнопку отправляет эту команду.

Если в подсказках команд есть /settings , в профиле бота появляется кнопка «Настройки бота». Нажатие на кнопку отправляет эту команду.

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

Разметка сообщений

Как вы, наверное, знаете, сообщения в Телеграме могут содержать не только обычный текст, но и жирный, курсив и др. В Bot API разметку сообщений можно делать в HTML и Markdown.

Разметка в Telegram API

В Telegram API для разметки надо вместе с сообщением передавать entities (MessageEntityBold, MessageEntityItalic и так далее). Хорошие библиотеки сами превращают HTML/Markdown в текст и entities.

Способы выделения текста:

  • Жирный текст
  • Курсив
  • Подчёркнутый текст
  • Зачёркнутый текст
  • Моноширинный текст («в строке» и «блоком»)
  • Ссылка (встроенная в текст)
  • Спойлер — текст, который показывается только после нажатия на плашку
  • Упоминание пользователя — текст, похожий на ссылку, клик по которому открывает профиль пользователя. Если упомянуть в группе её участника, он получит уведомление.
    Чтобы вставить в сообщение упоминание пользователя, в Bot API нужно встроить ссылку на tg://user?id=123456789.

Кнопки

Инлайн-кнопки

Бот может оставлять кнопки под своими сообщениями.

Кнопки под сообщениями (они же inline keyboards / inline buttons) в основном бывают трёх видов:

  • URL button — кнопка с ссылкой.
  • Callback button. При нажатии на такую кнопку боту придёт апдейт. С созданием кнопки можно указать параметр, который будет указан в этом апдейте (до 64 байтов). Обычно после нажатий на такие кнопки боты изменяют исходное сообщение или показывают notification или alert.
  • Switch to inline button. Кнопка для переключения в инлайн-режим (об инлайн-режиме см. ниже). Кнопка может открывать инлайн в том же чате или открывать меню для выбора чата. Можно указать в кнопке запрос, который появится рядом с никнеймом бота при нажатии на кнопку.
  • Login URL button — специальная кнопка для авторизации пользователей на сайте. Использовалась, например, в официальном боте @discussbot (до добавления нативных комментариев в Телеграм).
  • Callback game button — кнопка для открытия HTML-игры. См. пункт «HTML-игры».
  • Pay button — кнопка для платежей. См. пункт «Платежи через ботов».
Клавиатурные кнопки

Есть другой тип кнопок: keyboard buttons. Они отображаются вместо клавиатуры как подсказки. При нажатии на такую кнопку пользователь просто отправит этот текст.

При этом в личных чатах с помощью кнопки можно:

  • Запросить номер телефона пользователя,
  • Запросить геолокацию пользователя,
  • Открыть у пользователя меню создания опроса.

Есть опция resize_keyboard, которая отвечает за то, изменять ли высоту этой «клавиатуры из кнопок». По умолчанию она, почему-то, выключена, и тогда высота клавиатуры стандартная большая. Получаются кнопки как на этой картинке:

Чтобы показать клавиатурные кнопки, бот должен отправить сообщение. Можно отправить клавиатуру, которая свернётся (но не пропадёт) после нажатия на кнопку.

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

  • Для пользователей, юзернеймы которых были в тексте сообщения,
  • Если это ответ на другое сообщение: для пользователя, который его отправил.
Ещё о кнопках

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

При отправке сообщения можно выбрать одно (но не больше) из следующих действий:

  • Добавить к сообщению инлайн-кнопки,
  • Показать клавиатурные кнопки,
  • Убрать все клавиатурные кнопки,
  • Force reply: автоматически заставить пользователя ответить на сообщение. Так произойдёт то же самое, что и при нажатии пользователем кнопки «Ответить». Это нужно для того, чтобы бот мог общаться с пользователями в группах, не нарушая Privacy mode.

Таким образом, нельзя показать оба типа кнопок одновременно.

Взаимодействие с ботом

Ссылки на бота

Юзернеймы ботов работают так же, как и любые другие юзернеймы в Телеграме: бота @examplebot можно открыть по ссылке t.me/examplebot.

Также существует прямая ссылка: tg://resolve?domain=examplebot

Подробнее о ссылках tg://

Такие ссылки могут не только заменять ссылки t.me, но и задавать свои действия. Например, tg://settings открывает настройки.

Список известных таких ссылок есть канале @DeepLink.

Ссылка на добавление в группу

По ссылке t.me/examplebot?startgroup=true у пользователя откроется меню: выбор группы для добавления бота.

Прямая ссылка: tg://resolve?domain=examplebot&startgroup=true

Диплинки

По ссылке t.me/examplebot?start= пользователь может запустить бота с каким-то стартовым параметром ( ).

Что происходит, когда пользователь переходит по такой ссылке:

  1. Бот открывается как обычно.
  2. Отображается кнопка «Запустить», даже если пользователь уже запускал бота.
  3. Пользователь нажимает на кнопку и видит сообщение /start (всё как обычно).
  4. Боту вместо этого приходит сообщение /start

Так бот может отреагировать на запуск не как на обычный «/start», а другим способом.

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

Прямая ссылка: tg://resolve?domain=examplebot&start=

Инлайн-режим

Инлайн-режим (inline mode) — это специальный режим работы бота, с помощью которого пользователь может использовать бота во всех чатах.

Выглядит это так: пользователь вводит юзернейм бота в поле для ввода сообщения. После юзернейма можно ещё записать запрос (текст до 256 символов).

Появляется менюшка с результатами. Выбирая результат, пользователь отправляет сообщение.

Инлайн-режим можно включить в BotFather, там же можно выбрать плейсхолдер вместо стандартного «Search. «

В группе можно запретить использовать инлайн всем или некоторым участникам. В официальных приложениях Телеграм это ограничение объединено с ограничением на отправку стикеров и GIF.

Результаты инлайн-режима

Результаты можно отображать двумя способами:

  • Сеткой. Удобно для выдачи картинок.
  • Вертикальным списком. Удобно для выдачи текста.

Можно совмещать два типа, но корректно отображается это только на Telegram Desktop.

Приватность и геопозиция в инлайне

Когда пользователь вызывает инлайн-режим, бот не может получить никакую информацию о контексте, кроме информации о пользователе. Таким образом, бот не может узнать ни чат, в котором вызвали инлайн, ни сообщение, на которое пользователь отвечает.

Но зато если включить в BotFather настройку «Inline Location Data», то бот сможет видеть геопозицию пользователей, когда они используют инлайн (на мобильных устройствах). Перед этим у пользователей показывается предупреждение.

Inline feedback

Inline feedback — это апдейты о выбранных инлайн-результатах. Включаются через BotFather.

Предполагается использование inline feedback для сбора статистики, но не всегда он используется так. Inline feedback позволяет «подгружать» не все результаты сразу, а только выбранный. Например, если бот используется для поиска музыки, то он может загружать не все песни сразу, а только одну.

Важный момент: если вы получили апдейт об отправке инлайн-сообщения, то вы можете его редактировать, только если к нему прикреплены инлайн-кнопки. (Если кнопок нет, то в апдейте не указывается id инлайн-сообщения, по которому происходит редактирование).

Создание наборов стикеров

Боты (и только боты!) могут создавать наборы стикеров. При этом каждый набор стикеров должен принадлежать какому-то пользователю. Посмотреть свои наборы стикеров пользователь может с помощью бота @Stickers.

Платежи через ботов

Телеграм предоставляет ботам возможность принимать платежи от пользователей. Это делается через провайдеров ЮMoney, Сбербанк, Stripe и ещё 7.

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

UPD 04.2021. В новом обновлении появилось больше возможностей платежей для разработчиков. Теперь боты могут отправлять платежи не только в лс, но и в группы и в каналы. Это позволяет сделать из канала «витрину», на которой можно сразу купить товар. Вы можете посмотреть, как это выглядит, в официальном демо-канале.

HTML-игры в ботах

Боты могут позволять пользователям играть в HTML5-игры в чатах. Бот может отправлять сообщения-игры или создавать их через инлайн-режим. Как это работает, можно посмотреть на примере официального @gamebot.

Telegram Login Widget

Вы можете добавить на свой сайт авторизацию через Телеграм. Процесс авторизации будет проходить так:

  1. Пользователь должен будет ввести свой номер телефона.
  2. Бот Telegram попросит подтвердить вход.
  3. Пользователь авторизуется и нажимает на «Принять» на сайте.

Telegram Login Widget не связан с Login URL button (см. раздел про кнопки выше), а является его альтернативой.

Разработка ботов

Какие апдейты можно получать

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

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

В Telegram API бот может чуточку больше: он может получать сообщения по id, получать список участников группы и прочее.

Получение апдейтов: Bot API vs Telegram API

Если вы получили апдейт в Bot API, то второй раз вы его уже не получите.

В Telegram API это не так: пользователь может пользоваться мессенджером через несколько клиентов, каждый из которых должен получать апдейты.

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

Ограничения Bot API не позволяют сделать то же самое.

Обновления API

Telegram API и Telegram Bot API обновляются с появлением новых фич в Телеграме. Все обновления Bot API описаны на отдельной странице в документации и в официальном канале BotNews.

Лимиты

Конечно, на запросы к серверу существуют лимиты. В Bots FAQ на сайте Telegram названы следующие:

  • Не больше одного сообщения в секунду в один чат,
  • Не больше 30 сообщений в секунду вообще,
  • Не больше 20 сообщений в минуту в одну группу.

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

Другие известные ограничения в Telegram собраны на limits.tginfo.me — см. раздел про ботов.

Рассылка по пользователям

Ниже в Bots FAQ сказано, что Bot API не позволяет рассылать сообщения всем юзерам одновременно и что в будущем, может быть, они что-то для этого сделают. И написано это уже несколько лет.

Они советуют растянуть рассылку на длительное время (8-12 часов) и замечают, что API не позволит отправлять сообщения более чем ~30 пользователям в секунду.

Смена владельца бота

Осенью 2020 года появилась возможность передавать ботов другому человеку. Это можно сделать в настройках бота в BotFather. Для этого на вашем аккаунте должна быть включена двухфакторная авторизация — не менее, чем за 7 дней до передачи. Передать бота можно только пользователю, который что-либо ему писал.

Локальный сервер Bot API

Также осенью 2020 года исходники Bot API выложили на GitHub. Теперь вы можете поднять собственный сервер Bot API. На GitHub перечислены следующие преимущества:

  • Скачивание файлов с сервера без ограничения (ограничение на отправку файлов пользователями в Телеграме — 2 ГБ),
  • Загрузка файлов на сервер до 2000 МБ,
  • Загрузка файлов на сервер с помощью локального пути и URI файла,
  • Использование HTTP URL для вебхука,
  • Использование любого локального IP-адреса для вебхука,
  • Использование любого порта для вебхука,
  • Возможность увеличить максимальное число соединений до 100000,
  • Получение локального пути файла вместо загрузки файла с сервера.

Юзерботы

В начале статьи я рассказывал о том, что такое Telegram API и Telegram Bot API.

Telegram API используется не только для ботов — тогда в чём проблема управлять аккаунтами пользователей, как ботами? Люди это делают. Кто-то автоматически ставит текущее время себе на аватарку, кто-то скриптом реагирует на свои сообщения как на команды, кто-то сохраняет сообщения из публичных групп и каналов. Всё это называют юзерботами.

Юзерботов следует использовать аккуратно: за большую подозрительную активность аккаунт могут ограничить или забанить.

Заключение

Я постарался собрать в одном месте и структурировать информацию о всех возможностях Телеграм-ботов. Большое спасибо vanutp, NToneE и Grinrill за помощь с фактами. Если мы что-то забыли — пишите, исправлю.

Я специально не разделял большую статью на несколько постов, чтобы можно было быстро найти нужную информацию. К тому же, в начале статьи есть её содержание. Так что можете сохранить её к себе и использовать как справочник 🙂

Вообще интерфейс бота (то есть интерфейс чата) имеет много ограничений. Но плохо ли это? Действительно удобнее использовать инструмент, когда это часть привычной среды. Я часто прямо в переписке нахожу нужную картинку или информацию с помощью инлайн-ботов. Как заядлый пользователь Телеграма, я люблю использовать ботов. И создаю ботов. И вы создавайте.

Подскажите как отправлять инфу из QUIK в телеграм?

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

Страницы: 1
Cообщений на странице:
Подскажите как отправлять инфу из QUIK в телеграм?
QUIK clients support
Сообщений: 720 Регистрация: 02.09.2020
27.08.2021 17:27:40

Штатного функционала для выполнения подобных задач не предусмотрено.
Как вариант, Вы можете при помощи собственного скрипта, написанного на Lua, получать данные из терминала и отправлять их куда Вам нужно.

Пользователь
Сообщений: 862 Регистрация: 27.01.2017
27.08.2021 18:45:55

Поиск по форуму дает ответ.

Пользователь
Сообщений: 110 Регистрация: 06.02.2017
27.08.2021 18:47:23

Начни с конца.
1.в телеграм получи свой chat id
2.создай telegram bot и получи его token
3.возьми язык, который знаешь,(c++, c#, java . ) разберись как послать строку в телеграмм своему боту по token, который по твоему chat id пошлет тебе эту строку в виде сообщения
4.в lua напиши скрипт, который собирает нужную тебе инфо и передает(есть разные варианты) в программу, написанную на см.п.3.
5.(не обязательно) напиши красивую оболочку на языке, который знаешь, в которой ты делаешь выбор(ставишь галочки), какую именно информацию(большой список) тебе необходимо передавать из квик в телеграмм.

Пользователь
Сообщений: 75 Регистрация: 16.05.2020
28.08.2021 09:19:18
Спасибо изучу
Пользователь
Сообщений: 75 Регистрация: 16.05.2020
28.08.2021 09:21:29

1. Готово
2. Готово
3. Знаю только ПИТОН. ,(c++, c#, java) НЕ знаю
4. Вот это основная проблема! Читал кучу инфы но так и не допёр как сделать
5. С начала надо разобраться с пунктом 4 ))

Пользователь
Сообщений: 1217 Регистрация: 02.02.2015
28.08.2021 09:39:34
В гугле забанили? тьма ж ссылок разных
Вот, например: https://quik2dde.ru/viewtopic.php?id=307
Пользователь
Сообщений: 110 Регистрация: 06.02.2017
28.08.2021 10:58:39

Цитата
1. Готово
2. Готово
3. Знаю только ПИТОН. ,(c++, c#, java) НЕ знаю
4. Вот это основная проблема! Читал кучу инфы но так и не допёр как сделать
5. С начала надо разобраться с пунктом 4 ))

3.Если знаете ПИТОН, то пишите на ПИТОНе. Разницы нет. В инете есть примеры.
4.Т.е. Вы не знаете Lua(qlua)? Начните с его изучения. Этот форум как раз этому посвящен.

Пользователь
Сообщений: 1519 Регистрация: 30.01.2015
28.08.2021 16:12:46
Еще один вариант, самый простой на мой взгляд. Lua —> Telegram .
Пользователь
Сообщений: 75 Регистрация: 16.05.2020
16.09.2021 13:45:48

Цитата
s_mike@rambler.ru написал:
Еще один вариант, самый простой на мой взгляд. Lua —> Telegram .

Да это простой вариант.
У меня сейчас отправка сообщений в телегу реализована через os.execute
Но есть проблема — постоянно выскакивают окна CMD !!

Пользователь
Сообщений: 75 Регистрация: 16.05.2020
16.09.2021 13:47:06

Цитата
1. Готово
2. Готово
3. Знаю только ПИТОН. ,(c++, c#, java) НЕ знаю
4. Вот это основная проблема! Читал кучу инфы но так и не допёр как сделать
5. С начала надо разобраться с пунктом 4 ))

Qlua я знаю.
Не могу разобраться как отправить инфу из Quik на внешний скрипт на Питоне.
Пользователь
Сообщений: 110 Регистрация: 06.02.2017
16.09.2021 14:42:15
Начните с самого простого варианта — через файл.txt. Дальше разберетесь по мере развития схемы.
Пользователь
Сообщений: 862 Регистрация: 27.01.2017
16.09.2021 15:41:37

Цитата
Qlua я знаю.
Не могу разобраться как отправить инфу из Quik на внешний скрипт на Питоне.

Все уже придумано до вас

Пользователь
Сообщений: 75 Регистрация: 16.05.2020
16.09.2021 17:38:47

Цитата
Игорь Б написал:
Начните с самого простого варианта — через файл.txt. Дальше разберетесь по мере развития схемы

Думаю это оптимальный вариант для начала
У вас есть примеры как это сделать ? ))
Возникает вопрос как сообщить скрипту на Питоне что файл изменился. (как сигнал на отправку сообщения с текстом из файла)

Пользователь
Сообщений: 862 Регистрация: 27.01.2017
16.09.2021 18:10:09

Чаще всего в таком режиме общения либо дописывают строки в файл.

Скрипт на lua открывает файл на запись, скрипт на Питоне на чтение. Скрипт на питоне помнит последний номер строки и считывает новую, если появилась.

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

Пользователь
Сообщений: 75 Регистрация: 16.05.2020
17.09.2021 09:41:15

Скрипт на lua открывает файл на запись, скрипт на Питоне на чтение. Скрипт на питоне помнит последний номер строки и считывает новую, если появилась.

Все сделал. QUIK генерит файл с текстом, Питон его открывает и пуляет в телегу.

Но это конечно же костыль))
Идеально дергать инфу не из файла а из оперативки.
Есть идеи как это сделать ? ))
Спс

Пользователь
Сообщений: 862 Регистрация: 27.01.2017
17.09.2021 10:27:53

либо socket — можно использовать библиотеку luasocket (собственно ссылка на qlua-rpc примерно про это)

либо named pipes — надо написать(найти) dll обмена на стороне lua

Пользователь
Сообщений: 1359 Регистрация: 21.08.2015
17.09.2021 10:35:33

Цитата
Nikolay написал:
либо named pipes — надо написать(найти) dll обмена на стороне lua
io.open("\\\\.\\PIPE\\MySuperPuperServer", "wb")

Тока flush не забывать после записи.
Пользователь
Сообщений: 1971 Регистрация: 25.09.2020
17.09.2021 10:57:06

Alex, Я думаю, это вечный костыль. Идея-то стандартная, ещё из прошлого тысячелетия, называется ОЗУДД (ОЗУ двойного доступа). Например, повесить какую-нить функцию на какой-нить вектор и программным прерыванием по этому вектору делай, что хошь. Но современные операционки уже настолько изуродованы, что кроме как через файл вряд ли что получится.

Пользователь
Сообщений: 75 Регистрация: 16.05.2020
17.09.2021 11:11:18

Цитата
Владимир написал:
Alex , Я думаю, это вечный костыль. Идея-то стандартная, ещё из прошлого тысячелетия, называется ОЗУДД (ОЗУ двойного доступа). Например, повесить какую-нить функцию на какой-нить вектор и программным прерыванием по этому вектору делай, что хошь. Но современные операционки уже настолько изуродованы, что кроме как через файл вряд ли что получится.

Через файл все работает супер, спасибо

Проблема только с записью русских букв в файл.
io.wriite пишет в файл только латиницу , а кириллицу не пишет.

Пользователь
Сообщений: 862 Регистрация: 27.01.2017
17.09.2021 11:26:55

io.open ( "\\\\.\\PIPE\\MySuperPuperServer" , "wb" )

В принципе да, т.к. это как бы «файл в памяти».

Квик воспринимает только win1251, поэтому файл должен быть в этой кодировке. Либо используйте перекодировку в UTF.

Пользователь
Сообщений: 3 Регистрация: 17.09.2021
17.09.2021 14:30:33

Цитата
Nikolay написал:
либо named pipes — надо написать(найти) dll обмена на стороне lua
io.open ( "\\\\.\\PIPE\\MySuperPuperServer" , "wb" )

\\.\PIPE\MySuperPuperServer: No such file or directory

Пользователь
Сообщений: 1359 Регистрация: 21.08.2015
17.09.2021 14:38:45

Цитата
Александр написал:
В чём прикол?

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

Пользователь
Сообщений: 75 Регистрация: 16.05.2020
19.09.2021 18:49:10

Цитата
Владимир написал:
Alex , Я думаю, это вечный костыль. Идея-то стандартная, ещё из прошлого тысячелетия, называется ОЗУДД (ОЗУ двойного доступа). Например, повесить какую-нить функцию на какой-нить вектор и программным прерыванием по этому вектору делай, что хошь. Но современные операционки уже настолько изуродованы, что кроме как через файл вряд ли что получится.

А как сделать обмен в обратном направлении? Из Питона в Квик
Квик -> Питон все просто. watсhdog python отслеживает изменение файла. В qlua нет функции отслеживания изменения файла.
Спс

Пользователь
Сообщений: 1971 Регистрация: 25.09.2020
19.09.2021 21:46:38

:smile:

Alex, А почему ко мне вопрос? Я в жизни на Питоне не программировал. А здесь пишу на чистейшем Lua, без всяких обменов с кем бы то ни было.

Пользователь
Сообщений: 862 Регистрация: 27.01.2017
20.09.2021 09:48:27

Цитата
А как сделать обмен в обратном направлении? Из Питона в Квик
Квик -> Питон все просто. watсhdog python отслеживает изменение файла. В qlua нет функции отслеживания изменения файла.
Спс

Ничего сложного. Открываете файл в режиме чтения и читаете его.

Все зависит от методики обмена, как Вы будете записывать информацию. Одна строка, несколько строк. Возможно надо написать свой итератор перебора строк.

Для примера, можно просто читать последнюю строку файла через:

file:seek("end") last_line = file:read('*l')

Если появится новая строка, то и при чтении она считается, т.к. директива *l — Reads the line from the current file position, and moves file position to next line.

Пользователь
Сообщений: 75 Регистрация: 16.05.2020
20.09.2021 16:00:11

Цитата
А как сделать обмен в обратном направлении? Из Питона в Квик
Квик -> Питон все просто. watсhdog python отслеживает изменение файла. В qlua нет функции отслеживания изменения файла.
Спс

Ничего сложного. Открываете файл в режиме чтения и читаете его.

Все зависит от методики обмена, как Вы будете записывать информацию. Одна строка, несколько строк. Возможно надо написать свой итератор перебора строк.

Для примера, можно просто читать последнюю строку файла через:

file:seek( "end" ) last_line = file:read( '*l' )

Николай спасибо, попробую реализовать..
Остается вопрос как дать понять скрипту lua что в файл добавлена новая строка.
Получается надо делать бесконечный цикл который постоянно читает файл и ищет в нем новую строку ?

Пользователь
Сообщений: 862 Регистрация: 27.01.2017
20.09.2021 17:27:48

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

Пользователь
Сообщений: 1971 Регистрация: 25.09.2020
20.09.2021 17:46:16
Nikolay, Таймер и так сделан: почти в любом скрипте стоит этот цикл со sleep.
Пользователь
Сообщений: 75 Регистрация: 16.05.2020
20.09.2021 20:30:49

Цитата
Nikolay написал:
В принципе да. Но проще всего это сделать через замыкание, тогда проще вызывать. Можно даже сделать таймер, чтобы не читать слишком часто

Николай можно поподробнее про «замыкание»
Спасибо
Пользователь
Сообщений: 862 Регистрация: 27.01.2017
21.09.2021 10:46:30

Цитата
Alex написал:
Николай можно поподробнее про «замыкание»
Спасибо

Если простыми словами — то это функция объект с своей областью видимости. Что дает возможность создавать разные экземпляры функции с своими переменными.

Таймер на любую функцию можно сделать так (пример на чистом lua):

local timer_processor = function(delay) delay = delay or 0 local last_time = 0 return function(func, . ) local cur_time = os.time() if cur_time - last_time >= delay then last_time = cur_time return func(. ) end return . end end local some_func = function(x) x = x + 1 print(x) return x end local timer = timer_processor(2) local a = 1 while a < 5 do a = timer(some_func, a) end

Функция some_func вызывается постоянно, но исполняется только каждые 2 секунды - параметр delay. При этом можно создавать несколько таймеров на разные задержки, используя один и тот же конструктор.

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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *