В предыдущей части был написан бот, который по заданному имени или части имени находит подходящие и показывает пользователю в отдельных сообщениях.
В этот раз немного улучшим его: улучшим форматирование, добавим inline-режим и реализуем пару команд.
Улучшаем форматирование
Скажу сразу, что Telegram умеет в HTML и Markdown. Но, к сожалению, очень ограничено: если посмотреть документацию, то поддерживается только полужирное начертание, курсив, моноширинный шрифт и ссылки:
*полужирный* _курсив_ [ссылка](http://www.example.com/) `строчный моноширинный` «`text блочный моноширинный (можно писать код) «`
полужирный, полужирный курсив ссылка строчный моноширинный блочный моноширинный (можно писать код)
Лично мне больше по душе Markdown.
К счастью, библиотека, которую я использую для разработки бота так же умеет в HTML и Markdown.
Немного улучшим наши сообщения:
- Название заклинания будем отображать полужирным
- Курсивом добавим информацию про уровень заклинания, школу, класс, время действия и прочее
- Описание заклинания оставим обычным текстом
То есть сообщение будет выглядеть (в исходном виде) примерно так:
How To Make Comment Button To Your Telegram Post | Telegram bot
*Alter Self* *Level* _2_ *School* _T_ *Time* _1 action_ *Range* _Self_ *Components* _V, S_ *Duration* _Concentration, up to 1 hour_ *Classes* _Sorcerer, Wizard_ *Roll* _1d6+1_ You assume a different form. When you cast the spell, choose one of the following options, the effects of which last for the duration of the spell. While the spell lasts, you can end one option as an action to gain the benefits of a different one. Aquatic Adaptation: You adapt your body to an aquatic environment, sprouting gills, and growing webbing between your fingers. You can breathe underwater and gain a swimming speed equal to your walking speed.
Change Appearance: You transform your appearance. You decide what you look like, including your height, weight, facial features, sound of your voice, hair length, coloration, and distinguishing characteristics, if any. You can make yourself appear as a member of another race, though none of your statistics change. You also don’t appear as a creature of a different size than you, and your basic shape stays the same, if you’re bipedal, you can’t use this spell to become quadrupedal, for instance. At any time for the duration of the spell, you can use your action to change your appearance in this way again.
Natural Weapons: You grow claws, fangs, spines, horns, or a different natural weapon of your choice. Your unarmed strikes deal 1d6 bludgeoning, piercing, or slashing damage, as appropriate to the natural weapon you chose, and you are proficient with you unarmed strikes. Finally, the natural weapon is magic and you have a +1 bonus to the attack and damage rolls you make using it.
В общем — ничего сложного, правда?
Для того, чтобы отправить сообщение в Markdown-формате необходимо сказать об этом telegram-у при помощи свойства ParseMode структуры MessageConfig :
text := fmt.Sprintf( «*%s*n» + «*Level* _%v_n» + «*School* _%s_n» + «*Time* _%s_n» + «*Range* _%s_n» + «*Components* _%s_n» + «*Duration* _%s_n» + «*Classes* _%s_n» + «*Roll* _%s_n» + «%s», spell.Name, spell.Level, spell.School, spell.Time, spell.Range, spell.Components, spell.Duration, spell.Classes, strings.Join(spell.Rolls, «, «), strings.Join(spell.Texts, «n»)) msg := tgbotapi.NewMessage(update.Message.Chat.ID, text) msg.ParseMode = «markdown» bot.Send(msg)
Можно немного упороться и сделать дополнительную предобработку: вместо школы или компонент выводить текстовое название школы и компоненты, но оставим это на самостоятельное изучение — сейчас можно обойтись без этого.
Как мне кажется, выглядит довольно пристойно:
inline боты
Я не буду рассказывать что это такое — можете посмотреть в документации. Вкратце — это штука позволяет обращаться к боту из любого чата telegram и отправить ответ бота в этот чат (или в приватный чат — если это реализовано в боте).
Для реализации этой функциональности в telegram-bot-api уже есть нужная функция: NewInlineQueryResultArticleMarkdown принимающая три параметра:
- id — идентификатор сообщения (толком не понял, для чего используется)
- title — текст, который будет отображаться в выпадающем списке
- messageText — ответ бота, если пользователь нажмёт на этот элемент списка.
Сделаем так: если в inline режиме что-то пишут боту — считаем это имя заклинания и находим всё подходящие и их описания. Далее отправляем весь список подходящих заклинаний и ждём действий пользователя.
Но для начала необходимо изменить код, который обрабатывает получение новых обновлений от telegram: при получении inline сообщения свойство update.Message не будет означено, вместо него будет получено update.InlineQuery и это необходим корректно обрабатывать:
if update.Message == nil update.InlineQuery != nil < // код для inline режима >else < // код для «обычного» режима >
ОК, добавим обработку inline сообщений:
query := update.InlineQuery.Query filteredSpells := Filter(spells.Spells, func(spell Spell) bool < return strings.Index(strings.ToLower(spell.Name), strings.ToLower(query)) >= 0 >) var articles []interface<> if len(filteredSpells) == 0 < msg := tgbotapi.NewInlineQueryResultArticleMarkdown(update.InlineQuery.ID, «No one spells matches», «No one spells matches») articles = append(articles, msg) >else < var i = 0 // добавим счётчик заклинаний, чтобы не показывать больше 10 for _, spell := range(filteredSpells) < text := fmt.Sprintf( «*%s*n» + «*Level* _%v_n» + «*School* _%s_n» + «*Time* _%s_n» + «*Range* _%s_n» + «*Components* _%s_n» + «*Duration* _%s_n» + «*Classes* _%s_n» + «*Roll* _%s_n» + «%s», spell.Name, spell.Level, spell.School, spell.Time, spell.Range, spell.Components, spell.Duration, spell.Classes, strings.Join(spell.Rolls, «, «), strings.Join(spell.Texts, «n»)) msg := tgbotapi.NewInlineQueryResultArticleMarkdown(spell.Name, spell.Name, text) articles = append(articles, msg) if i >= 10 < break >> > inlineConfig := tgbotapi.InlineConfig < InlineQueryID: update.InlineQuery.ID, IsPersonal: true, CacheTime: 0, Results: articles, >_, err := bot.AnswerInlineQuery(inlineConfig) if err != nil
- Вводим команду /setinline
- Выбираем DndSpellsBot
- Пишем сообщение, которое будет отображаться в качестве подсказки
Снова запустим бота и попробуем обратиться к нему:
Похоже, всё работает как надо.
Осталось добавить команды
Команды
Команда — особо сформированное сообщение боту. Всегда начинаются с / и длиной не более 32 символов. Имеют следующий вид:
/command [optional] [argument]
Добавим боту возможность фильтрации заклинаний только для определённого класса. Для этого будем использовать команду /setclass .
Имя класса будем выбирать на inline-клавиатуре.
Во-вторых, необходимо в логике бота отличать команду от обычного сообщения. telegram-bot-api так же позволяет делать это довольно просто при помощи метода Command() входящего сообщения:
// Если сообщение — не команда, то Command() будет пустой строкой, // иначе — текст команды command := update.Message.Command() if command == «» < // Здесь логика для «обычных» сообщений >else < // Здесь — для команд >
Можно сделать просто — параметром к команде передавать имя класса. А можно воспользоваться возможностями мессенджера и показать пользователю список доступных классов в виде кнопок:
Сделать это несложно (когда знаешь как делать):
switch command < case «setclass»: msg := tgbotapi.NewMessage(update.Message.Chat.ID, «Select your class») keyboard := tgbotapi.InlineKeyboardMarkup<>for _, class := range classes < var row []tgbotapi.InlineKeyboardButton btn := tgbotapi.NewInlineKeyboardButtonData(class, class) row = append(row, btn) keyboard.InlineKeyboard = append(keyboard.InlineKeyboard, row) >msg.ReplyMarkup = keyboard bot.Send(msg) >
В-третьих — запомним, по идентификатору пользователя, что он хочет получать заклинания для выбранного класса (для простоты — создадим map[int]string):
// Перед функцие main добави наш словарь var classesMap map[int]string
В цикле обработки обновлений чата добавим обработку когда update.Message не означен, но есть update.CallbackQuery — ответ от inline-клавиатуры:
if update.CallbackQuery != nil
И, в-четвертых, нам необходимо учитывать этот класс в наших запросах на поиск заклинаний:
filteredSpells := Filter(spells.Spells, func(spell Spell) bool < class, ok := classesMap[update.Message.From.ID] classCond := true if ok < classCond = strings.Index(strings.ToLower(spell.Classes), strings.ToLower(class)) >= 0 > return strings.Index(strings.ToLower(spell.Name), strings.ToLower(query)) >= 0 classCond >)
Команду для очистки класса оставим на самостоятельную реализацию
Полный исходный код можно найти на bitbucket.
Источник: ashirobokov.wordpress.com
Реклама в Comments Bot: факты и комментарии
Расскажу об опыте размещения рекламы телеграм-канала с помощью бота для комментариев. Объективно и скучно.
Привет! Я Роман, автор телеграм-канала
Что это?
Как, наверное, всем известно, Comments Bot даёт возможность прикрутить комментарии к посту в телеграм. При нажатии на кнопку «Open Comments» происходит перенаправление на соответствующую посту страничку сайта бота, где можно оставить своё очень важное мнение. На этой же странице есть отдельный блок, в котором размещается реклама каналов.
Как заявляют создатели, аудитория бота – активные русскоязычные подписчики популярных телеграм-каналов, при том, что всего в России мессенджером
Запускаем рекламу
Запустить рекламную кампанию достаточно просто любому, кто имеет на руке хотя бы один палец. После ввода команды /start в окне диалога с ботом, пользователь автоматически получает личный кабинет.
Для создания объявления надо прислать боту юзернейм канала и составить его описание в одну строку. Загвоздка в том, что рекламный текст должен уместиться в 70 символов, при этом запрещены любые смайлы Так как я не гений маркетинга и не умею создавать цепляющие слоганы, составил простой и правдивый текст:
Другой недостаток – невозможность узнать, сколько просмотров конвертировалось в подписчиков канала. Как подсказывает сервис Telegram Analytics , на момент начала кампании (22 июня) у меня было 62 подписчика, а к окончанию рекламных показов их количество увеличилось на треть. И я не знаю, сколько людей из числа тех несчастных, кто кликнул по ссылке, стали моими подписчиками.
К слову, во время кампании я не сидел сложа руки, а активно продвигал свой канал среди знакомых, а также в чатах. И есть уверенность, что большая часть пришедших – те, кто подписались на канал по моей просьбе, или же благодаря «сарафанному радио».
Ещё один минус рекламы в Comments Bot – отсутствует возможность настройки кампании. Алгоритм выдачи объявлений неизвестен, их нельзя ускорить или настроить время показа. В итоге время моей кампании растянулось на долгие и мучительные 22 дня – более чем три недели!
Резюме
Путём несложных вычислений выходит, что за один рекламной кампании день я получал чуть больше, чем 900 показов, около 4 кликов, и – в теории – одного подписчика. Как оно было на практике, история умалчивает.
В целом, ожидания не оправдались. Статистика получилась слабая – за один клик по объявлению я заплатил 11,7 рубля, а каждый подписчик обошёлся мне в почти 52 рубля. За эту цену можно купить, к примеру, доширак и ещё останется немного. Конечно, такой способ рекламы каналов имеет право на жизнь, но не как главный, а в качестве подспорья к другим методам.
Скорее всего, даже заплатив сотню-другую рублей каналу с рецептами за место в подборке, вы получите намного больший выхлоп. Ну а если вам некуда девать ваши 1140 рублей – можете просто отдать их мне. Вам будет приятно, а я потрачу их с куда большей пользой.
Источник: se7en.ws
Telegram bot кнопки — Делаем робота в Telegram
Доброго времени дня и ночи, мой дорогой читатель. Пожалуй, мне бы стоило поздравить тебя с наступившим новым годом, но нет, прости, я не особо склонен ко всякого рода поздравлением. Не будем отходить от темы — полгода назад я написал статью о том, как создать своего самого первого робота в Telegram на Python3 и запустить его.
С тех пор прошло довольно много времени, несколько раз обновлялся Telegram Bot API, и сегодня я решил продолжить свой рассказ о создании своего робота.
Вступление
Для начала немного информации для общего развития — о том, что такое клавиатура в боте и для чего она нужна.
Когда мы впервые запускаем любого бота, мы используем кнопку Start (Запуск), затем можем продолжить общение с ботом посредством команд или любых других текстовых сообщений.
По правде гениальные разработчики Telegram решили пойти дальше и предложили создателям ботов использовать так называемые клавиатуры для роботов — эти клавиатуры заменяют обычные текстовые устройства ввода на телефонах и отображаются под полем для ввода сообщения.
Что происходит, когда мы нажимаем кнопки под полем для ввода сообщения? Ничего сложного — лишь отправляется тот текст, который мы видим на кнопке. То есть нажатие на Настройки приведёт к отправке сообщения с текстом Настройки от твоего имени к боту и только.
Далее робот просто обрабатывает полученный им текст. Никакой магии. Знаю по своему опыту, что очень любят код (вру, не все) — поэтому сейчас мы приступим к его написанию.
Полагаю, прочитав мою предыдущую запись, ты сможешь установить и настроить Python3, а также создать самого простого бота, отвечающего на команду /start .
Пишем код
Создадим простого бота, который при запуске будет здороваться с пользователем. Кода, как на картинке ниже, будет вполне достаточно:
Теперь определимся с тем, что будет делать наш робот.
Сделаем так: сразу после запуска бот должен отобразить пользователю клавиатуру с двумя кнопками — Шерлок Холмс и Доктор Ватсон .
Отправимся в функцию start нашего простого бота и изменим её следующим образом:
Помимо всего прочего нужно добавить from telebot import types в начало нашего файла с роботом.
Теперь объясню, что вообще здесь происходит ?
- С помощью types.ReplyKeyboardMarkup() мы создаём объект нашей будущей клавиатуры, в скобках прописываются нужные параметры. resize_keyboard=True позволяет клавиатуре растягиваться на необходимую высоту вместо того, чтобы занимать всё пространство.
- С помощью .add() мы добавляем кнопки в нашу клавиатуру. types.KeyboardButton() представляет собой объект самой кнопки, а в скобках указывается текст на ней. В коде выше я наполняю объект нашей клавиатуры объектами кнопок, заполняя их из списка [‘Шерлок Холмс’, ‘Доктор Ватсон’] (полагаю, меня крайне сложно понять сейчас, это нормально, советую прочитать статью про списки и for ).
- Последнее, что нужно сделать — привязать нашу клавиатуру к нужному сообщению, делается это при помощи параметра reply_markup в любом методе send_. .
Можно сохранить код и запустить робота.
Как видно, под полем для текста появились две заветные кнопки. Что дальше? Теперь нужно научить нашего робота обрабатывать сообщения, отправляемые ему после нажатия на кнопки.
Рассмотрим мой код выше. В функции start мы используем метод register_next_step_handler для того, чтобы следующее сообщение от нашего пользователя сразу попало бы в обработчик name (который указан вторым параметром; первый — объект отправленного нами сообщения).
В функции name мы обработаем ответ пользователя — отправим сообщения о Шерлоке Холмсе и Докторе Ватсоне.
На картинке выше я добавил сообщения, которые будут отправляться пользователю после нажатия на любую из кнопок.
Сохраним файл с нашим роботом и запустим его, не забыв заново отправить команду /start (старые кнопки уже не сработают).
Вот так бот ответит нам на нажатие на кнопку. Но замечу, что повторное нажатие ни к чему не приведет, поскольку только после команды /start бот будет проверять текст сообщения на наличие Шерлока Холмса и Доктора Ватсона.
Подведём итог: клавиатуры позволяют отправлять целые сообщения по одному лишь нажатию пользователя. В кнопки можно записывать любые текстовые фразы, даже содержащие в себе Emoji. ?
После отправки бот должен обработать полученную фразу, причем неважно, как именно.
Отмечу, что у пользователя всегда есть остаётся возможность отправить сообщение при помощи обычной клавиатуры.
Ещё хочу добавить, что для объекта кнопки есть два интересных параметра, принимающих логические значения — request_contact и request_location . Первый запрашивает телефонный номер пользователя, а второй его местоположение. Узнать больше о параметрах и возможностях клавиатуры можно в официальной документации Telegram Bot API. Думаю, на этом часть с клавиатурами можно закончить.
Inline-режим
Так называемый Inline-режим появился у роботов в апреле прошлого года. Предлагаю для начала рассмотреть суть его работы. ?
Есть два варианта использования Inline: первый — в самом боте , в сообщениях, отправляемых ботом; второй — вне бота , где-нибудь в произвольном чате, начав набирать логин бота в поле для текстового сообщения.
Сегодня я хочу рассказать про первый вариант Inline-режима. С помощью него можно прикреплять Inline-кнопки к сообщениям, которые отправляются ботом.
То есть под каждым сообщением могут быть различные кнопки, выполняющие самую разнообразную работу. Например, в популярных каналах нередко используют лайки, реализованные как раз при помощи Inline-кнопок.
Inline-кнопки прикрепляются к сообщениям точно так же, как это делают клавиатуры. Отличаются лишь названия и параметры методов.
Внесем некоторые изменения в наш код. Теперь нашей целью будет отредактировать сообщение после нажатия на кнопку.
Да-да, Inline-кнопки способны редактировать уже отправленные нашим роботом сообщения. ?
По порядку рассказываю, что здесь творится. ?
Сохраним наш код и запустим робота. Отправим команду /start и попробуем нажать на любую из кнопок.
Как видно, текст сообщения от бота изменился после нажатия на кнопку.
Вместо callback_data можно также указать url — любой URL адрес; по нажатию на такую кнопку пользователь перейдёт в браузер.
На самом деле Inline-кнопки способны почти на всё — с помощью них можно даже отправлять обычные сообщения. Все функции и возможности описаны в Telegram Bot API. Пожалуй, это всё, что я хотел рассказать тебе о первых шагах в Inline.
А теперь небольшой подарок для всех читателей моего блога — ниже я оставлю код и описание простого бота, с помощью которого можно читать книгу в формате .txt в одном-единственном сообщении ?
Робот для чтения книги ?
По команде /start этот робот отправляет первую страницу — на каждой странице по 700 символов из книги.
С помощью стрелок ⬅️ и ➡️ можно листать страницы — текст сообщения будет изменяться вырезками по 700 символов.
Ниже я оставляю тебе код этого бота — чтобы запустить, достаточно положить рядом с ботом любую книгу в формате .txt
Источник: messagu.ru