Содержание
- Обычные кнопки¶
- Инлайн-кнопки¶
- Какие активные кнопки можно добавить в Telegram
- Как поставить активные кнопки с помощью ControllerBot и BotFather
- Инструкция по использованию
- Какие задачи стоят перед ботом?
- Создание простого Telegram-бота с кнопками
- Создаем бота с кнопкой для Telegram под слив на беттинг
- Готовый Telegram-бот с меню
- Подводя итоги
- Создание кнопки
- Делаем кнопку «Поделиться»
- Заключение
- Видео по теме
В этой главе мы познакомимся с такой замечательной фичей Telegram-ботов, как кнопки. Прежде всего, чтобы избежать путаницы, определимся с названиями. То, что цепляется к низу экрана вашего устройства, будем называть обычными кнопками, а то, что цепляется непосредственно к сообщениям, назовём инлайн-кнопками. Ещё раз картинкой:
Обычные кнопки¶
Кнопки как шаблоны¶
Этот вид кнопок появился вместе с Bot API в далёком 2015 году и представляет собой не что иное, как шаблоны сообщений (за исключением нескольких особых случаев, но о них позже). Принцип простой: что написано на кнопке, то и будет отправлено в текущий чат. Соответственно, чтобы обработать нажатие такой кнопки, бот должен распознавать входящие текстовые сообщения.
Напишем хэндлер, который будет при нажатии на команду /start
отправлять сообщение с двумя кнопками:
# from aiogram import types @dp.message_handler(commands="start") async def cmd_start(message: types.Message): keyboard = types.ReplyKeyboardMarkup() button_1 = types.KeyboardButton(text="С пюрешкой") keyboard.add(button_1) button_2 = "Без пюрешки" keyboard.add(button_2) await message.answer("Как подавать котлеты?", reply_markup=keyboard)
Обратите внимание, что т.к. обычные кнопки суть шаблоны сообщений, то их можно создавать не только как объекты KeyboardButton
, но и как обычные строки. Что ж, запустим бота и обалдеем от громадных кнопок:
Как-то некрасиво. Во-первых, хочется сделать кнопки поменьше, а во-вторых, расположить их горизонтально. Почему вообще они такие большие? Дело в том, что по умолчанию «кнопочная» клавиатура должна занимать на смартфонах столько же места, сколько и обычная буквенная. Для уменьшения кнопок к объекту клавиатуры надо указать дополнительный параметр resize_keyboard=True
. Но как заменить вертикальные кнопки на горизонтальные? С точки зрения Bot API, клавиатура — это массив массивов кнопок, а если говорить проще, массив строк. Метод add()
при каждом вызове создаёт новую строку (ряд) и принимает произвольное число аргументов по количеству желаемых кнопок в строке. Перепишем наш код, чтобы было красиво:
@dp.message_handler(commands="start") async def cmd_start(message: types.Message): keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True) buttons = ["С пюрешкой", "Без пюрешки"] keyboard.add(*buttons) await message.answer("Как подавать котлеты?", reply_markup=keyboard)
Обратите внимание на конструкцию *buttons
. Здесь вам не C++ и звёздочка используется для распаковки списка. Подробнее об операторах *
и **
можно прочитать здесь.
Смотрим — действительно красиво:
Осталось научить бота реагировать на нажатие таких кнопок. Как уже было сказано выше, необходимо делать проверку на полное совпадение текста. Сделаем это двумя способами: через специальный фильтр Text
и обычной лямбдой:
# from aiogram.dispatcher.filters import Text @dp.message_handler(Text(equals="С пюрешкой")) async def with_puree(message: types.Message): await message.reply("Отличный выбор!") @dp.message_handler(lambda message: message.text == "Без пюрешки") async def without_puree(message: types.Message): await message.reply("Так невкусно!")
Чтобы удалить кнопки, необходимо отправить новое сообщение со специальной «удаляющей» клавиатурой типа ReplyKeyboardRemove
. Например: await message.reply("Отличный выбор!", reply_markup=types.ReplyKeyboardRemove())
У объекта обычной клавиатуры есть ещё две полезных опции: one_time_keyboard
для скрытия кнопок после нажатия и selective
для показа клавиатуры лишь некоторым участникам группы. Их использование остаётся для самостоятельного изучения.
Помимо стандартных опций, описанных выше, aiogram немного расширяет функциональность клавиатур параметром row_width
. При его использовании, фреймворк автоматически разобьёт массив кнопок на строки по N элементов в каждой, где N — значение row_width
, например, row_width=2
. Попробуйте!
Специальные обычные кнопки¶
По состоянию на конец ужасного 2020 года в Telegram существует три специальных вида обычных кнопок, не являющихся шаблонами: для отправки текущей геолокации, для отправки своего номера телефона и ярлык для создания опроса/викторины. Для первых двух типов достаточно установить булевый флаг, а для опросов и викторин нужно передать специальный тип KeyboardButtonPollType
и, по желанию, указать тип создаваемого объекта.
Впрочем, проще один раз увидеть код:
@dp.message_handler(commands="special_buttons") async def cmd_special_buttons(message: types.Message): keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True) keyboard.add(types.KeyboardButton(text="Запросить геолокацию", request_location=True)) keyboard.add(types.KeyboardButton(text="Запросить контакт", request_contact=True)) keyboard.add(types.KeyboardButton(text="Создать викторину", request_poll=types.KeyboardButtonPollType(type=types.PollType.QUIZ))) await message.answer("Выберите действие:", reply_markup=keyboard)
Инлайн-кнопки¶
URL-кнопки и колбэки¶
В отличие от обычных кнопок, инлайновые цепляются не к низу экрана, а к сообщению, с которым были отправлены. В этой главе мы рассмотрим два типа таких кнопок: URL и Callback. Ещё один — Switch — будет рассмотрен в главе про инлайн-режим.
Login- и Pay-кнопки в книге рассматриваться не будут вообще. Если у кого-то есть желание помочь хотя бы с рабочим кодом для авторизации или оплаты, пожалуйста, создайте Pull Request на GitHub. Спасибо!
Самые простые инлайн-кнопки относятся к типу URL, т.е. «ссылка». Поддерживаются только протоколы HTTP(S) и tg://
@dp.message_handler(commands="inline_url") async def cmd_inline_url(message: types.Message): buttons = [ types.InlineKeyboardButton(text="GitHub", url="https://github.com"), types.InlineKeyboardButton(text="Оф. канал Telegram", url="tg://resolve?domain=telegram") ] keyboard = types.InlineKeyboardMarkup(row_width=1) keyboard.add(*buttons) await message.answer("Кнопки-ссылки", reply_markup=keyboard)
А если хотите обе кнопки в ряд, то уберите row_width=1
(тогда будет использоваться значение по умолчанию 3).
С URL-кнопками больше обсуждать, по сути, нечего, поэтому перейдём к гвоздю сегодняшней программы — Callback-кнопкам. Это очень мощная штука, которую вы можете встретить практически везде. Кнопки-реакции у постов (лайки), меню у @BotFather и т.д. Суть в чём: у колбэк-кнопок есть специальное значение (data), по которому ваше приложение опознаёт, что нажато и что надо сделать. И выбор правильного data очень важен! Стоит также отметить, что, в отличие от обычных кнопок, нажатие на колбэк-кнопку позволяет сделать практически что угодно, от заказа пиццы до перезагрузки сервера.
Напишем хэндлер, который по команде /random
будет отправлять сообщение с колбэк-кнопкой:
@dp.message_handler(commands="random") async def cmd_random(message: types.Message): keyboard = types.InlineKeyboardMarkup() keyboard.add(types.InlineKeyboardButton(text="Нажми меня", callback_data="random_value")) await message.answer("Нажмите на кнопку, чтобы бот отправил число от 1 до 10", reply_markup=keyboard)
Но как же обработать нажатие? Если раньше мы использовали message_handler
для обработки входящих сообщений, то теперь будем использовать callback_query_handler
для обработки колбэков. Ориентироваться будем на «значение» кнопки, т.е. на её data:
@dp.callback_query_handler(text="random_value") async def send_random_value(call: types.CallbackQuery): await call.message.answer(str(randint(1, 10)))
Важно
Несмотря на то, что параметр кнопки callback_data
, а значение data
лежит в одноимённом поле data
объекта CallbackQuery, собственный фильтр aiogram называется text
.
Ой, а что это за часики? Оказывается, сервер Telegram ждёт от нас подтверждения о доставке колбэка, иначе в течение 30 секунд будет показывать специальную иконку. Чтобы скрыть часики, нужно вызвать метод answer()
у колбэка (или использовать метод API answer_callback_query()
). В общем случае, в метод answer()
можно ничего не передавать, но можно вызвать специальное окошко (всплывающее сверху или поверх экрана):
@dp.callback_query_handler(text="random_value") async def send_random_value(call: types.CallbackQuery): await call.message.answer(str(randint(1, 10))) await call.answer(text="Спасибо, что воспользовались ботом!", show_alert=True) # или просто await call.answer()
Обратите внимание
В функции send_random_value
мы вызывали метод answer()
не у message
, а у call.message
. Это связано с тем, что колбэк-хэндлеры работают не с сообщениями (тип Message), а с колбэками (тип CallbackQuery), у которого другие поля, и само сообщение — всего лишь его часть. Учтите также, что message
— это сообщение, к которому была прицеплена кнопка (т.е. отправитель такого сообщения — сам бот). Если хотите узнать, кто нажал на кнопку, смотрите поле from
(в вашем коде это будет call.from_user
, т.к. слово from
зарезервировано в Python)
Когда вызывать answer()
?
В общем случае, главное — просто не забыть сообщить Telegram о получении колбэк-запроса, но я рекомендую ставить вызов answer()
в самом конце, и вот почему: если вдруг в процессе обработки колбэка случится какая-то ошибка и бот нарвётся на необработанное исключение, пользователь увидит неубирающиеся полминуты часики и поймёт, что что-то не так. В противном случае, часики исчезнут, а пользователь останется в неведении, выполнился его запрос успешно или нет.
Перейдём к примеру посложнее. Пусть пользователю предлагается сообщение с числом 0, а внизу три кнопки: +1, -1 и Подтвердить. Первыми двумя он может редактировать число, а последняя удаляет всю клавиатуру, фиксируя изменения. Хранить значения будем в памяти в словаре (про конечные автоматы поговорим как-нибудь в другой раз).
# Здесь хранятся пользовательские данные. # Т.к. это словарь в памяти, то при перезапуске он очистится user_data = {} def get_keyboard(): # Генерация клавиатуры. buttons = [ types.InlineKeyboardButton(text="-1", callback_data="num_decr"), types.InlineKeyboardButton(text="+1", callback_data="num_incr"), types.InlineKeyboardButton(text="Подтвердить", callback_data="num_finish") ] # Благодаря row_width=2, в первом ряду будет две кнопки, а оставшаяся одна # уйдёт на следующую строку keyboard = types.InlineKeyboardMarkup(row_width=2) keyboard.add(*buttons) return keyboard async def update_num_text(message: types.Message, new_value: int): # Общая функция для обновления текста с отправкой той же клавиатуры await message.edit_text(f"Укажите число: {new_value}", reply_markup=get_keyboard()) @dp.message_handler(commands="numbers") async def cmd_numbers(message: types.Message): user_data[message.from_user.id] = 0 await message.answer("Укажите число: 0", reply_markup=get_keyboard()) @dp.callback_query_handler(Text(startswith="num_")) async def callbacks_num(call: types.CallbackQuery): # Получаем текущее значение для пользователя, либо считаем его равным 0 user_value = user_data.get(call.from_user.id, 0) # Парсим строку и извлекаем действие, например `num_incr` -> `incr` action = call.data.split("_")[1] if action == "incr": user_data[call.from_user.id] = user_value+1 await update_num_text(call.message, user_value+1) elif action == "decr": user_data[call.from_user.id] = user_value-1 await update_num_text(call.message, user_value-1) elif action == "finish": # Если бы мы не меняли сообщение, то можно было бы просто удалить клавиатуру # вызовом await call.message.delete_reply_markup(). # Но т.к. мы редактируем сообщение и не отправляем новую клавиатуру, # то она будет удалена и так. await call.message.edit_text(f"Итого: {user_value}") # Не забываем отчитаться о получении колбэка await call.answer()
И, казалось бы, всё работает:
Но теперь представим, что ушлый пользователь сделал следующее: вызвал команду /numbers
(значение 0), увеличил значение до 1, снова вызвал /numbers
(значение сбросилось до 0) и отредактировал нажал кнопку “+1” на первом сообщении. Что произойдёт? Бот по-честному отправит запрос на редактирование текста со значением 1, но т.к. на том сообщении уже стоит цифра 1, то Bot API вернёт ошибку, что старый и новый тексты совпадают, а бот словит исключение: aiogram.utils.exceptions.MessageNotModified: Message is not modified: specified new message content and reply markup are exactly the same as a current content and reply markup of the message
С этой ошибкой вы, скорее всего, будете поначалу часто сталкиваться, пытаясь редактировать сообщения. Но, в действительности, решается проблема очень просто: мы проигнорируем исключение MessageNotModified
. Из первой главы вы уже знаете о такой прекрасной штуке, как errors_handler
, но в этот раз мы поступим чуть иначе и перепишем функцию update_num_text()
следующим образом:
# from aiogram.utils.exceptions import MessageNotModified # from contextlib import suppress async def update_num_text(message: types.Message, new_value: int): with suppress(MessageNotModified): await message.edit_text(f"Укажите число: {new_value}", reply_markup=get_keyboard())
Если теперь вы попробуете повторить пример выше, то указанное исключение в этом блоке кода бот просто-напросто проигнорирует.
Фабрика колбэков¶
В aiogram существует т.н. фабрика колбэков. Вы создаёте объект CallbackData
, указываете ему префикс и произвольное количество доп. аргументов, которые в дальнейшем указываете при создании колбэка для кнопки. Например, рассмотрим следующий объект:
# from aiogram.utils.callback_data import CallbackData cb= CallbackData("post", "id", "action")
Тогда при создании кнопки вам надо указать её параметры так:
button = types.InlineKeyboardButton( text="Лайкнуть", callback_data=cb.new(id=5, action="like") )
В примере выше в кнопку запишется callback_data
, равный post:5:like
, а хэндлер на префикс post
будет выглядеть так:
@dp.callback_query_handler(cb.filter()) async def callbacks(call: types.CallbackQuery, callback_data: dict): post_id = callback_data["id"] action = callback_data["action"]
В предыдущем примере с числами мы грамотно выбрали callback_data
, поэтому смогли легко запихнуть все обработчики в один хэндлер. Но можно логически разнести обработку инкремента и декремента от обработки нажатия на кнопку “Подтвердить”. Для этого в фильтре фабрики можно указать желаемые значения какого-либо параметра. Давайте перепишем наш пример с использоваанием фабрики:
# fabnum - префикс, action - название аргумента, которым будем передавать значение callback_numbers = CallbackData("fabnum", "action") def get_keyboard_fab(): buttons = [ types.InlineKeyboardButton(text="-1", callback_data=callback_numbers.new(action="decr")), types.InlineKeyboardButton(text="+1", callback_data=callback_numbers.new(action="incr")), types.InlineKeyboardButton(text="Подтвердить", callback_data=callback_numbers.new(action="finish")) ] keyboard = types.InlineKeyboardMarkup(row_width=2) keyboard.add(*buttons) return keyboard async def update_num_text_fab(message: types.Message, new_value: int): with suppress(MessageNotModified): await message.edit_text(f"Укажите число: {new_value}", reply_markup=get_keyboard_fab()) @dp.message_handler(commands="numbers_fab") async def cmd_numbers(message: types.Message): user_data[message.from_user.id] = 0 await message.answer("Укажите число: 0", reply_markup=get_keyboard_fab()) @dp.callback_query_handler(callback_numbers.filter(action=["incr", "decr"])) async def callbacks_num_change_fab(call: types.CallbackQuery, callback_data: dict): user_value = user_data.get(call.from_user.id, 0) action = callback_data["action"] if action == "incr": user_data[call.from_user.id] = user_value + 1 await update_num_text_fab(call.message, user_value + 1) elif action == "decr": user_data[call.from_user.id] = user_value - 1 await update_num_text_fab(call.message, user_value - 1) await call.answer() @dp.callback_query_handler(callback_numbers.filter(action=["finish"])) async def callbacks_num_finish_fab(call: types.CallbackQuery): user_value = user_data.get(call.from_user.id, 0) await call.message.edit_text(f"Итого: {user_value}") await call.answer()
На этом глава про кнопки окончена, но про некоторые других их виды мы поговорим в следующих главах.
Содержание:
Какие активные кнопки можно добавить в Telegram
URL-кнопки
Наверное самый распространённый вид кнопок, используемых в Телеграм. При нажатии на нее, пользователь увидит предупреждение, что ссылка ведет на сторонний ресурс. Если он подтвердит переход, браузер откроет URL-адрес. Пример использования такой кнопки-ссылки: пост с краткой выжимкой из большой статьи, ссылка ведет на полный вариант.
Switch-кнопки
Switch-кнопки имеют более сложный механизм работы. С помощью них можно осуществлять перенаправление внутри мессенджера. Например, переключить пользователя на чат с ботом для заказа товара или оформления подписки. Конечно, для этого можно самостоятельно найти бота и написать ему, но кнопка позволяет автоматизировать этот процесс и сделать его удобнее.
Callback-кнопки
Этот тип кнопок самый многофункциональный. При нажатии на нее может выполняться любое произвольное действие. Возможности callback-кнопок (или, как их еще называют, кнопок с обратной связью) ограничены только вашей фантазией. Они хорошо подойдут для решения таких простых задач, как автоматическая замена текста в сообщениях по условию. Но также позволят реализовать и более сложные вещи. Например, навигацию по длинной статье на манер постраничной пагинации на сайте или даже создание календаря с возможностью выбора даты. Причем для добавления такого функционала в свой Телеграм-канал, необязательно иметь навыки программирования. В сети есть очень много готовых решений с инструкциями по их внедрению.
Кнопки с реакциями
Их можно использовать вместо опросов. Особенно, если не предполагается большого числа вариантов ответа, а нужно лишь узнать отношение подписчиков к посту. Большинство пользователей Телеграм наверняка с ними встречались. Обычно это две кнопки «Палец вверх» и «Палец вниз», но могут быть и другие. Например, можно использовать различные эмодзи или просто текст. Когда пользователи будут выбирать нужную им реакцию, на кнопке будет отображаться, сколько человек на нее нажали.
Как поставить активные кнопки с помощью ControllerBot и BotFather
Добавление бота на канал
- Для начала нам понадобится найти нужного бота. Пишем в поисковой строке Телеграм «@controllerbot» и выбираем из списка. После нажимаем «Запустить» в нижней части экрана.
ВАЖНО! В Телеграме огромное количество ботов, в том числе с почти одинаковыми именами. Внимательно смотрите, чтобы имя после символа «@» точно совпадало с вашим поисковым запросом.
- В ответ бот отправит сообщение с доступными командами. Нам нужен пункт «/addchannel», кликаем по нему. Далее переходим в @BotFather, его имя пришлет ControllerBot в следующем сообщении.
- Нажимаем «Запустить». В ответном сообщении выбираем пункт «/newbot» и создаем нового бота.
- BotFather попросит нас придумать имя для нашего бота. Пишем то, которое нравится. Далее нужно будет задать ему имя пользователя. После того как бот будет создан, оно будет иметь вид «@имя_бот».
- Если все сделано правильно, придет ответное сообщение с токеном, которое нужно отправить ControllerBot. Для этого нажмите правой кнопкой мыши на сообщении и выберите пункт «Переслать сообщение». В списке получателей выбираем ControllerBot. Наш бот создан! Теперь можно перейти к его настройке.
Настройка бота
- Чтобы вы могли использовать бота для создания постов, нужно добавить его в администраторы канала. Переходим в канал, нажимаем на вертикальное троеточие в верхнем правом углу экрана. Нас интересует пункт «Управление каналом», выбираем его.
- Далее заходим в раздел «Администраторы» и нажимаем «Добавить администратора». В поле поиска вписываем имя нашего бота. Поскольку бот не является нашим подписчиком, Телеграм предупредит об этом и запросит подтверждение действия. Нажимаем «ОК». Таким образом, бот автоматически подписывается на канал и назначается его администратором.
- Даем боту полные права и сохраняем.
- Теперь нам нужно отправить любой пост из канала ControllerBot. Если вы только недавно создали канал, и в нем еще нет ни одного поста, просто создайте новый. Затем жмем правой кнопкой на сообщении, выбираем «Переслать сообщение» и выбираем получателя – ControllerBot.
- В ответ бот попросит указать город, в котором вы проживаете, для настройки таймзоны. Это вам понадобится в будущем, чтобы создавать отложенные посты. Отправляем название города и, когда бот запросит подтверждение, нажимаем «Верно», если все правильно.
- ControllerBot ответит, что все прошло успешно и вы можете перейти в вашего бота для создания постов. Просто кликаем по его названию в сообщении. Для начала работы нажмите кнопку «Запустить».
Инструкция по использованию
Как сделать кнопку-ссылку на сайт с помощью бота
- Перед вами меню бота. Сейчас нам нужен пункт «Создать пост», жмем на него.
- Выбираем канал, в который отправится будущий пост.
- Набираем текст поста и нажимает на значок отправки.
- Наш пост пока не опубликован, а только подготовлен. Мы можем добавить к нему разные элементы, такие как видео и изображения, открыть комментарии, добавить реакции и URL-кнопки. Именно последние нам сейчас нужны. Выбираем этот пункт.
- Бот отправит нам в ответ инструкцию. Следуем ей. Сначала пишем текст, который будет отображен на самой кнопке. Через тире – ссылку, на которую подписчик перейдет по ее нажатии. Если нужно добавить несколько кнопок сразу, пишем их все в одну строку, разделяя пробелами и символом «|». По завершении нажимаем «Отправить».
- Чтобы опубликовать пост с кнопкой-ссылкой, нажмите «Далее», затем «Опубликовать». И после того, как бот спросит нас, уверены ли мы в своих действиях, снова жмем «Опубликовать».
- После этого пост появится в канале. Можно перейти и посмотреть, как это выглядит.
Как сделать кнопку с реакциями в Телеграмме
- Реакции делаются почти по тому же принципу. Первые три шага аналогичны работе с добавлением URL-кнопки. На следующем этапе нужно будет выбрать пункт «Добавить реакции». В ответ бот пришлет сообщение с инструкциями и примерами, как это будет выглядеть в готовом виде. Вы можете отправить в качестве реакций эмодзи, текст или их сочетание, разделяя их между собой символом «/». Когда все готово, отправляем.
- Публикация готового поста происходит так же, как описано выше, в блоке про URL-кнопки.
Делаем кнопку «Поделиться»
- По умолчанию в Телеграме уже предусмотрена кнопка «Поделиться», однако не всех она устраивает. На мобильных устройствах, например, она довольна неприметна. Чтобы сделать свою большую кнопку «Поделиться», нам понадобится бот @tgshare_bot. Вводим его название в поиск и выбираем нужный. Нажимаем «Запустить».
- В ответ бот скажет нам, что делать. Нужно будет отправить ему ссылку на пост, для которого требуется сформировать share-ссылку.
- Переходим в наш канал и копируем ссылку на любой пост. Можно взять и любую другую ссылку, какая вам будет нужна.
- Отправляем ее TgshareBot. Ссылку из ответного сообщения копируем.
- Далее заходим в чат с нашим ботом, которого мы создали и подключили к каналу. Проделываем то же самое, что и в случае с добавлением кнoпки-ссылки.
15 мин
Какие задачи стоят перед ботом?
Сразу заметим, что слив трафика на беттинг — лишь частный пример. Технически с помощью бота можно будет лить трафик на любую вертикаль — лишь бы хватило фантазии, как все это интегрировать в бота. Но именно беттинг-сфера позволяет в полной мере раскрыть возможности бота, поэтому выбор пал на нее. В чем суть:
- Есть сайт букмекерской конторы.
- В нем есть возможность поставить ставку на разные виды спорта.
- В каждом виде спорта есть свои лиги, страны и т. д.
- Всю эту информацию мы соберем и будем выводить в виде каталога.
- Подписчики бота смогут сами выбрать, на какое событие хотят сделать ставку, и уже потом получат ссылку на лендинг.
Скрин интересующей нас навигации сайта БК на примере MostBet
Скрин навигации бота Либо альтернатива:
- У вас есть несколько схем от капперов.
- Вы создаете меню, разбивая схемы по разным категориям.
- Пользователь заходит и видит не очередной пост с одним прогнозом, а полноценный каталог.
- Благодаря богатому выбору он с большим шансом будет вовлечен.
По такому же принципу можно сделать и своего бота — только дать пользователю больше выбора с помощью меню. К слову, эта же тема актуальна и в гембле при сливе через схемы. Впрочем, все это лишь примеры возможного использования бота, и его потенциал ими не ограничивается. По сути, с его помощью можно лить траф не только на беттинг. Но так как специфика беттинга подразумевает решение более сложных задач, чем простое создание меню, то в качестве примера будет использована именно эта вертикаль. Также заметим, что ввиду объемности материала, статья будет состоять из трех частей. В этой части будут реализованы задачи, перечисленные выше. Во второй и третьей части мы будет делать бота более адаптивным и универсальным, чтобы можно было лить на несколько БК сразу.
Создание простого Telegram-бота с кнопками
Первое, что нужно сделать, — настроить наш сервер, создать бота в самом Telegram и получить токен. Для этого: 1. Регистрируемся и авторизируемся на pythonanywhere. 2. Запускаем Bash-консоль, ждем пока сервер будет настроен.
Главное меню бесплатного хостинга pythonanywhere. 3. Инсталлируем pyTelegramBotAPI — модуль, с помощью которого наш бот будет взаимодействовать с API Telegram. Это делается вводом следующей команды: pip3.9 install –user pyTelegramBotAPI
Консоль сервера *3.9 — используемая и сервером pythonanywhere, и Telegram версия Python. Используйте свежую (данная актуальна лишь на момент написания материала) версию, иначе будет ошибка. 4. Запрашиваем у Telegram токен для нашего бота. Для этого просто пишем официальному боту для управления ботами @BotFather и следуем его указаниям. Там ничего сложного, нужно лишь указать название бота в формате ИМЯ_bot. Приставка _bot обязательна. И да, название не должно нарушать правила мессенджера. Когда бот @BotFather выдаст токен — сохраняем его отдельно.
Получение токена через официальный бот Телеги @BotFather 5. Пишем код для логики бота в блокнот или любой другой текстовый редактор: import telebot #подгружаем модуль телебот from telebot import types # для указания типов кнопок bot = telebot.TeleBot(‘ТОКЕН СЮДА’) #задаем токен @bot.message_handler(commands=[‘start’]) #задаем реакцию на команду /start def start(message): markup = types.ReplyKeyboardMarkup(resize_keyboard=True) btn1 = types.KeyboardButton(“👋 Поздороваться”) #создаем кнопку Поздороваться btn2 = types.KeyboardButton(“Меню”) #создаем кнопку Меню markup.add(btn1, btn2) bot.send_message(message.chat.id, text=”Привет, {0.first_name}! Я тестовый бот для читателей trafficcardinal.com”.format(message.from_user), reply_markup=markup) #создаем текст для вывода при активации команды /start @bot.message_handler(content_types=[‘text’]) #задаем реакцию на новые сообщения #(нажатия кнопок — тоже сообщения) def func(message): if(message.text == “👋 Поздороваться”): #задаем реакцию на кнопку Поздороваться bot.send_message(message.chat.id, text=”Привет, {0.first_name}! Я тестовый бот для читателей trafficcardinal.com”.format(message.from_user)) #создаем текст для вывода при активации кнопки Поздороваться elif(message.text == “Меню”): #задаем реакцию на кнопку Меню markup = types.ReplyKeyboardMarkup(resize_keyboard=True) #обновляем тип используемых кнопок btna1 = types.KeyboardButton(“А1”) #создаем кнопку А1 btna2 = types.KeyboardButton(“А2”) #создаем кнопку А2 back = types.KeyboardButton(“Вернуться в главное меню”) #создаем кнопку Вернуться в главное меню markup.add(btna1, btna2, back) #обновляем кнопки у пользователя bot.send_message(message.chat.id, text=”Меню”, reply_markup=markup) #создаем текст для вывода при активации кнопки Меню elif(message.text == “А1”): #задаем реакцию на кнопку А1 bot.send_message(message.chat.id, “А1”) #создаем текст для вывода при активации кнопки А1 elif message.text == “А2”: #задаем реакцию на кнопку А2 bot.send_message(message.chat.id, text=”А2″) #создаем текст для вывода при активации кнопки А2 elif (message.text == “Вернуться в главное меню”): #задаем реакцию на кнопку Вернуться в главное меню markup = types.ReplyKeyboardMarkup(resize_keyboard=True) #обновляем тип используемых кнопок button1 = types.KeyboardButton(“👋 Поздороваться”) #создаем кнопку Поздороваться button2 = types.KeyboardButton(“Меню”) #создаем кнопку Меню markup.add(button1, button2) #обновляем кнопки у пользователя bot.send_message(message.chat.id, text=”Вы вернулись в главное меню”, reply_markup=markup) #создаем текст для вывода при активации кнопки Вернуться в главное меню else: #задаем реакцию на ВСЕ ОСТАЛЬНЫЕ ситуации bot.send_message(message.chat.id, text=”На такую комманду я не запрограммировал..”) #создаем текст реакции для всех остальных ситуаций bot.polling(none_stop=True) #запрещаем скрипту «спать» — нужно чтобы бот был всегда был онлайн Находим фрагмент bot = telebot.TeleBot(‘ТОКЕН СЮДА’) #задаем токен — вставляем токен из ответа @BotFather (см. предыдущий раздел). Сохраняем файл как «bot.py». СКАЧАТЬ ИСХОДНЫЙ КОД 6. Загружаем файл на сервер.
Добавление python-скрипта на сервер 7. Запускаем бота, нажав Run.
Инициация обработки скрипта 8. Проверяем результат. Бот должен создать указанные кнопки и реагировать на их нажатия.
Общий принцип работы бота с кнопками Получилось? Неплохо, поздравляем! Но для полноценного бота под слив трафика двух кнопок маловато, не так ли? Чтобы создать бота под свои нужды, внимательно присмотритесь к коду выше. Символом # отмечены фрагменты кода, которые не будут обрабатываться сервером. В них указаны пояснения ко всему, что происходит в коде. Для расширения функциональности бота нас интересуют следующие фрагменты:
- #задаем реакцию на кнопку;
- #обновляем тип используемых кнопок;
- #создаем кнопку (обычно несколько раз подряд);
- #обновляем кнопки у пользователя;
- #создаем текст для вывода при активации кнопки.
По сути, перед нами упрощенная интерпретация логики работы основной части бота. Чтобы расширить функционал бота и сделать его пригодным для слива на беттинг, достаточно добавить больше кнопок, исходя из ваших нужд. При этом нужно выполнить каждый из указанных шагов выше. Давайте попробуем это сделать и заодно адаптировать бота по беттинг.
Создаем бота с кнопкой для Telegram под слив на беттинг
Итак, допустим, вы ходим сделать так, чтобы пользователь, нажав на меню, получал список из нескольких видов спорта, в каждом из которых будет своя лига, а в каждой лиге — актуальные офферы. Для этого нам нужно немного адаптировать код выше, а именно:
- Добавить больше кнопок в раздел Меню, исходя их видов спорта.
elif(message.text == “Меню”): #ничего не меняли markup = types.ReplyKeyboardMarkup(resize_keyboard=True) #ничего не меняли btna1 = types.KeyboardButton(“Футбол”) #заменили текст А1 на Футбол btna2 = types.KeyboardButton(“Баскетбол”) #заменили текст А2 на баскетбол btna3 = types.KeyboardButton(“ММА”) #создали новую кнопку ММА btna4 = types.KeyboardButton(“Формула-1”) #создали новую кнопку Формула-1 back = types.KeyboardButton(“Вернуться в главное меню”) #ничего не меняли markup.add(btna1, btna2, btna3, bnta4, back) #добавили кнопки btna3 и btna4 bot.send_message(message.chat.id, text=”Меню”, reply_markup=markup) #ничего не меняли
- Добавить реакцию на каждую кнопку раздела с меню, с учетом того, что у каждого элемента меню будет свое подменю.
elif(message.text == “Футбол”): #задаем реакцию на кнопку Футбол (бывшая кнопка А1) markup = types.ReplyKeyboardMarkup(resize_keyboard=True) #обновляем тип используемых кнопок btna1b1 = types.KeyboardButton(“Лига A1B1”) #cоздаем кнопку Лига A1B1 btna1b2 = types.KeyboardButton(“Лига A1B2”) #cоздаем кнопку Лига A1B2 back = types.KeyboardButton(“Вернуться в главное меню”) #cоздаем кнопку Вернуться в главное меню markup.add(btna1b1, btna1b2, back) #обновляем кнопки у пользователя bot.send_message(message.chat.id, text=”Футбол”, reply_markup=markup) #создаем текст для вывода при активации кнопки Футбол По такому же принципу задаем реакцию для нажатия на каждую из кнопок раздела меню — в зависимости от того, сколько нам их нужно.
Создание более сложного меню СКАЧАТЬ ИСХОДНЫЙ КОД
- Создать реакцию на кнопки подменю для каждой из категорий меню. По такому же принципу.
elif(message.text == “Лига A1B1”): #задаем реакцию на кнопку Лига A1B1 markup = types.ReplyKeyboardMarkup(resize_keyboard=True) #обновляем тип используемых кнопок btna1b1c1 = types.KeyboardButton(“Оффер A1B1С1”) #cоздаем кнопку Лига A1B1C1 btna1b2c2 = types.KeyboardButton(“Оффер A1B1С2”) #cоздаем кнопку Лига A1B1C2 back = types.KeyboardButton(“Вернуться в главное меню”) #cоздаем кнопку Вернуться в главное меню markup.add(btna1b1c1, btna1b1c2, back) #обновляем кнопки у пользователя bot.send_message(message.chat.id, text=”Лига A1B1″, reply_markup=markup) #создаем текст для вывода при активации кнопки Лига A1B1 СКАЧАТЬ ИСХОДНЫЙ КОД По такому же принципу задаем реакцию для нажатия на каждую из кнопок разделов подкатегорий меню — в зависимости от того, сколько нам их нужно.
- Создать реакцию на каждый оффер для каждого раздела из подкатегорий меню.
elif(message.text == “Оффер A1B1C1”): #задаем реакцию на кнопку Оффер A1B1C1 markup = types.InlineKeyboardMarkup() #обновляем тип используемых кнопок ОБРАТИТЕ ВНИМАНИЕ — ЗДЕСЬ УЖЕ ДРУГОЙ ТИП btn_my_site= types.InlineKeyboardButton(text=’Наш сайт’, url=’https://trafficcardinal.com’) #cоздаем кнопку со ссылкой markup.add(btn_my_site) #обновляем кнопки у пользователя bot.send_message(message.chat.id, “Нажми на кнопку и перейди на наш сайт.”, reply_markup = markup) #создаем текст для вывода при активации кнопки Оффер A1B1C1
Создание меню с несколькими уровнями вложений и инлайн-кнопкой для перехода по ссылке. Именно здесь можно уже не просто писать текст, а интегрировать полноценные креативы.
- При необходимости сделать большую глубину вложений — просто повторяйте шаги 2-3.
- Не забываем добавлять красоты, например, подойдут смайлики.
- Сохраняем изменения (совет — делайте это в отдельный файл).
- Загружаем новую логику работы бота на сайт.
СКАЧАТЬ ИСХОДНЫЙ КОД
Готовый Telegram-бот с меню
В конце статьи вы сможете скачать готовый бот с меню. К сожалению, код бота получился слишком длинным для того, чтобы размещать его в «теле» статьи. Правильно ли писать настолько длинный код под столь простую задачу с точки зрения алгоритмизации? Нет. И в следующей статье мы будет это исправлять, делая код более оптимальным и универсальным. Но мы с вами не программисты. Нам хватает чем еще заняться при сливе трафика, помимо изучения подобных тем. Поэтому наша задача — научиться создавать ботов с минимальными временными затратами, чтобы можно было «на коленке» собрать своего бота и начать заливать траф. А для этой цели код вполне сгодится.
Демонстрация оформления бота под беттинг Итак, что же может бот:
- Здороваться по имени пользователя при инициации команды /start.
- Перемещаться по навигационному меню на 4 вложения.
- Перемещаться «Вперед» и «Назад» между страницами меню.
- Возвращаться в главное меню с любого «этажа» вложенных подменю.
- Выводить инлайн-кнопку со ссылкой.
Демонстрация оформления бота под беттинг При ручном управлении этого более чем достаточно. Для того, чтобы привести бота в соответствующий вид, пригодный для выполнения задачи по сливу, необходимо лишь:
- Изменить текст в кавычках, описывающий кнопки, на нужный вам. Например, «А1» на «Футбол».
- Вместо ссылки на наш сайт вставить ссылки на продвигаемые вами офферы. Либо же на смартлинк.
- Вместо надписи «Нажми на кнопку и перейди на наш сайт» добавить ваши креативы, исходя из специфики офферов.
*Совет: Обращайте внимание на консоль сервера. Если вы случайно накосячите с кодом — она укажет вам, где именно ошибка. Даже лишний пробел может привести к тому, что бот не будет работать. СКАЧАТЬ ИСХОДНЫЙ КОД
Подводя итоги
Как видите, создать бота с кнопками не так уж и сложно. Пусть даже и приходится долго ковыряться с кодом. Не слишком удобно, не так ли? Мы такого же мнения. Именно поэтому статья и разбита на три части. Во второй части мы научим вас делать бота, код которого не придется ковырять, — достаточно будет лишь создать структуру меню в txt-файле. До скорой встречи, друзья!
Telegram — известный мессенджер с широким функционалом. Многие им пользуются для общения с друзьями, обмена фото-, видеоматериалами, постами и различным контентом. Площадка также позволяет создавать каналы и приглашать туда пользователей. Так образуется сообщество по интересам. Некоторые пользуются этим для продвижения товаров или услуг. Вероятно, вы замечали, что в некоторых каналах к посту прикреплены кнопки со ссылками или смайлики, на которые можно нажать и выразить свое мнение. В стандартном инструментарии такой функции нет, и многим интересно, как создать подобные клавиши. А делаются они при помощи специального бота, о чем и пойдет речь в статье.
Создание кнопки
Чтобы добавить кнопку в Телеграм на канале, необходимо подключить двух Telegram Bot (ботов). Один используется для создания постов, добавления канала и отслеживания статистики. Он называется @ControllerBot. Второй бот, @BotFather — чисто для постинга. С их же помощью создаются кнопки-реакции, и занимает это от силы 5 минут.
Добавление бота на канал
Инструкция:
- Откройте мессенджер, затем в строку «Поиск» впишите название бота — @ControllerBot. Имя должно совпадать, так как выбивает несколько вариантов, где может быть добавлен дополнительный символ.
- Кликните по имени бота, открыв тем самым диалог с ним. Напишите в чате /start или нажмите на одноименную кнопку в диалоговом окне.
- Бот автоматически отправит сообщение со списком доступных команд. Как добавить канал — для начала щелкните по ссылке /addchannel.
- Теперь жмите «Подключить новый бот».
- Увидите сообщение с дальнейшей инструкцией. Следуя ей, щелкните по @BotFather.
- Откроется новый чат, уже с другим ботом. Напишите /start или кликните по одноименной кнопке.
- Напишите /newbot или выберите команду из списка (она будет первой).
- Далее необходимо как-то назвать бота. Впишите его логин и добавьте в конце «_bot». На примере выглядит это так: QubInfo_bot. Отправьте сообщение.
- BotFather ответит, мол все удачно. Остается переслать это сообщение ControllerBot. Если пользуетесь смартфоном, зажмите палец на сообщении, выберите в контекстном меню «Переслать» и кликните по иконке нужного бота. Если сидите с компьютера, щелкните правой кнопкой мышки по сообщению и выберите в меню «Переслать сообщение», затем укажите кому. На картинке показано, что надо пересылать (ответ BotFather).
Вы узнали, как создать бота для канала, остается его правильно настроить.
Настройка бота
Тут тоже ничего сложного:
- Нужно только что созданного бота сделать администратором канала. Для начала скопируйте его имя.
- Зайдите в свой канал. Там кликните по кнопке меню в виде трех точек и выберите «Управление каналом».
- Откроется окно «Редактировать канал». Щелкните по пункту «Администраторы».
- В строку поиска впишите логин недавно созданного бота и выберите его из списка. Для подтверждения назначения его администратором жмите «OK».
- Дайте ему права, как показано на картинке.
- Будучи на своем канале, напишите любое сообщение и перешлите его ControllerBot.
- Выскочит уведомление об успешном подключении канала. В чате с ControllerBot необходимо выбрать часовой пояс, для этого впишите название своего города и щелкните «Верно».
На этом настройка завершена. Переходим к самому интересному — как сделать кнопку к посту в Телеграмме. Для этого научимся пользоваться ботом, который служит инструментом.
Инструкция по использованию
Опять же, все просто:
- Откройте диалог с созданным и настроенным ботом, где кликните «Запустить». Можете пользоваться командой /start, как удобно.
- Жмите «Создать пост» и выберите, на каком канале он будет опубликован.
- Теперь сформируйте составляющие публикации. Порядок должен быть следующим: текст, картинка, реакции, кнопки (они же гиперссылки).
- Чтобы загрузить изображение, кликните «Прикрепить медиафайл» и выберите нужный с телефона или ПК.
- Добавить реакции тоже несложно. Делается это соответствующей кнопкой, после чего остается отправить эмодзи придерживаясь рекомендаций. Для разделения реакций используйте знак «/». Рядом со смайликом пишите нужный текст. В посту должно быть не более шести смайлов.
- Кнопки-ссылки устанавливаются инструментом «Добавить URL-кнопки». Бот подскажет, как и что писать. Если вкратце, то выглядит это так: «Кнопка 1 — ссылка на сайт (http://example.com). Чтобы поставить кнопки в один ряд (не более трех), используется разделитель — символ «|». То, что получилось — отправьте боту, чтобы посмотреть, как будет выглядеть результат.
Не стоит забывать и о других функциях, например, «Таймер удаления». Этот инструмент позволяет создать временный пост, который будет удален по истечении конкретного времени.
Чтобы выложить подготовленный пост на канал, жмите «Опубликовать». Если желаете настроить время публикации, кликните «Отложить».
Делаем кнопку «Поделиться»
Конечно, она есть по умолчанию (в виде стрелочки), но такая незаметная, что многие пользователи вообще не обращают на нее внимания. Есть вариант создать отдельную кнопку к посту.
Для начала создайте ссылку:
- Откройте нужный канал и скопируйте ссылку на последний пост.
- На примере она будет выглядеть так: https://t.me/tg_adminpro/210. Цифра «210» — номер поста на канале. Соответственно, если кнопка «Поделиться» создается для нового, то и цифру придется менять на «211».
Создаем кнопку:
- Запустите @Tgshare_bot.
- Перекиньте ему ссылку на будущий пост, к которому делается кнопка «Поделиться». В ответ бот сгенерирует готовую ссылку.
- Скопируйте ее и используйте в ходе создания кнопки через @ControllerBot. Подписать ее можно по-разному, например, «Поделиться» или «Рассказать друзьям».
Заключение
Как видно, кнопки-реакции и гиперссылки в Телеграмме создаются не так сложно, как это кажется на первый взгляд. Просто не все знают, что для этого используются боты. А работать с ними просто, тем более есть встроенные подсказки. Все действия по созданию кнопок можно делать с мобильного клиента и с компьютера.
ли со статьей или есть что добавить?