Bot telegram golang: Как я Telegram бота на Go писал. Часть вторая. Прокачиваем бота. — i can do some code
Как я Telegram бота на Go писал. Часть вторая. Прокачиваем бота. — i can do some code
В предыдущей части был написан бот, который по заданному имени или части имени находит подходящие и показывает пользователю в отдельных сообщениях.
В этот раз немного улучшим его: улучшим форматирование, добавим inline-режим и реализуем пару команд.
Скажу сразу, что Telegram умеет в HTML и Markdown. Но, к сожалению, очень ограничено: если посмотреть документацию, то поддерживается только полужирное начертание, курсив, моноширинный шрифт и ссылки:
Markdown:
*полужирный*
_курсив_
[ссылка](http://www.example.com/)
`строчный моноширинный`
```text
блочный моноширинный (можно писать код)
```
HTML:
<b>полужирный</b>, <strong>полужирный</strong> <i>курсив</i>
<a href="http://www.example.com/">
ссылка</a><code>строчный моноширинный</code>
<pre>блочный моноширинный (можно писать код)</pre>
Лично мне больше по душе Markdown.
К счастью, библиотека, которую я использую для разработки бота так же умеет в HTML и Markdown.
Немного улучшим наши сообщения:
- Название заклинания будем отображать полужирным
- Курсивом добавим информацию про уровень заклинания, школу, класс, время действия и прочее
- Описание заклинания оставим обычным текстом
То есть сообщение будет выглядеть (в исходном виде) примерно так:
*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)
Можно немного упороться и сделать дополнительную предобработку: вместо школы или компонент выводить текстовое название школы и компоненты, но оставим это на самостоятельное изучение — сейчас можно обойтись без этого.
Как мне кажется, выглядит довольно пристойно:
Я не буду рассказывать что это такое — можете посмотреть в документации. Вкратце — это штука позволяет обращаться к боту из любого чата 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 { log.Println(err) }
Запускаем бота, пишем ему @dndspellsbot friendship
и ничего не происходит. Потому что необходимо договориться об inline боте с @BotFather: идём в чатик с ним и делаем следующее:
- Вводим команду
/setinline
- Выбираем DndSpellsBot
- Пишем сообщение, которое будет отображаться в качестве подсказки
Снова запустим бота и попробуем обратиться к нему:
Похоже, всё работает как надо.
Осталось добавить команды
Команда — особо сформированное сообщение боту. Всегда начинаются с /
и длиной не более 32 символов. Имеют следующий вид:
/command [optional] [argument]
Подробнее можно посмотреть в документации.
Добавим боту возможность фильтрации заклинаний только для определённого класса. Для этого будем использовать команду /setclass
.
Имя класса будем выбирать на inline-клавиатуре.
Во-первых, необходимо сказать @BotFather-у, что бот умеет принимать команды отправив ему команду /setcommands
. @BotFather предложит описать команды и на этом пока всё:
Во-вторых, необходимо в логике бота отличать команду от обычного сообщения. 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 { class := update.CallbackQuery.Data classesMap[update.CallbackQuery.From.ID] = class bot.Send(tgbotapi.NewMessage(update.CallbackQuery.Message.Chat.ID, "Ok, I remember")) }
И, в-четвертых, нам необходимо учитывать этот класс в наших запросах на поиск заклинаний:
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.
Понравилось это:
Нравится Загрузка. ..
Справочник по Telegram Bot API
getUpdates
Этот метод используется для получения обновлений через long polling (wiki). Ответ возвращается в виде массива объектов Update.
Параметры | Тип | Обязательный | Описание |
---|---|---|---|
offset | Integer | Необязательный | Identifier of the first update to be returned. Must be greater by one than the highest among the identifiers of previously received updates. By default, updates starting with the earliest unconfirmed update are returned. An update is considered confirmed as soon as getUpdates is called with an offset higher than its update_id. The negative offset can be specified to retrieve updates starting from -offset update from the end of the updates queue. All previous updates will forgotten. |
limit | Integer | Необязательный | Limits the number of updates to be retrieved. Values between 1—100 are accepted. Defaults to 100. |
timeout | Integer | Необязательный | Timeout in seconds for long polling. Defaults to 0, i.e. usual short polling |
Примечание:
- Этот метод не будет работать, если у вас уже подключен webhook.
- Во избежания повторяющихся обновлений, рекомендуется высчитывать offset каждый раз заново.
setWebhook
Этот метод необходим для задания URL вебхука, на который бот будет отправлять обновления. Каждый раз при получении обновления на этот адрес будет отправлен HTTPS POST с сериализованным в JSON объектом Update. При неудачном запросе к вашему серверу попытка будет повторена умеренное число раз.
Для большей безопасности рекомендуется включить токен в URL вебхука, например, так: https://yourwebhookserver.com/<token>
. Так как никто посторонний не знает вашего токена, вы можете быть уверены, что запросы к вашему вебхуку шлёт именно Telegram.
Параметры | Тип | Обязательный | Описание |
url | String | Нет | HTTPS url для отправки запросов. Чтобы удалить вебхук, отправьте пустую строку. |
certificate | InputFile | Нет | Загрузка публичного ключа для проверки корневого сертификата. Подробнее в разделе про самоподписанные сертификаты. |
Примечание:
- При подключенном и настроенном вебхуке метод getUpdates не будет работать.
- При использовании самоподписанного сертификата, вам необходимо загрузить публичный ключ с помощью параметра
certificate
.- На текущий момент отправка обновлений через вебхуки доступна только на эти порты: 443, 80, 88, 8443.
getWebhookInfo
Содержит информацию о текущем состоянии вебхука.
Поле | Тип | Описание |
url | String | URL вебхука, может быть пустым |
has_custom_certificate | Boolean | True, если вебхук использует самозаверенный сертификат |
pending_update_count | Integer | Количество обновлений, ожидающих доставки |
last_error_date | Integer | Опционально. Unix-время самой последней ошибки доставки обновления на указанный вебхук |
last_error_message | String | Опционально. Описание в человекочитаемом формате последней ошибки доставки обновления на указанный вебхук |
Доступные типы
Все типы, использующиеся в Bot API, являются JSON-объектами.
Для хранения всех полей типа Integer безопасно использовать 32-битные знаковые целые числа, если не указано иначе.
Необязательные поля могут быть опущены в ответе, если они не относятся к ответу.
User
Этот объект представляет бота или пользователя Telegram.
Поле | Тип | Описание |
id | Integer | Уникальный идентификатор пользователя или бота |
first_name | String | Имя бота или пользователя |
last_name | String | Опционально. Фамилия бота или пользователя |
username | String | Опционально. Username пользователя или бота |
Chat
Этот объект представляет собой чат.
Поле | Тип | Описание |
id | Integer | Уникальный идентификатор чата. Абсолютное значение не превышает 1e13 |
type | Enum | Тип чата: “private”, “group”, “supergroup” или “channel” |
title | String | Опционально. Название, для каналов или групп |
username | String | Опционально. Username, для чатов и некоторых каналов |
first_name | String | Опционально. Имя собеседника в чате |
last_name | String | Опционально. Фамилия собеседника в чате |
all_members_are_administrators | Boolean | Опционально.True, если все участники чата являются администраторами |
Message
Этот объект представляет собой сообщение.
Поле | Тип | Описание |
message_id | Integer | Уникальный идентификатор сообщения |
from | User | Опционально. Отправитель. Может быть пустым в каналах. |
date | Integer | Дата отправки сообщения (Unix time) |
chat | Chat | Диалог, в котором было отправлено сообщение |
forward_from | User | Опционально. Для пересланных сообщений: отправитель оригинального сообщения |
forward_date | Integer | Опционально. Для пересланных сообщений: дата отправки оригинального сообщения |
reply_to_message | Message | Опционально. Для ответов: оригинальное сообщение. Note that the Message object in this field will not contain further reply_to_message fields even if it itself is a reply. |
text | String | Опционально. Для текстовых сообщений: текст сообщения, 0-4096 символов |
entities | Массив из MessageEntity | Опционально. Для текстовых сообщений: особые сущности в тексте сообщения. |
audio | Audio | Опционально. Информация об аудиофайле |
document | Document | Опционально. Информация о файле |
photo | Массив из PhotoSize | Опционально. Доступные размеры фото |
sticker | Sticker | Опционально. Информация о стикере |
video | Video | Опционально. Информация о видеозаписи |
voice | Voice | Опционально. Информация о голосовом сообщении |
caption | String | Опционально. Подпись к файлу, фото или видео, 0-200 символов |
contact | Contact | Опционально. Информация об отправленном контакте |
location | Location | Опционально. Информация о местоположении |
venue | Venue | Опционально. Информация о месте на карте |
new_chat_member | User | Опционально. Информация о пользователе, добавленном в группу |
left_chat_member | User | Опционально. Информация о пользователе, удалённом из группы |
new_chat_title | String | Опционально. Название группы было изменено на это поле |
new_chat_photo | Массив из PhotoSize | Опционально. Фото группы было изменено на это поле |
delete_chat_photo | True | Опционально. Сервисное сообщение: фото группы было удалено |
group_chat_created | True | Опционально. Сервисное сообщение: группа создана |
supergroup_chat_created | True | Опционально. Сервисное сообщение: супергруппа создана |
channel_chat_created | True | Опционально. Сервисное сообщение: канал создан |
migrate_to_chat_id | Integer | Опционально. Группа была преобразована в супергруппу с указанным идентификатором. Не превышает 1e13 |
migrate_from_chat_id | Integer | Опционально. Cупергруппа была создана из группы с указанным идентификатором. Не превышает 1e13 |
pinned_message | Message | Опционально. Указанное сообщение было прикреплено. Note that the Message object in this field will not contain further reply_to_message fields even if it is itself a reply. |
MessageEntity
Этот объект представляет одну из особых сущностей в текстовом сообщении. Например: хештеги, имена пользователей, ссылки итд.
Поле | Тип | Описание |
type | String | Type of the entity. One of mention (@username ), hashtag, bot_command, url, email, bold (bold text), italic (italic text), code (monowidth string), pre (monowidth block), text_link (for clickable text URLs) |
offset | Integer | Offset in UTF-16 code units to the start of the entity |
length | Integer | Length of the entity in UTF-16 code units |
url | String | Опционально. For “text_link” only, url that will be opened after user taps on the text |
PhotoSize
Этот объект представляет изображение определённого размера или превью файла / стикера.
Поле | Тип | Описание |
file_id | String | Уникальный идентификатор файла |
width | Integer | Photo width |
height | Integer | Photo height |
file_size | Integer | Опционально. Размер файла |
Audio
Этот объект представляет аудиозапись, которую клиенты Telegram воспинимают как музыкальный трек.
Поле | Тип | Описание |
file_id | String | Уникальный идентификатор файла |
duration | Integer | Duration of the audio in seconds as defined by sender |
performer | String | Опционально. Performer of the audio as defined by sender or by audio tags |
title | String | Опционально. Title of the audio as defined by sender or by audio tags |
mime_type | String | Опционально. MIME файла, заданный отправителем |
file_size | Integer | Опционально. Размер файла |
Document
Этот объект представляет файл, не являющийся фотографией, голосовым сообщением или аудиозаписью.
Поле | Тип | Описание |
file_id | String | Unique file identifier |
thumb | PhotoSize | Опционально. Document thumbnail as defined by sender |
file_name | String | Опционально. Original filename as defined by sender |
mime_type | String | Опционально. MIME файла, заданный отправителем |
file_size | Integer | Опционально. Размер файла |
Sticker
Этот объект представляет стикер.
Поле | Тип | Описание |
file_id | String | Уникальный идентификатор файла |
width | Integer | Ширина стикера |
height | Integer | Высота стикера |
thumb | PhotoSize | Опционально. Превью стикера в формате .webp или .jpg |
file_size | Integer | Опционально. Размер файла |
Video
Этот объект представляет видеозапись.
Поле | Тип | Описание |
file_id | String | Уникальный идентификатор файла |
width | Integer | Ширина видео, заданная отправителем |
height | Integer | Высота видео, заданная отправителем |
duration | Integer | Продолжительность видео, заданная отправителем |
thumb | PhotoSize | Опционально. Превью видео |
mime_type | String | Опционально. MIME файла, заданный отправителем |
file_size | Integer | Опционально. Размер файла |
Voice
Этот объект представляет голосовое сообщение.
Поле | Тип | Описание |
file_id | String | Уникальный идентификатор файла |
duration | Integer | Продолжительность аудиофайла, заданная отправителем |
mime_type | String | Опционально. MIME-тип файла, заданный отправителем |
file_size | Integer | Опционально. Размер файла |
Contact
Этот объект представляет контакт с номером телефона.
Поле | Тип | Описание |
phone_number | String | Номер телефона |
first_name | String | Имя |
last_name | String | Опционально. Фамилия |
user_id | Integer | Опционально. Идентификатор пользователя в Telegram |
Location
Этот объект представляет точку на карте.
Поле | Тип | Описание |
longitude | Float | Долгота, заданная отправителем |
latitude | Float | Широта, заданная отправителем |
Venue
Этот объект представляет объект на карте.
Поле | Тип | Описание |
location | Location | Координаты объекта |
title | String | Название объекта |
address | String | Адрес объекта |
foursquare_id | String | Опционально. Идентификатор объекта в Foursquare |
UserProfilePhotos
Этот объект содержит фотографии профиля пользователя.
Поле | Тип | Описание |
total_count | Integer | Общее число доступных фотографий профиля |
photos | Массив массивов с объектами PhotoSize | Запрошенные изображения, каждое в 4 разных размерах. |
File
Этот объект представляет файл, готовый к загрузке. Он может быть скачан по ссылке вида https://api.telegram.org/file/bot<token>/<file_path>
. Ссылка будет действительна как минимум в течение 1 часа. По истечении этого срока она может быть запрошена заново с помощью метода getFile.
Максимальный размер файла для скачивания — 20 МБ
Поле | Тип | Описание |
file_id | String | Уникальный идентификатор файла |
file_size | Integer | Опционально. Размер файла, если известен |
file_path | String | Опционально. Расположение файла. Для скачивания воспользуйтейсь ссылкой вида https://api.telegram.org/file/bot<token>/<file_path> |
ReplyKeyboardMarkup
Этот объект представляет клавиатуру с опциями ответа (см. описание ботов).
Поле | Тип | Описание |
keyboard | Массив массивов с KeyboardButton | Массив рядов кнопок, каждый из которых является массивом объектов KeyboardButton |
resize_keyboard | Boolean | Опционально. Указывает клиенту подогнать высоту клавиатуры под количество кнопок (сделать её меньше, если кнопок мало). По умолчанию False , то есть клавиатура всегда такого же размера, как и стандартная клавиатура устройства. |
one_time_keyboard | Boolean | Опционально. Указывает клиенту скрыть клавиатуру после использования (после нажатия на кнопку). Её по-прежнему можно будет открыть через иконку в поле ввода сообщения. По умолчанию False . |
selective | Boolean | Опционально. Этот параметр нужен, чтобы показывать клавиатуру только определённым пользователям. Цели: 1) пользователи, которые были @упомянуты в поле text объекта Message; 2) если сообщения бота является ответом (содержит поле reply_to_message_id), авторы этого сообщения.Пример: Пользователь отправляет запрос на смену языка бота. Бот отправляет клавиатуру со списком языков, видимую только этому пользователю. |
KeyboardButton
Этот объект представляет одну кнопку в клавиатуре ответа. Для обычных текстовых кнопок этот объект может быть заменён на строку, содержащую текст на кнопке.
Поле | Тип | Описание |
text | String | Текст на кнопке. Если ни одно из опциональных полей не использовано, то при нажатии на кнопку этот текст будет отправлен боту как простое сообщение. |
request_contact | Boolean | Опционально. Если значение True , то при нажатии на кнопку боту отправится контакт пользователя с его номером телефона. Доступно только в диалогах с ботом. |
request_location | Boolean | Опционально. Если значение True , то при нажатии на кнопку боту отправится местоположение пользователя. Доступно только в диалогах с ботом. |
Внимание:
Параметры
request_contact
иrequest_location
будут работать только в версиях Telegram, выпущенных позже 9 апреля 2016 года. Более старые клиенты проигнорируют это поле.
ReplyKeyboardHide
После получения сообщения с этим объектом, приложение Telegram свернёт клавиатуру бота и отобразит стандартную клавиатуру устройства (с буквами). По умолчанию клавиатуры бота отображаются до тех пор, пока не будет принудительно отправлена новая или скрыта старая клавиатура. Исключение составляют одноразовые клавиатуры, которые скрываются сразу после нажатия на какую-либо кнопку (см. ReplyKeyboardMarkup).
Поле | Тип | Описание |
hide_keyboard | Boolean | Указание клиенту скрыть клавиатуру бота |
selective | Boolean | Опционально. Используйте этот параметр, чтобы скрыть клавиатуру только у определённых пользователей. Цели: 1) пользователи, которые были @упомянуты в поле text объекта Message; 2) если сообщения бота является ответом (содержит поле reply_to_message_id), авторы этого сообщения.Пример: Пользователь голосует в опросе, бот отправляет сообщение с подтверждением и скрывает клавиатуру у этого пользователя, в то время как у всех остальных клавиатура видна. |
InlineKeyboardMarkup
Этот объект представляет встроенную клавиатуру, которая появляется под соответствующим сообщением.
Поле | Тип | Описание |
inline_keyboard | Массив массивов с InlineKeyboardButton | Массив строк, каждая из которых является массивом объектов InlineKeyboardButton. |
Внимание:
Эти параметры будут работать только в версиях Telegram, выпущенных позже 9 апреля 2016 года. Более старые клиенты покажут ошибку вместо сообщения.
InlineKeyboardButton
Этот объект представляет одну кнопку встроенной клавиатуры. Вы обязательно должны задействовать ровно одно опциональное поле.
Поле | Тип | Описание |
text | String | Текст на кнопке |
url | String | Опционально. URL, который откроется при нажатии на кнопку |
callback_data | String | Опционально. Данные, которые будут отправлены в callback_query при нажатии на кнопку |
switch_inline_query | String | Опционально. Если этот параметр задан, то при нажатии на кнопку приложение предложит пользователю выбрать любой чат, откроет его и вставит в поле ввода сообщения юзернейм бота и определённый запрос для встроенного режима. Если отправлять пустое поле, то будет вставлен только юзернейм бота. Примечание: это нужно для того, чтобы быстро переключаться между диалогом с ботом и встроенным режимом с этим же ботом. Особенно полезно в сочетаниями с действиями switch_pm… – в этом случае пользователь вернётся в исходный чат автоматически, без ручного выбора из списка. |
switch_inline_query_current_chat | String | Опционально. If set, pressing the button will insert the bot‘s username and the specified inline query in the current chat’s input field. Can be empty, in which case only the bot’s username will be inserted. |
callback_game | CallbackGame | Опционально. Description of the game that will be launched when the user presses the button. NOTE: This type of button must always be the first button in the first row. |
Внимание:
Эти параметры будут работать только в версиях Telegram, выпущенных позже 9 апреля 2016 года. Более старые клиенты покажут ошибку вместо сообщения.
CallbackQuery
Этот объект представляет входящий запрос обратной связи от инлайн-кнопки с заданным callback_data
.
Если кнопка, создавшая этот запрос, была привязана к сообщению, то в запросе будет присутствовать поле message
.
Если кнопка была показана в сообщении, отправленном при помощи встроенного режима, в запросе будет присутствовать поле inline_message_id
.
Поле | Тип | Описание |
id | String | Уникальный идентификатор запроса |
from | User | Отправитель |
message | Message | Опционально. Сообщение, к которому была привязана вызвавшая запрос кнопка. Обратите внимание: если сообщение слишком старое, содержание сообщения и дата отправки будут недоступны. |
inline_message_id | String | Опционально. Идентификатор сообщения, отправленного через вашего бота во встроенном режиме |
data | String | Данные, связанные с кнопкой. Обратите внимание, что клиенты могут добавлять свои данные в это поле. |
ForceReply
Upon receiving a message with this object, Telegram clients will display a reply interface to the user (act as if the user has selected the bot‘s message and tapped ’Reply’). This can be extremely useful if you want to create user-friendly step-by-step interfaces without having to sacrifice privacy mode.
Поле | Тип | Описание |
force_reply | True | Shows reply interface to the user, as if they manually selected the bot‘s message and tapped ’Reply’ |
selective | Boolean | Опционально. Use this parameter if you want to force reply from specific users only. Targets: 1) users that are @mentioned in the text of the Message object; 2) if the bot’s message is a reply (has reply_to_message_id), sender of the original message. |
Пример:
A poll bot for groups runs in privacy mode (only receives commands, replies to its messages and mentions). There could be two ways to create a new poll:
- Explain the user how to send a command with parameters (e.g. /newpoll question answer1 answer2). May be appealing for hardcore users but lacks modern day polish.
- Guide the user through a step-by-step process. ‘Please send me your question’, ‘Cool, now let’s add the first answer option‘, ’Great. Keep adding answer options, then send /done when you‘re ready’.
The last option is definitely more attractive. And if you use ForceReply in your bot‘s questions, it will receive the user’s answers even if it only receives replies, commands and mentions — without any extra work for the user.
ResponseParameters
Содержит информацию о том, почему запрос не был успешен.
Field | Type | Description |
migrate_to_chat_id | Integer | Optional. The group has been migrated to a supergroup with the specified identifier. This number may be greater than 32 bits and some programming languages may have difficulty/silent defects in interpreting it. But it is smaller than 52 bits, so a signed 64 bit integer or double-precision float type are safe for storing this identifier. |
retry_after | Integer | Optional. In case of exceeding flood control, the number of seconds left to wait before the request can be repeated |
InputFile
This object represents the contents of a file to be uploaded. Must be posted using multipart/form-data in the usual way that files are uploaded via the browser.
Resending files without reuploading
There are two ways of sending a file (photo, sticker, audio etc.). If it‘s a new file, you can upload it using multipart/form-data. If the file is already on our servers, you don’t need to reupload it: each file object has a file_id field, you can simply pass this file_id as a parameter instead.
- It is not possible to change the file type when resending by file_id. I.e. a video can’t be sent as a photo, a photo can’t be sent as a document, etc.
- It is not possible to resend thumbnails.
- Resending a photo by file_id will send all of its sizes.
Inline mode objects
Objects and methods used in the inline mode are described in the Inline mode section.
Доступные методы
All methods in the Bot API are case-insensitive. We support GET and POST HTTP methods. Use either URL query string or application/json or application/x-www-form-urlencoded or multipart/form-data for passing parameters in Bot API requests.
On successful call, a JSON-object containing the result will be returned.
getMe
A simple method for testing your bot’s auth token. Requires no parameters. Returns basic information about the bot in form of a User object.
sendMessage
Use this method to send text messages. On success, the sent Message is returned.
Параметры | Тип | Обязательный | Описание |
chat_id | Integer or String | Yes | Unique identifier for the target chat or username of the target channel (in the format @channelusername ) |
text | String | Yes | Text of the message to be sent |
parse_mode | String | Необязательный | Send Markdown or HTML, if you want Telegram apps to show bold, italic, fixed-width text or inline URLs in your bot’s message. |
disable_web_page_preview | Boolean | Необязательный | Disables link previews for links in this message |
disable_notification | Boolean | Необязательный | Sends the message silently. iOS users will not receive a notification, Android users will receive a notification with no sound. |
reply_to_message_id | Integer | Необязательный | If the message is a reply, ID of the original message |
reply_markup | InlineKeyboardMarkup or ReplyKeyboardMarkup or ReplyKeyboardHide or ForceReply | Необязательный | Additional interface options. A JSON-serialized object for an inline keyboard, custom reply keyboard, instructions to hide reply keyboard or to force a reply from the user. |
Formatting options
The Bot API supports basic formatting for messages. You can use bold and italic text, as well as inline links and pre-formatted code in your bots’ messages. Telegram clients will render them accordingly. You can use either markdown-style or HTML-style formatting.
Note that Telegram clients will display an alert to the user before opening an inline link (‘Open this link?’ together with the full URL).
Markdown style
To use this mode, pass Markdown in the parse_mode field when using sendMessage. Use the following syntax in your message:
*bold text*
_italic text_
[text](URL)
`inline fixed-width code`
```pre-formatted fixed-width code block```
HTML style
To use this mode, pass HTML in the parse_mode field when using sendMessage. The following tags are currently supported:
<b>bold</b>, <strong>bold</strong>
<i>italic</i>, <em>italic</em>
<a href="URL">inline URL</a>
<code>inline fixed-width code</code>
<pre>pre-formatted fixed-width code block</pre>
Please note:
- Only the tags mentioned above are currently supported.
- Tags must not be nested.
- All
<
,>
and&
symbols that are not a part of a tag or an HTML entity must be replaced with the corresponding HTML entities (<
with<
,>
with>
and&
with&
). - All numerical HTML entities are supported.
- The API currently supports only the following named HTML entities:
<
,>
,&
and"
.
forwardMessage
Use this method to forward messages of any kind. On success, the sent Message is returned.
Параметры | Тип | Обязательный | Описание |
chat_id | Integer or String | Yes | Unique identifier for the target chat or username of the target channel (in the format @channelusername ) |
from_chat_id | Integer or String | Yes | Unique identifier for the chat where the original message was sent (or channel username in the format @channelusername ) |
disable_notification | Boolean | Необязательный | Sends the message silently. iOS users will not receive a notification, Android users will receive a notification with no sound. |
message_id | Integer | Yes | Unique message identifier |
sendPhoto
Use this method to send photos. On success, the sent Message is returned.
Параметры | Тип | Обязательный | Описание |
chat_id | Integer or String | Yes | Unique identifier for the target chat or username of the target channel (in the format @channelusername ) |
photo | InputFile or String | Yes | Photo to send. You can either pass a file_id as String to resend a photo that is already on the Telegram servers, or upload a new photo using multipart/form-data. |
caption | String | Необязательный | Photo caption (may also be used when resending photos by file_id), 0-200 characters |
disable_notification | Boolean | Необязательный | Sends the message silently. iOS users will not receive a notification, Android users will receive a notification with no sound. |
reply_to_message_id | Integer | Необязательный | If the message is a reply, ID of the original message |
reply_markup | InlineKeyboardMarkup or ReplyKeyboardMarkup or ReplyKeyboardHide or ForceReply | Необязательный | Additional interface options. A JSON-serialized object for an inline keyboard, custom reply keyboard, instructions to hide reply keyboard or to force a reply from the user. |
sendAudio
Use this method to send audio files, if you want Telegram clients to display them in the music player. Your audio must be in the .mp3 format. On success, the sent
Message is returned. Bots can currently send audio files of up to 50 MB in size, this limit may be changed in the future.
For sending voice messages, use the sendVoice method instead.
Параметры | Тип | Обязательный | Описание |
chat_id | Integer or String | Yes | Unique identifier for the target chat or username of the target channel (in the format @channelusername ) |
audio | InputFile or String | Yes | Audio file to send. You can either pass a file_id as String to resend an audio that is already on the Telegram servers, or upload a new audio file using multipart/form-data. |
caption | Integer | Необязательный | Название аудио, 0-200 символов |
duration | Integer | Необязательный | Duration of the audio in seconds |
performer | String | Необязательный | Performer |
title | String | Необязательный | Track name |
disable_notification | Boolean | Необязательный | Sends the message silently. iOS users will not receive a notification, Android users will receive a notification with no sound. |
reply_to_message_id | Integer | Необязательный | If the message is a reply, ID of the original message |
reply_markup | InlineKeyboardMarkup or ReplyKeyboardMarkup or ReplyKeyboardHide or ForceReply | Необязательный | Additional interface options. A JSON-serialized object for an inline keyboard, custom reply keyboard, instructions to hide reply keyboard or to force a reply from the user. |
sendDocument
Use this method to send general files. On success, the sent Message is returned. Bots can currently send files of any type of up to 50 MB in size, this limit may be changed in the future.
Параметры | Тип | Обязательный | Описание |
chat_id | Integer or String | Yes | Unique identifier for the target chat or username of the target channel (in the format @channelusername ) |
document | InputFile or String | Yes | File to send. You can either pass a file_id as String to resend a file that is already on the Telegram servers, or upload a new file using multipart/form-data. |
caption | String | Необязательный | Document caption (may also be used when resending documents by file_id), 0-200 characters |
disable_notification | Boolean | Необязательный | Sends the message silently. iOS users will not receive a notification, Android users will receive a notification with no sound. |
reply_to_message_id | Integer | Необязательный | If the message is a reply, ID of the original message |
reply_markup | InlineKeyboardMarkup or ReplyKeyboardMarkup or ReplyKeyboardHide or ForceReply | Необязательный | Additional interface options. A JSON-serialized object for an inline keyboard, custom reply keyboard, instructions to hide reply keyboard or to force a reply from the user. |
sendSticker
Use this method to send .webp stickers. On success, the sent Message is returned.
Параметры | Тип | Обязательный | Описание |
chat_id | Integer or String | Yes | Unique identifier for the target chat or username of the target channel (in the format @channelusername ) |
sticker | InputFile or String | Yes | Sticker to send. You can either pass a file_id as String to resend a sticker that is already on the Telegram servers, or upload a new sticker using multipart/form-data. |
disable_notification | Boolean | Необязательный | Sends the message silently. iOS users will not receive a notification, Android users will receive a notification with no sound. |
reply_to_message_id | Integer | Необязательный | If the message is a reply, ID of the original message |
reply_markup | InlineKeyboardMarkup or ReplyKeyboardMarkup or ReplyKeyboardHide or ForceReply | Необязательный | Additional interface options. A JSON-serialized object for an inline keyboard, custom reply keyboard, instructions to hide reply keyboard or to force a reply from the user. |
sendVideo
Use this method to send video files, Telegram clients support mp4 videos (other formats may be sent as Document). On success, the sent
Message is returned. Bots can currently send video files of up to 50 MB in size, this limit may be changed in the future.
Параметры | Тип | Обязательный | Описание |
chat_id | Integer or String | Yes | Unique identifier for the target chat or username of the target channel (in the format @channelusername ) |
video | InputFile or String | Yes | Video to send. You can either pass a file_id as String to resend a video that is already on the Telegram servers, or upload a new video file using multipart/form-data. |
duration | Integer | Необязательный | Duration of sent video in seconds |
width | Integer | Необязательный | Video width |
height | Integer | Необязательный | Video height |
caption | String | Необязательный | Video caption (may also be used when resending videos by file_id), 0-200 characters |
disable_notification | Boolean | Необязательный | Sends the message silently. iOS users will not receive a notification, Android users will receive a notification with no sound. |
reply_to_message_id | Integer | Необязательный | If the message is a reply, ID of the original message |
reply_markup | InlineKeyboardMarkup or ReplyKeyboardMarkup or ReplyKeyboardHide or ForceReply | Необязательный | Additional interface options. A JSON-serialized object for an inline keyboard, custom reply keyboard, instructions to hide reply keyboard or to force a reply from the user. |
sendVoice
Use this method to send audio files, if you want Telegram clients to display the file as a playable voice message. For this to work, your audio must be in an .ogg file encoded with OPUS (other formats may be sent as Audio or Document). On success, the sent Message is returned. Bots can currently send voice messages of up to 50 MB in size, this limit may be changed in the future.
Параметры | Тип | Обязательный | Описание |
chat_id | Integer or String | Yes | Unique identifier for the target chat or username of the target channel (in the format @channelusername ) |
voice | InputFile or String | Yes | Audio file to send. You can either pass a file_id as String to resend an audio that is already on the Telegram servers, or upload a new audio file using multipart/form-data. |
caption | Integer | Необязательный | Название аудиосообщения, 0-200 символов |
duration | Integer | Необязательный | Duration of sent audio in seconds |
disable_notification | Boolean | Необязательный | Sends the message silently. iOS users will not receive a notification, Android users will receive a notification with no sound. |
reply_to_message_id | Integer | Необязательный | If the message is a reply, ID of the original message |
reply_markup | InlineKeyboardMarkup or ReplyKeyboardMarkup or ReplyKeyboardHide or ForceReply | Необязательный | Additional interface options. A JSON-serialized object for an inline keyboard, custom reply keyboard, instructions to hide reply keyboard or to force a reply from the user. |
sendLocation
Use this method to send point on the map. On success, the sent Message is returned.
Параметры | Тип | Обязательный | Описание |
chat_id | Integer or String | Yes | Unique identifier for the target chat or username of the target channel (in the format @channelusername ) |
latitude | Float number | Yes | Latitude of location |
longitude | Float number | Yes | Longitude of location |
disable_notification | Boolean | Необязательный | Sends the message silently. iOS users will not receive a notification, Android users will receive a notification with no sound. |
reply_to_message_id | Integer | Необязательный | If the message is a reply, ID of the original message |
reply_markup | InlineKeyboardMarkup or ReplyKeyboardMarkup or ReplyKeyboardHide or ForceReply | Необязательный | Additional interface options. A JSON-serialized object for an inline keyboard, custom reply keyboard, instructions to hide reply keyboard or to force a reply from the user. |
sendVenue
Use this method to send information about a venue. On success, the sent Message is returned.
Параметры | Тип | Обязательный | Описание |
chat_id | Integer or String | Yes | Unique identifier for the target chat or username of the target channel (in the format @channelusername ) |
latitude | Float number | Yes | Latitude of the venue |
longitude | Float number | Yes | Longitude of the venue |
title | String | Yes | Name of the venue |
address | String | Yes | Address of the venue |
foursquare_id | String | Необязательный | Foursquare identifier of the venue |
disable_notification | Boolean | Необязательный | Sends the message silently. iOS users will not receive a notification, Android users will receive a notification with no sound. |
reply_to_message_id | Integer | Необязательный | If the message is a reply, ID of the original message |
reply_markup | InlineKeyboardMarkup or ReplyKeyboardMarkup or ReplyKeyboardHide or ForceReply | Необязательный | Additional interface options. A JSON-serialized object for an inline keyboard, custom reply keyboard, instructions to hide reply keyboard or to force a reply from the user. |
sendContact
Use this method to send phone contacts. On success, the sent Message is returned.
Параметры | Тип | Обязательный | Описание |
chat_id | Integer or String | Yes | Unique identifier for the target chat or username of the target channel (in the format @channelusername ) |
phone_number | String | Yes | Contact’s phone number |
first_name | String | Yes | Contact’s first name |
last_name | String | Необязательный | Contact’s last name |
disable_notification | Boolean | Необязательный | Sends the message silently. iOS users will not receive a notification, Android users will receive a notification with no sound. |
reply_to_message_id | Integer | Необязательный | If the message is a reply, ID of the original message |
reply_markup | InlineKeyboardMarkup or ReplyKeyboardMarkup or ReplyKeyboardHide or ForceReply | Необязательный | Additional interface options. A JSON-serialized object for an inline keyboard, custom reply keyboard, instructions to hide keyboard or to force a reply from the user. |
sendChatAction
Use this method when you need to tell the user that something is happening on the bot’s side. The status is set for 5 seconds or less (when a message arrives from your bot, Telegram clients clear its typing status).
Пример:
The ImageBot needs some time to process a request and upload the image. Instead of sending a text message along the lines of “Retrieving image, please wait…”, the bot may use sendChatAction with action = upload_photo. The user will see a “sending photo” status for the bot.
We only recommend using this method when a response from the bot will take a noticeable amount of time to arrive.
Параметры | Тип | Обязательный | Описание |
chat_id | Integer or String | Yes | Unique identifier for the target chat or username of the target channel (in the format @channelusername ) |
action | String | Yes | Type of action to broadcast. Choose one, depending on what the user is about to receive: typing for text messages, upload_photo for photos, record_video or upload_video for videos, record_audio or upload_audio for audio files, upload_document for general files, find_location for location data. |
getUserProfilePhotos
Use this method to get a list of profile pictures for a user. Returns a UserProfilePhotos object.
Параметры | Тип | Обязательный | Описание |
user_id | Integer | Yes | Unique identifier of the target user |
offset | Integer | Необязательный | Sequential number of the first photo to be returned. By default, all photos are returned. |
limit | Integer | Необязательный | Limits the number of photos to be retrieved. Values between 1—100 are accepted. Defaults to 100. |
getFile
Use this method to get basic info about a file and prepare it for downloading. For the moment, bots can download files of up to 20MB in size. On success, a File object is returned. The file can then be downloaded via the link https://api.telegram.org/file/bot<token>/<file_path>
, where <file_path>
is taken from the response. It is guaranteed that the link will be valid for at least 1 hour. When the link expires, a new one can be requested by calling
getFile again.
Параметры | Тип | Обязательный | Описание |
file_id | String | Yes | File identifier to get info about |
kickChatMember
Use this method to kick a user from a group or a supergroup. In the case of supergroups, the user will not be able to return to the group on their own using invite links, etc., unless unbanned first. The bot must be an administrator in the group for this to work. Returns True on success.
Внимание:
This will method only work if the ‘All Members Are Admins’ setting is off in the target group. Otherwise members may only be removed by the group’s creator or by the member that added them.
Параметры | Тип | Обязательный | Описание |
chat_id | Integer or String | Yes | Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername ) |
user_id | Integer | Yes | Unique identifier of the target user |
unbanChatMember
Use this method to unban a previously kicked user in a supergroup. The user will not return to the group automatically, but will be able to join via link, etc. The bot must be an administrator in the group for this to work. Returns True on success.
Параметры | Тип | Обязательный | Описание |
chat_id | Integer or String | Yes | Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername ) |
user_id | Integer | Yes | Unique identifier of the target user |
answerCallbackQuery
Use this method to send answers to callback queries sent from inline keyboards. The answer will be displayed to the user as a notification at the top of the chat screen or as an alert. On success, True is returned.
Параметры | Тип | Обязательный | Описание |
callback_query_id | String | Yes | Unique identifier for the query to be answered |
text | String | Необязательный | Text of the notification. If not specified, nothing will be shown to the user |
show_alert | Boolean | Необязательный | If true, an alert will be shown by the client instead of a notification at the top of the chat screen. Defaults to false. |
url | String | Необязательный | URL, который будет открыт у пользователя. Если вы создали игру, приняв условия @Botfather, укажите адрес, на котором расположена ваша игра. Учтите, что это будет работать только если запрос исходит от кнопки callback_game. В остальных случаях вы можете использовать параметр для создания ссылок вида telegram.me/your_bot?start=XXXX |
Inline mode methods
Methods and objects used in the inline mode are described in the Inline mode section.
Updating messages
The following methods allow you to change an existing message in the message history instead of sending a new one with a result of an action. This is most useful for messages with inline keyboards using callback queries, but can also help reduce clutter in conversations with regular chat bots.
Please note, that it is currently only possible to edit messages without reply_markup or with inline keyboards.
editMessageText
Use this method to edit text messages sent by the bot or via the bot (for inline bots). On success, the edited Message is returned.
Параметры | Тип | Обязательный | Описание |
chat_id | Integer or String | No | Required if inline_message_id is not specified. Unique identifier for the target chat or username of the target channel (in the format @channelusername ) |
message_id | Integer | No | Required if inline_message_id is not specified. Unique identifier of the sent message |
inline_message_id | String | No | Required if chat_id and message_id are not specified. Identifier of the inline message |
text | String | Yes | New text of the message |
parse_mode | String | Необязательный | Send Markdown or HTML, if you want Telegram apps to show bold, italic, fixed-width text or inline URLs in your bot’s message. |
disable_web_page_preview | Boolean | Необязательный | Disables link previews for links in this message |
reply_markup | InlineKeyboardMarkup | Необязательный | A JSON-serialized object for an inline keyboard. |
editMessageCaption
Use this method to edit captions of messages sent by the bot or via the bot (for inline bots). On success, the edited Message is returned.
Параметры | Тип | Обязательный | Описание |
chat_id | Integer or String | No | Required if inline_message_id is not specified. Unique identifier for the target chat or username of the target channel (in the format @channelusername ) |
message_id | Integer | No | Required if inline_message_id is not specified. Unique identifier of the sent message |
inline_message_id | String | No | Required if chat_id and message_id are not specified. Identifier of the inline message |
caption | String | Необязательный | New caption of the message |
reply_markup | InlineKeyboardMarkup | Необязательный | A JSON-serialized object for an inline keyboard. |
editMessageReplyMarkup
Use this method to edit only the reply markup of messages sent by the bot or via the bot (for inline bots). On success, the edited
Message is returned.
Параметры | Тип | Обязательный | Описание |
chat_id | Integer or String | No | Required if inline_message_id is not specified. Unique identifier for the target chat or username of the target channel (in the format @channelusername ) |
message_id | Integer | No | Required if inline_message_id |
Telegram Api — описание, элементы управления, языки
Telegram api в основном может определяться огромным количеством различных ботов – сервисных ботов. Их может лично формировать каждый желающий человек, с программой среднего уровня. У бота программы телеграмм много уникальных способностей, которые осуществляют разные команды по умолчанию. Пользователи могут в любое время начать общение из поля вводы чата. Для этого набирается бот и запросный режим для необходимого поиска. После получения запроса, робот возвращает какие-либо результаты. Как только человек нажимает на бота, сразу отправляется в чат, кроме того можно после добавления участников в группу api, telegram.
Описание телеграмм
Аpi telegram org bot называют функционирующий интерфейс, который позволяет сделать программу собственного робота. Туда входят различные командные коды, а также документация telegram api, которые предназначаются для того, чтобы установить функции робота org. Если использовать интерфейс приложения, любой пользователь сможет формировать личные программы с кодами, которые при запуске в id telegram api будут функционировать как боты org.
Элементы управления
В системе все элементы для управления установщиками называют объектами, представленными в виде строки, которая задается по своим установленным условиям. Это может позволить обмениваться данными по всему сервису легко и без особых затрат, так как при передаче данных изображается не сам код режима, а целый набор ключевых значений, которые выходят в текстовом значении. Огромное количество элементов управления предназначено для того, чтобы выстроить команду установщика. Ключевые слова расширяют о больших возможностях объекта. Обмениваться текстами между другими клиентами можно в виде соответствующих запросов. Приведем несколько примеров ниже:
- sendMessage – для получения сообщения.
- sendVideo – для отправления видео.
- sendAudio – для отправления аудиозаписи.
Все элементы управления делятся на категорию групп для:
- Получения обновления и информационных запусков.
- Общения в чате.
- Отправки разнообразных элементов.
- Функции с наклейками.
- Обновления текстовых сообщений.
- Платежного функционала.
- Игр и развлекательных порталов.
Важно! Полная документация приложения пока на нашем отечественном языке отсутствует. Однако можно надеяться на обычный перевод в браузере Google, который прекрасно справляется со своей поставленной задачей.
Создание робота в телеграм
Можно организовывать командные тексты в соответствующей системе с использованием установщиком. Для поиска работы нужно ввести go telegram bot api. Для создания имеется сервисная система @Botfather. Если зайти туда, то можно увидеть много командного набора, благодаря которых можно создать новый робот. Для того чтобы построить нового робота в приложении, первоначально набирается команда с названием – newbot. Далее ввести имя для клиента, которое в обязательном порядке должно оканчиваться на «бот». После чего присылается индетифкаторный токен, в результате чего создается новейший установщик. Авторизировать его можно только через токен. Далее запускается программный режим в портале. Клиент находит своего установщика и нажимает на кнопку в виде старта, что далее запускает определенную командную строку. Далее будут зарезервированы соответствующие командные строки под наименованием settings и /help. Для обхода блокировки api, его, необходимо подключить к SOCKS5 прокси, подставить рабочий прокси в адрес и, если нужны, то данные, а также свой запросный вопрос. Кроме того, можно сделать зеркало api telegram org, простым способом сделав зеркало без фактического перехода клиента на него, без переадресации. Например, он переходит по ссылке, а сервисная программа будет пересылать запрос на другой сервис. Далее получить отклик от сервисного центра данных, что предпосылает клиенту, который сделал поначалу запрос.
Языки программирования
Что же такое чат бот telegram api javascript? Онлайн сервис может поддерживаться различными языками для сервисных программных режимов, что позволяет сделать выбор любому человеку. Клиенты JavaScript, которые любят общаться в чате бота telegram api используют Node.js python telegram bot api.
Важно! Здесь необходимо знать не только язык, но и уметь обращаться с фреймворком, превращающий в стиль в интерфейс системы.
Один из известных для написания бота с использованием системы является PHP. Этот язык управления предназначается для того, чтобы создать серверные приложения. Язык простой, логичный и специализированный для web-портала. С поддержкой инструментов можно осуществлять всякие системы. Можно создать следующие командные режимы:
- Telegram bot api php sdk.
- Using telegram api.
- Node js telegram bot api.
- Core telegram org bots api.
- Connection to api telegram org timed out , при этом важно изучить официальную документацию, а не сам наборный пакет.
Отправка текстов в системе
Общаясь с другим человеком можно быть уверенным, что робот даст глубокую информацию о сборе отклика во внешнем сервисе в основном извещении. Чтобы отправить оповещение через браузер, с поддержкой curl и из Bash-скрипта. Чтобы сделать отправку сообщений telegram api через браузер, необходимо просто открыть URL:
Python + Telegram = bot
import config
import telebot
from telebot import apihelper
from telebot import types
import datetime
import os
import logging
logger = logging.getLogger(‘log’)
logger.setLevel(logging.INFO)
fh = logging.FileHandler(‘someTestBot.log’)
fh.setLevel(logging.DEBUG)
formatter = logging.Formatter(«%(asctime)s | %(levelname)-7s | %(message)s»)
fh.setFormatter(formatter)
logger.addHandler(fh)
### Прокси сервер
apihelper.proxy = {‘https’:’socks5h://login:password@ip-host:port’}
### Token telegram bot
bot = telebot.TeleBot(‘Token-bot’, threaded=True)
### Функция проверки авторизации
def autor(chatid):
strid = str(chatid)
for item in config.users:
if item == strid:
return True
return False
### Клавиатура
keyboard1 = telebot.types.ReplyKeyboardMarkup()
keyboard1.row(‘Привет’, ‘Пока’, ‘/ip’,’/camera’)
### Прием документов
@bot.message_handler(content_types=[‘document’])
def handle_docs_photo(message):
try:
chat_id = message.chat.id
file_info = bot.get_file(message.document.file_id)
downloaded_file = bot.download_file(file_info.file_path)
src = ‘/home/users-name/received/’ + message.document.file_name;
with open(src, ‘wb’) as new_file:
new_file.write(downloaded_file)
bot.reply_to(message, «Пожалуй, я сохраню это»)
except Exception as e:
bot.reply_to(message, e)
### Прием фото
@bot.message_handler(content_types=[‘photo’])
def handle_docs_photo(message):
try:
chat_id = message.chat.id
file_info = bot.get_file(message.photo[len(message.photo) — 1].file_id)
downloaded_file = bot.download_file(file_info.file_path)
src = ‘/home/users-name/received/’ + file_info.file_path;
with open(src, ‘wb’) as new_file:
new_file.write(downloaded_file)
bot.reply_to(message, «Фото добавлено»)
except Exception as e:
bot.reply_to(message, e)
@bot.message_handler(commands=[‘start’])
def start_message(message):
if autor(message.chat.id):
cid = message.chat.id
message_text = message.text
user_id = message.from_user.id
user_name = message.from_user.first_name
bot.send_message(message.chat.id, ‘Привет, ‘ + user_name + ‘ Что ты хочешь от меня, собака сутулая!’, reply_markup=keyboard1)
bot.send_sticker(message.chat.id, ‘CAADAgAD6CQAAp7OCwABx40TskPHi3MWBA’)
Telegram bot (library pyTelegramBotAPI) / Бот Телеграма (библиотека pyTelegramBotAPI) — Блог дяди Freemanа
Для домашних нужд решил я завести себе бота Telegram, дабы получать оповещения и статусы от домашних устройств и автоматики. Сделать все это я решил на Python, поскольку не хотел слишком углубляться в детали, уровня абстракции этого языка вполне достаточно для этой работы.
Итак, для начала Вам нужно себе бота завести. Писать мануал тут будет излишним, их в интернете полно. Приведу тут ссылку на официальный мануал Телеграма по ботам. Получили token бота? Теперь читаем дальше.
1. Подготовка окружения
Как уже сказал выше, для работы бота я использовал готовую библиотеку pyTelegramBotAPI, а значит нам потребуется python, я писал на версии 3.6 под систему ubuntu 18.04 LTS. Все, что надо установить при такой конфигурации это сам python3, pip3 и, конечно, библиотеку.
apt-get update
apt-get install python3
apt-get install python3-pip
pip3 install pyTelegramBotAPI
Теперь все готово для того, чтобы кодить самого бота.
2. Код бота
Самое главное в коде это обработчики событий, то есть обработка того контента, который будет получать бот в ходе своей работы.
Так как бота мы уже создали, у нас есть токен авторизации.
Важное примечание. Запуская бота, имейте ввиду, что есть определенные нюансы, например, вдруг если он упадет, но сообщения боту будут продолжать поступать от пользователей, они накопятся в серверах Телеграма в течении 24 часов и при выходе бота в сеть, прилетят все разом. Поэтому эту ситуацию в коде не забудьте продумать. Слить все сообщения или обработать, Вам решать.
Итак, начало файла telebot_handler.py выглядит так:
# -*- coding: utf-8 -*- import telebot from telebot import types
Тут я указываю, что использую кодировку utf8 — всегда так делаю в python скриптах, а также ссылаюсь на библиотеку telebot и модуль из нее же, там хранятся типы нужных объектов для бота.
bot = telebot.TeleBot("4xxxxxxx2:Xxxxxxxxxxxx--XXXXxxxxxxxxXXXXXxxXX")
Это инициализация объекта бота как потомка от типа TeleBot, с указанием токена Вашего бота. после этого этим объектом можно манипулировать, отсылать и принимать сообщения.
2.1 Обработчики событий
Мы перешли к самой сути — обработке команд. Можно обрабатывать так называемые специализированные типы данных в Телеграме — команды, это строки с символом /
в начале, также можно и обрабатывать простые сообщения, написать, к примеру чат-бота. Ну тут на Вашу фантазию так сказать.
Ниже пример, как обрабатывать команду /start
, которая, к слову, обязательна по соглашению политики ботов Телеграма:
@bot.message_handler(commands=['start'])
def handle_start(message):
bot.reply_to(message, 'Hello, ' + message.from_user.first_name)
Вот так вроде бы нехитро, благодаря высокоуровневой обертке из библиотеки. Понятно, что тут можно написать все что угодно, нет каких-то стандартов, какой должен быть ответ на эту команду. Предполагается, что с нее начинается Ваш чат с ботом.
Теперь, если в голове все хорошо улеглось, можно попробовать написать обработчик для текстовых сообщений. Тоже внешне очень просто:
@bot.message_handler(func=lambda message: True, content_types=['text'])
def handle_text(message):
if message.text == "Hi":
bot.send_message(message.from_user.id, "Hello, World!")
elif message.text == "How are you?" or message.text == "How are u?":
bot.send_message(message.from_user.id, "I'm fine, thanks. And you?")
else:
bot.send_message(message.from_user.id, "Sorry, i dont understand you.")
Как то так.
2.2 Плюшечки
Очень удобны на мой взгляд так называемые в жаргоне Телеграма «клавиатуры», которые позволяют избавить пользователей от необходимости знать команды Вашего бота, а просто дают на выбор кнопочки с вариантами. Это упрощает общение с ботом, а также очень его ускоряет. Поэтому, пользуемся:
##Клавиатура главного меню##
markup = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True) #Активация, название, количество кнопок по одной в ряду
itembtn1 = types.KeyboardButton(' Прислать гороскоп на день') #Название кнопки 1
itembtn2 = types.KeyboardButton(' Управление окнами') #Название кнопки 2
itembtn3 = types.KeyboardButton(' Показать состояние дома') #Название кнопки 3
markup.add(itembtn1, itembtn2, itembtn3) #Занесение кнопок в матрицу
##Клавиатура главного меню##
Это мы подготовили клавиатуру для главного меню, теперь мы это прикрутим к нашему первому общению с ботом, то бишь к команде /start
:
@bot.message_handler(commands=['start'])
def handle_start(message):
bot.reply_to(message, 'Hello, ' + str(message.from_user.first_name),reply_markup=markup)
Это мы просто добавили reply_markup параметр, который и содержит объект клавиатуры. Кстати, если после очередного сообщения надо удалить клавиатуру, (которая может кстати выставлять флаг, и исчезать после выбора пользователя самостоятельно), то вместо объкта клавиатуры надо отправить объект пустой клавиатуры, а именно:
###Убрать клавиатуру###
menu_remove=types.ReplyKeyboardRemove()
###Убрать клавиатуру###
Теперь после отправки пользователю
bot.reply_to(message, 'Hello, ' + str(message.from_user.first_name),reply_markup=menu_remove)
клавиатура будет удалена.
3. Последние штрихи
Ну, а у нам же задача, чтобы бот не только после запуска обработал все доступные ему сообщения и помер, а жил и служил, поэтому мы ему включим поллинг, чтобы процесс не завершался пока мы не позволим, либо он не отвалится из-за нашего кривого кода 🙂
bot.polling(none_stop=True, interval=0)
Это позволит закрыть наш вопрос.
4. Как его запускать то??? :))
Да, если вдруг кому то python в новинку, то запускать наш скрипт надо так:
/usr/bin/python3 /<путь до папки, где вы этот скрипт сохранили>/telebot_handler.py
Да, и не забудьте выставить права на запуск Вашему скрипту,
chmod +x /<путь>/telebot_handler.py
Тут важное примечание. НЕЛЬЗЯ называть файл .py со скриптом именем, используемым в вызове библиотек, а именно тут, после слов import:
import telebot
поскольку python тогда будет линковать сам файл рекурсивно, а не библиотеку, такая вот вещь.
После запуска таким образом, поскольку жизнь скрипта будет условно вечной, он не вернет вам консоль, пока вы его принудительно не убьете, CTRL+С, это удобно лишь на этапе разработки бота.
5. Ладно, расскажу, как запустить его по человечески.
При условии, что у Вас стоит debian-like система под этим ботом, у меня к слову это lxc контейнер, о которых я еще напишу позже, то ниже я опишу способ сделать из Вашего бота демона), то есть службу, которая будет стартовать при запуске системы автоматически и не занимать консоль.
Я для этого задействовал возможности systemd, достаточно создать файл в директории /lib/systemd/system
# cat /lib/systemd/system/telebot.service[Unit]
Description=Telegram Bot[Service]
Type=simple
ExecStart=/usr/bin/python3/<path_to_bot>/telebot_handler.py Restart=always
RestartSec=10
StartLimitIntervalSec=0
SyslogIdentifier=telegram_bot_service[Install]
WantedBy=multi-user.target
После этого, надо systemd перезапустить и разрешить запуск демона:
systemctl daemon-reload
systemctl enable telebot.service
Все, теперь им можно управлять как обычной службой, запуск и остановка:
service telebot stop
service telebot start
Поделиться ссылкой:
Понравилось это:
Нравится Загрузка…
Похожее
Ещё 10 ботов Telegram, которые упростят вашу жизнь и развлекут
TweetItBot
Если вы часто пишете твиты, то этот бот поможет сэкономить несколько минут в день. После авторизации в Twitter он будет публиковать от вашего имени всё, что вы ему пришлёте, включая фото, видео, гифки и стикеры. TweetItBot также позволяет ретвитить, лайкать и отвечать на твиты.
Добавить бота →
DeLorean
С DeLorean вы сможете создавать собственные капсулы времени (ну ладно, ладно, просто напоминания). Пишете сообщение, указываете дату, и в назначенный срок получаете своё послание из прошлого. Слать себе сообщения можно, к сожалению, только в будущее: для прошлого не работает. 😉
Добавить бота →
MyOrderbot
Всем знакома ситуация, когда в обеденное время одному из коллег в рабочем чате приходится брать на себя роль официанта и собирать заказы на еду. Процесс можно упростить, если пригласить в чат этого бота. Он спросит у каждого, что заказать, и выдаст общий список, с которым можно отправиться в буфет или позвонить в службу доставки.
Добавить бота →
ShopList
Есть среди ботов и более функциональные списки покупок. Например, ShopList умеет вести сразу несколько перечней, причём позволяет делиться ими с другими людьми и получать уведомления о любых изменениях. Создаём список, добавляем туда нужные товары, а затем вычёркиваем их одним нажатием во время походов по магазинам.
Добавить бота →
Create event
Календарь — ещё одно стандартное приложение, которое частично можно заменить ботом. Этот бот с не самым оригинальным названием может принять на себя роль секретаря и создавать для вас события в «Google Календаре», которыми потом легко делиться с коллегами, друзьями и вообще любыми людьми.
Добавить бота →
VoteBot
VoteBot избавит от флуда в групповых чатах в случаях, когда нужно выбрать фильм для похода в кино, место для путешествия в выходные и так далее. Если перед вами стоит выбор, просто создайте голосование, попросите всех участников высказаться и узнайте результат.
Добавить бота →
Drive It
Пока в Telegram нет интеграции с облачными хранилищами, её можно добавить с помощью ботов. Drive It буквально в пару кликов подружит любимый мессенджер с «Google Диском» и будет складывать в ваше облако всё, что вы ему перешлёте. Поддерживаются файлы только до 20 МБ, но это ограничение Telegram для ботов. Впрочем, для документов этого достаточно.
Добавить бота →
Swatcher
Пока не освоили английский настолько, чтобы смотреть сериалы в оригинале? Следить за выходом новых эпизодов в русской озвучке поможет бот Swatcher. Всё, что вам нужно сделать, это добавить сериалы, которые смотрите. Как только новые эпизоды будут переведены, вы тут же получите уведомление.
Добавить бота →
GameBoy Camera
Как можно догадаться благодаря названию, этот бот развлечёт всех ретроградов, питающих тёплые чувства к игровым консолям из 1980-х. GameBoy Camera без лишних слов превращает все фото, которые вы ему отправите, в пиксельные картинки. Да-да, именно так могли бы выглядеть ваши селфи, будь в GameBoy встроенная камера.
Добавить бота →
God, Not Bot
Напоследок — уже, можно сказать, по традиции — игра. В God, Not Bot вы примерите роль вождя племени и возьмёте на себя нелёгкое бремя принятия решений, чтобы привести свой народ к процветанию. Не думайте, что будет легко: начинать сначала придётся каждые несколько минут. Но геймплей настолько увлекателен и щедро пересыпан юмором, что вы захотите пройти игру до конца. Представьте себе, это возможно!
Добавить бота →
тгботапи · pkg.go.dev
Черные жизни имеют значение
Поддержите инициативу равного правосудия
- Зачем идти
- Начиная
- Откройте для себя пакеты
- Около
- Зачем идти
- Начиная
- Откройте для себя пакеты
- Около
- голанг.орг
Откройте для себя пакеты
github.com/go-telegram-bot-api/telegram-bot-api
пакет
модуль
Самая большая основная версия с тегами -.
Версия v1.0,0
Самый последний
Перейти к последнему
3 янв.2016 г.
Массачусетский технологический институт
14 Импорт
316 Импортировано
tgbotapi
Версия v1.0,0
Самый последний
Перейти к последнему
3 янв.2016 г.
Как я создал простого бота Telegram на Go
Это первая часть серии Golang Telegram Bot
.
В этой серии статей я покажу вам на примерах кода, как я создал Golang Telegram Bot для собственного использования.
Он будет слушать и реагировать в режиме реального времени на определенные текстовые подсказки.Наконец, я также покажу вам, как получить самозаверяющий сертификат SSL, работающий с Nginx.
и развертывание приложения в контейнере Docker на экземпляре Digital Ocean.
Надеюсь, это поможет любому, кто хочет попробовать свои силы в собственном боте в Telegram!
Код этого бота в настоящее время размещен на https://github.com/aranair/remindbot, если хотите.
чтобы сразу перейти к коду.
Предыстория
Я очень давно пользуюсь Telegram и хотел создать бота для Telegram.
очень давно с тех пор, как они впервые объявили об этом.
Изначально меня немного скинуло требование https для вебхуков,
думая, что мне может понадобиться домен и сертификат SSL, чтобы заставить его работать, но я быстро обнаружил, что
самоподписанный сертификат SSL будет работать так же хорошо в этом сценарии!
Так что, если вы оказались в такой же ситуации, не беспокойтесь об этом! Это может быть немного сложнее
настроить самоподписанный сертификат SSL с Nginx, но это не так уж и сложно! В этой серии я покажу вам код
образцы, которые запустили моего собственного бота в производство!
Создание бота и получение ключа API
Сначала я отправил этому парню / newbot
.
После создания бота я получил набор (botId и API-ключ), отправив ему команду / token
.
Учетные данные необходимы для последующих запросов на выполнение методов с использованием Telegram API.
# {botId}: {apiKey}
123456: ABC-DEF1234ghIkl-zyx57W2v1u123ew11
Обратите внимание на слова bot
перед
!
https://api.telegram.org/bot/METHOD_NAME
В документации Telegram Bot есть масса методов Api, но для этой цели
этого простого стартового бота я буду использовать только setWebhook и sendMessage.
Webhook против опроса
Отлично! Теперь у меня есть ключ API. Затем мне нужно выбрать один из двух способов получения сообщений из Telegram.
- Webhooks через
setWebhook
или - Опрос через
getUpdates
Я почти уверен, что с помощью getUpdates
проще настроить, но опрос не всегда возможен и не имеет
Обновления в реальном времени — это не так весело ИМХО: P Итак, для этого бота я использовал веб-перехватчики, так как я хотел, чтобы бот отвечал в режиме реального времени.
С помощью веб-перехватчиков каждый раз, когда появляется сообщение (когда режим конфиденциальности все равно отключен), конечная точка API
будет отправлено сообщение. Итак, основная цель — просто проанализировать каждое из этих обновлений и отреагировать соответствующим образом.
Для настройки Webhook все, что мне нужно было сделать, это отправить запрос curl в Telegram Api.
curl -F "url = https: //your.domain.com" -F "certificate=@/file/path/ssl/bot.pem" https://api.telegram.org/bot12345:ABC-DEF
Маленький Telegram-бот в Go
Я начал пользоваться Telegram несколько лет назад.В большинстве случаев я не использую его для разговоров один на один, а скорее болтаю в небольшой группе друзей, которых я уже давно знаю. Время от времени мы делимся некоторыми ссылками на Twitter в этой группе, и, к сожалению, режим предварительного просмотра официальных клиентов Telegram не поддерживает предварительный просмотр сообщений Twitter с более чем одним изображением.
Возьмите это тестовое сообщение в качестве примера:
Это тест pic.twitter.com/E24MwvjOj0
— Бернат Рафалес (@brafales) 20 мая 2017 г.
В тот момент, когда я связываю это с чатом Telegram, вот результат:
Что не идеально, поскольку иногда сообщение не имеет особого смысла, когда отображается только одно из изображений.
Оказалось, что последние несколько месяцев я тоже изучал Go, поэтому я подумал, могу ли я написать небольшого бота Telegram, чтобы помочь мне с этим. Мне нужно было что-то, на что я мог бы отправить ссылку на Twitter, и вернуть мне либо предварительный просмотр Twitter по умолчанию в Telegram, либо созданный на заказ со всеми изображениями сообщения, если их было несколько.
Представляем новый бот
Я начал это больше, чтобы узнать немного больше о Go, а не для того, чтобы больше узнать об API Telegram и Twitter, поэтому я решил использовать уже созданные пакеты для работы как с Telegram Bot API, так и с Twitter REST API.Следующая блок-схема вкратце описывает, что делает бот:
Код бота структурирован с помощью следующих пакетов:
- Конфигурация
- : содержит общие параметры конфигурации бота
- twitter: работает с Twitter REST API, в основном через go-twitter
- : создает сообщения, которые понимает telegram-bot-api
- main: точка входа.
Сообщение