====== Telegram ====== ===== pyTelegramBotAPI ===== Модуль для работы с "TelegramBotAPI" используя python\\ [[https://github.com/eternnoir/pyTelegramBotAPI|Вот точно дока]]\\ [[https://pypi.org/project/pyTelegramBotAPI/|Дока]]\\ [[https://pytba.readthedocs.io/en/latest/quick_start.html#asynchronous-telebot|Еще дока]]\\ 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): ==== Reply Keyboard Markup ==== [[https://habr.com/ru/post/580408/|Простой пример с ботом и кнопки в т.ч.]]\\ [[https://surik00.gitbooks.io/aiogram-lessons/content/chapter5.html|Статья по кнопкам\\]] Этот тип кнопок добавляется один раз на постоянку, справа в поле ввода, по аналогии с меню командами\\ В аргументах есть так же помимо "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()" так же добавляет кнопки но на размер ему побоку\\ ==== Inline Keyboard Markup ==== Эти кнопки прикрепляются к сообщению, можно как отправлять с новым сообщением так и изменять их при редактировании, благодаря этому можно сделать динамическое меню\\ При обработке необходимо вызвать метод **"answerCallbackQuery"**\\ [[https://pytba.readthedocs.io/en/latest/util.html#telebot.util.quick_markup|Дока]]\\
:!: Грубый пример #!/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()
===== Overall ===== [[https://core.telegram.org/bots/api#sendmessage|Дока]] В поле "chat_id" пишется ID чата/канала/пользователя. Минусом предваряется ИД канала, простой чат без минуса. Личка пользователя доступна по его ИД (это не имя пользователя, можно узнать через бота "@userinfobot")\\ ==== Inline bot ==== [[https://telegram.org/blog/inline-bots|Дока]]\\ Есть понятие инлайн-бота, это специфика самого бота\\
:!: Минимальный бот #!/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"