Модуль для работы с «TelegramBotAPI» используя python
Вот точно дока
Дока
Еще дока
pip install pyTelegramBotAPI
Для обработки действий пользователя, используются декораторы функций python «@bot.message_handler», указывается перед функцией обработчиком, агрументом указаны параметры, можно указать конкретные команды, или тип данных типа «текст/кнопки/лямбда и т.д.»
В обрабатываемой функции непременно есть аргумент «message», содержащий само сообщение
# Конкретные команды @bot.message_handler(commands=['start', 'help']) def start_message(message): # Любой текст (внутри уже IF'ами) @bot.message_handler(content_types=['text']) def text_message(message):
Простой пример с ботом и кнопки в т.ч.
Статья по кнопкам\\
Этот тип кнопок добавляется один раз на постоянку, справа в поле ввода, по аналогии с меню командами
В аргументах есть так же помимо «callback_data» еще пару вариантов, url в т.ч., используется что то одно, в основном там фигня
При старте задаем кнопки меню, и обрабатываем их нажатие
#!/usr/bin/python3.8 import telebot from telebot import types token = '50555555:AAaaaaaaaaaaa' bot = telebot.TeleBot(token) @bot.message_handler(commands = ['start']) def start_message(message): #inline_menu = InlineKeyboardMarkup([[ InlineKeyboardButton('Кнопка 1', callback_data = 'first_button') ]]) markup=types.ReplyKeyboardMarkup(resize_keyboard=True) markup.add(types.KeyboardButton("action 1")) markup.add(types.KeyboardButton("action 2")) # Для удаления # markup = types.ReplyKeyboardRemove() answer = bot.send_message(message.chat.id, "--=Приветствие=--", reply_markup = markup) print(str(answer)) @bot.message_handler(content_types = 'text') def message_reply(message): if message.text == "action 1": answer = bot.send_message(message.chat.id, "Выбрано действие 1") print(str(answer)) elif message.text == "action 2": answer = bot.send_message(message.chat.id, "Выбрано действие 2") print(str(answer)) bot.infinity_polling()
Есть параметр отвечающий за кол-во столбцов, «row_width», работает при добавлении кнопок методом «add()», метод «row()» так же добавляет кнопки но на размер ему побоку
Эти кнопки прикрепляются к сообщению, можно как отправлять с новым сообщением так и изменять их при редактировании, благодаря этому можно сделать динамическое меню
При обработке необходимо вызвать метод «answerCallbackQuery»
Дока
#!/usr/bin/python3.8 import telebot from telebot import types from telebot.types import InlineKeyboardButton, InlineKeyboardMarkup token = '55555555:AAффффффф' bot = telebot.TeleBot(token) @bot.message_handler(commands = ['start']) def start_message(message): inline_btn1 = InlineKeyboardButton('Первая кнопка', callback_data = 'button_1') inline_btn2 = InlineKeyboardButton('Вторая кнопка', callback_data = 'button_2') inline_menu = InlineKeyboardMarkup().add(inline_btn1, inline_btn2) answer = bot.send_message(message.chat.id, "--=Приветствие=--", reply_markup = inline_menu) print(str(answer)) @bot.callback_query_handler(func = lambda c: c.data == 'button_1') def press_button1(callback_query: types.CallbackQuery): bot.answer_callback_query(callback_query.id) bot.send_message(callback_query.from_user.id, 'Выбрана первая кнопка') @bot.callback_query_handler(func = lambda c: c.data == 'button_2') def press_button2(callback_query: types.CallbackQuery): bot.answer_callback_query(callback_query.id) bot.send_message(callback_query.from_user.id, 'Выбрана вторая кнопка') bot.infinity_polling()
#!/usr/bin/python3.8 import telebot from telebot import types from telebot.types import InlineKeyboardButton, InlineKeyboardMarkup token = '50222222222:AAыыыыыыыыы' bot = telebot.TeleBot(token) @bot.message_handler(commands = ['start']) def start_message(message): inline_btn1 = InlineKeyboardButton('Первая кнопка', callback_data = 'button_1') inline_btn2 = InlineKeyboardButton('Вторая кнопка', callback_data = 'button_2') inline_btn3 = InlineKeyboardButton('Вторая кнопка', callback_data = 'button_3') inline_menu = InlineKeyboardMarkup(row_width = 2) inline_menu.add(inline_btn1, inline_btn2, inline_btn3) # В два столбца inline_menu.row(inline_btn1, inline_btn2, inline_btn3) # В три столбца answer = bot.send_message(message.chat.id, "--=Приветствие=--", reply_markup = inline_menu) print(str(answer)) @bot.callback_query_handler(func = lambda c: c.data and c.data.startswith('button_')) def press_buttons(callback_query: types.CallbackQuery): code = callback_query.data[-1] if code == '1': # Текст покажется на экране оповещением bot.answer_callback_query(callback_query.id, text = 'Выбрана первая кнопка') elif code == '2': bot.answer_callback_query(callback_query.id, text = 'Выбрана вторая кнопка') elif code == '3': bot.answer_callback_query(callback_query.id, text = 'Выбрана третья кнопка') else: bot.answer_callback_query(callback_query.id) # Это сообщение отправится в чат т.е. ответное действие bot.send_message(callback_query.from_user.id, f"Нажата кнопка №{code}") bot.infinity_polling()
В поле «chat_id» пишется ID чата/канала/пользователя. Минусом предваряется ИД канала, простой чат без минуса. Личка пользователя доступна по его ИД (это не имя пользователя, можно узнать через бота «@userinfobot»)
Дока
Есть понятие инлайн-бота, это специфика самого бота
#!/usr/bin/python3.8 import requests token ='123456789:aaaaaaaaaaaa' url = f'https://api.telegram.org/bot{token}/sendMessage' data = {'chat_id': '123321', 'text': 'this is message'} answer = requests.post(url, data).json() print(str(answer))
# Простая отправка сообщения: curl -s -X POST https://api.telegram.org/bot1074186011:AAAAAAAAA/sendMessage -d chat_id="-7511111" -d text="Hallo Warld" # Изменить сообщение: curl -s -X POST https://api.telegram.org/bot1074186011:AAAAAAAAA/editMessageText -d chat_id="-7511111" -d message_id="100921" -d text="Hello World"