Многоуровневая клавиатура как у BotFather в Телеграм для чат бота | multi-level inline keyboard

  Рет қаралды 21,340

RedRainbowGuy

RedRainbowGuy

5 жыл бұрын

#python 3.6
#telegram
#keyboard
_______________________
import telebot
from telebot import types
token = "your token"
bot = telebot.TeleBot(token)
@bot.message_handler(content_types=["text"])
def any_msg(message):
keyboardmain = types.InlineKeyboardMarkup(row_width=2)
first_button = types.InlineKeyboardButton(text="1button", callback_data="first")
second_button = types.InlineKeyboardButton(text="2button", callback_data="second")
keyboardmain.add(first_button, second_button)
bot.send_message(message.chat.id, "testing kb", reply_markup=keyboardmain)
@bot.callback_query_handler(func=lambda call:True)
def callback_inline(call):
if call.data == "mainmenu":
keyboardmain = types.InlineKeyboardMarkup(row_width=2)
first_button = types.InlineKeyboardButton(text="1button", callback_data="first")
second_button = types.InlineKeyboardButton(text="2button", callback_data="second")
keyboardmain.add(first_button, second_button)
bot.edit_message_text(chat_id=call.message.chat.id,message_id=call.message.message_id, text="menu",reply_markup=keyboardmain)
if call.data == "first":
keyboard = types.InlineKeyboardMarkup()
rele1 = types.InlineKeyboardButton(text="1t", callback_data="1")
rele2 = types.InlineKeyboardButton(text="2t", callback_data="2")
rele3 = types.InlineKeyboardButton(text="3t", callback_data="3")
backbutton = types.InlineKeyboardButton(text="back", callback_data="mainmenu")
keyboard.add(rele1, rele2, rele3, backbutton)
bot.edit_message_text(chat_id=call.message.chat.id,message_id=call.message.message_id, text="replaced text",reply_markup=keyboard)
elif call.data == "second":
keyboard = types.InlineKeyboardMarkup()
rele1 = types.InlineKeyboardButton(text="another layer", callback_data="gg")
backbutton = types.InlineKeyboardButton(text="back", callback_data="mainmenu")
keyboard.add(rele1,backbutton)
bot.edit_message_text(chat_id=call.message.chat.id,message_id=call.message.message_id, text="replaced text",reply_markup=keyboard)
elif call.data == "1" or call.data == "2" or call.data == "3":
bot.answer_callback_query(callback_query_id=call.id, show_alert=True, text="alert")
keyboard3 = types.InlineKeyboardMarkup()
button = types.InlineKeyboardButton(text="lastlayer", callback_data="ll")
keyboard3.add(button)
bot.edit_message_text(chat_id=call.message.chat.id,message_id=call.message.message_id, text="last layer",reply_markup=keyboard3)
if _name_ == "__main__":
bot.polling(none_stop=True)

Пікірлер: 151
@programmer4240
@programmer4240 Жыл бұрын
В коде в описании ошибка небольшая, вокруг name должно быть по два подчеркивания
@redrainbowguy
@redrainbowguy Жыл бұрын
markdown, похоже, воспринял как italic
@rrginc.43
@rrginc.43 5 жыл бұрын
Очень годно! Только что была решена моя ночная проблема:) Спасибо большое!)
@thebrussicx6747
@thebrussicx6747 5 жыл бұрын
Просто ТОП! Спасибо за помощь;)
@chelgames_off
@chelgames_off Жыл бұрын
Имба. Я начал отчаиваться, но найдя тебя додумался до способа реализации. Спасибо
@voivashchenko
@voivashchenko 3 жыл бұрын
Наконец-то все стало понятно! Спасибо!
@justproger9029
@justproger9029 4 жыл бұрын
Спасибо! Ты мне очень помог, от меня лайк :)
@guitar_hedonist
@guitar_hedonist 3 жыл бұрын
Четко и по делу. Именно так инструкции писать надо!
@user-vn4wi1zo7e
@user-vn4wi1zo7e 4 жыл бұрын
СПАСИБО БОЛЬШЕ!!! Очень помог!
@amantayismanov3335
@amantayismanov3335 4 жыл бұрын
Реально классное видео!
@alexlozovoy400
@alexlozovoy400 5 жыл бұрын
Большое тебе спасибо!)
@user-jh3zx4td4b
@user-jh3zx4td4b Жыл бұрын
от души душевно в душу, выручил очень
@user-vo8il4ee5z
@user-vo8il4ee5z 4 жыл бұрын
Хоть проблем у меня с этим не было, но все равно было очень интересно и годно. Лайк.
@KGamesProita
@KGamesProita 3 жыл бұрын
Dude y are awesome keep publish
@praisethewhiterabbit5112
@praisethewhiterabbit5112 4 жыл бұрын
Боже, ты прямо спас, мало инфы по тому, как работают хендлеры в этой либе Примеров тоже нет толком Я вот, например, даже не подозревал, что callback query handler уже зациклен и сидел пердолился с написанием цикла вывода кнопок и каждый раз облом Огромное спасибо
@user-hl2li9hl7b
@user-hl2li9hl7b Жыл бұрын
Спасибо большое
@exganza
@exganza 3 жыл бұрын
Super useful thank you 👍👍👍👍👍
@ProfessorHoffman
@ProfessorHoffman 4 жыл бұрын
Thank you! this helped me solve a problem I was stuck on
@redrainbowguy
@redrainbowguy 4 жыл бұрын
Thank! If you encounter the problem of custom keyboards, then go to the aiogram library or another similar one, where the json generation is manual (you need to create your own keyboard object generator).
@redrainbowguy
@redrainbowguy 4 жыл бұрын
*already left due to inflexibility
@ProfessorHoffman
@ProfessorHoffman 4 жыл бұрын
@@redrainbowguy thank you bro! I really appreciate your help and input
@CrocodileGene
@CrocodileGene 3 жыл бұрын
Хорошо сделал
@user-ps9gj5zy9d
@user-ps9gj5zy9d 2 жыл бұрын
Ты крут!!
@djstreamtme
@djstreamtme 4 жыл бұрын
Ты Бог!
@praisethewhiterabbit5112
@praisethewhiterabbit5112 4 жыл бұрын
Можно сделать еще проще и удобнее: Лямбда функция - это функция, в первую очередь. Туда можно и запихать проверку call.data. @bot.callback_query_handler(func=lambda call: call.data == 'something') def function(call): Так на каждую кнопку можно по отдельной функции создать и становится гораздо удобнее ориентироваться
@praisethewhiterabbit5112
@praisethewhiterabbit5112 4 жыл бұрын
с большим многоуровневым меню дерево из elif'ов реально неудобно смотрится
@redrainbowguy
@redrainbowguy 4 жыл бұрын
Да, в моем проекте так и есть. Но для демонстрации счёл правильным такой способ изложения. В упрощение восприятия
@praisethewhiterabbit5112
@praisethewhiterabbit5112 4 жыл бұрын
@@redrainbowguy это тоже рабочий вариант, можно потом будет дополнить и добавить видео про лямбда функцию, если ты хочешь записывать туториалы в дальнейшем)
@redrainbowguy
@redrainbowguy 4 жыл бұрын
@@praisethewhiterabbit5112 Идея отличная - видео в планах
@praisethewhiterabbit5112
@praisethewhiterabbit5112 4 жыл бұрын
@@redrainbowguy подписался на канал) По этой либе очень мало туториалов, можно очень много контента наделать Удачи с:
@efe-zg5zj
@efe-zg5zj 3 жыл бұрын
спасибо
@bukovynskiy
@bukovynskiy 3 жыл бұрын
Спасибо , надеюсь это поможет мне сделать что-то с мооим ботом
@arismiatov
@arismiatov 4 жыл бұрын
Подскажите пожалуйста, с InlineKeyboardMarkup нельзя назначать следующий шаг bot.register_next_step_handler, тут просто работать с значениями call.data и с if / else?
@redrainbowguy
@redrainbowguy 4 жыл бұрын
Насколько знаю, в pyTelegramBotApi такого функционала нет
@user-sr1ij3hw4r
@user-sr1ij3hw4r 2 жыл бұрын
good
@artemserdechnyy3209
@artemserdechnyy3209 4 жыл бұрын
Видео полезное, жаль что так мало
@redrainbowguy
@redrainbowguy 4 жыл бұрын
А что хотелось бы?
@artemserdechnyy3209
@artemserdechnyy3209 4 жыл бұрын
@@redrainbowguy например про ту же самую лямбду, или как реализовать удаление использованных инлайнов из истории сообщений
@mnihil938
@mnihil938 2 жыл бұрын
Gracias / Спасибо
@ramiltaghiyev9712
@ramiltaghiyev9712 4 жыл бұрын
Автор, привет! Видео просто супер,нет слов ,ты нереально помог, никаких вопросов нет ещё и код в описании вот прям супер.Хочу узнать только одно-название первой песни в видео,я посмотрел в шазаме что это traveler-hip hop ninja ,но найти не смог,буду признателен если дадите ссылку,не обязательно на Ютуб, благодарю
@redrainbowguy
@redrainbowguy 4 жыл бұрын
E Кое-как нашел kzfaq.info/get/bejne/fbmDl7upztOoZ5c.html
@redrainbowguy
@redrainbowguy 4 жыл бұрын
Moldy Lotion Light Foot
@ramiltaghiyev9712
@ramiltaghiyev9712 4 жыл бұрын
@@redrainbowguy спасибо огромное!
@user-lt8wl5or4m
@user-lt8wl5or4m 4 жыл бұрын
Я возможно сейчас сотворю некропост, но можно вопросик? Что делает if __name__ == "__main__"? Я понимаю что это дословно значит если 1 == 2 то, но что означают сами имена?
@redrainbowguy
@redrainbowguy 4 жыл бұрын
Насколько знаю, после запуска программы модулю присваивается имя __main__ в случае, если он текущий. Иначе - название этого модуля Получается, что, запуская функции из текущего кода, мы получаем цикл, а из стороннего - только доступ к функциям
@redrainbowguy
@redrainbowguy 4 жыл бұрын
medium.com/nuances-of-programming/%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F-name-%D0%B2-python-2225784c0fef
@user-lt8wl5or4m
@user-lt8wl5or4m 4 жыл бұрын
@@redrainbowguy Спасибо
@user-rr7iy3hw1s
@user-rr7iy3hw1s Жыл бұрын
Как сделать так, чтобы бот в ответ отправлял файл? Например, после нажатия кнопки second из примера?
@redrainbowguy
@redrainbowguy Жыл бұрын
stackoverflow.com/questions/71234170/how-to-send-a-document-to-a-telegram-bot-using-pytelegrambotapi pytba.readthedocs.io/en/latest/sync_version/index.html?highlight=send_document#telebot.TeleBot.send_document
@kalinadv
@kalinadv 2 жыл бұрын
а как на счет aiogram-pagination библиотеки? Нужны примеры, не доганяется что-то вообще ((((((
@redrainbowguy
@redrainbowguy 8 ай бұрын
Поздновато, но все же. Получилось разобраться?
@Wladismann
@Wladismann 2 жыл бұрын
А как сделать так чтобы при нажатии на кнопку он удалял нажатую кнопку которые к примеру в этом видео 1 2 3 и новым сообщением отправлял картинку, под которой будет например кнопка назад вместе с отправленной картинкой или отдельным сообщением И при нажатии кнопки назад он удалял отпраленную картинку и кнопку назад возвращая к главному меню или новым сообщением оправлял главное меню, удаляя только кнопку назад??? Было бы очень здорово посмотреть такой пример.
@redrainbowguy
@redrainbowguy 2 жыл бұрын
В видео дана исчерпывающая информация о том, как сделать многоуровневую клавиатуру для бота в телеграм. Если вы хотите переопределить работу каких-либо кнопок, пропишите через if-else дополнительную логику. Информация о том, как отправлять фото, есть в этой документации github.com/eternnoir/pyTelegramBotAPI#methods
@Wladismann
@Wladismann 2 жыл бұрын
@@redrainbowguy да не, я чайник просто и не совсем понимаю логику всего. Как китайский язык. Квадрат в круг, многоугольник в треугольник у меня получается на практике.
@redrainbowguy
@redrainbowguy 2 жыл бұрын
@@Wladismann "А как сделать так чтобы при нажатии на кнопку он удалял нажатую кнопку которые к примеру в этом видео 1 2 3" - храните в базе данных или любом другом виде текущее состояние для пользователя (база данных из id пользователей, текущей клавиатуры (клавиатуру можно хранить как список множеств, в каждом из которых - название и callback). При нажатии на кнопку вытаскиваете из бд клавиатуру (список), делаете удаление элемента по callback (через for можно пробежаться я найти множество с callback нажатой кнопки. Этот элемент удалить нужно). Создаете по списку цикл, который делает add_button(list[i][0], list[i][1]) в макет (list[i][0], list[i][1] - первый и второй элемент множества из списка. В нем название и callback, как писал выше). Отправляете edit_message с новой клавиатурой и айдишником сообщения из callback_query "новым сообщением отправлял картинку, под которой будет например кнопка назад вместе с отправленной картинкой или отдельным сообщением" - отправляете картинку через send_photo с кнопкой "назад". А потом в обработчике ответов создаете if (callback.data == "какой-то callback кнопки НАЗАД"): и в теле условия отправляете edit_message с клавиатурой, которую можно, как в примере выше, собрать из базы данных. Ведь нужно знать только название кнопки и ее callback
@redrainbowguy
@redrainbowguy 2 жыл бұрын
@@Wladismann "я чайник просто и не совсем понимаю логику всего. Как китайский язык. Квадрат в круг, многоугольник в треугольник у меня получается на практике." - тогда лучше для начала изучить типы данных, функции, условия, циклы, классы
@infiniteeeeee
@infiniteeeeee 3 жыл бұрын
При переходе во внутренние слои меню, кнопки предыдущих слоев не убираются, а при возвращении назад, добавляются кнопки вниз друг за другом. Как это исправить?
@redrainbowguy
@redrainbowguy 3 жыл бұрын
Нужен код. Скорее всего, переменная клавиатуры используется повторно с добавлением в нее новых кнопок
@infiniteeeeee
@infiniteeeeee 3 жыл бұрын
@@redrainbowguy код идентичен вашему, я не знаю в чем может быть проблема
@redrainbowguy
@redrainbowguy 3 жыл бұрын
@@infiniteeeeee Хм.. даже не знаю. Запустил только что код из под видео - никаких проблем. Библиотека новой версии, питон 3.8
@avatarcybertronics2584
@avatarcybertronics2584 4 жыл бұрын
Интересует как сделать аналог чекбокса: чтобы надпись на кнопке менялась как будто ее выбрали. И при этом можно было выбрать несколько вариантов нажатием на кнопки. Сейчас невозможно от юзера принять несколько опций ответа никак - меняется одна кнопка от коллбека, но не несколько независимо.
@redrainbowguy
@redrainbowguy 4 жыл бұрын
Это вполне легко. Но не в данной библиотеке. Переходите на aiogram или другую подобную. Клавиатура - это словарь, насколько помню, который представлен в виде JSON. Пишете кастомный заполнитель для этого объекта: вытаскивате код для генерации и допиливаете его под свою задачу. Ну.. дальше прикрутить базу данных можно или временную память, если задача такова - всё: Допустим, наши кнопки хранятся как массив словарей: buttons(values), где в каждом словаре объекта кнопки хранятся ключи: "text": String, "isChecked": Boolean. Пользователь нажимает на кнопку, данные сохраняются и запускается таск на callback этому нажатию. Из базы данных через цикл выгружаются значения пунктов и генерируется json data object. Ну.. а потом этот запрос просто отправить через средства библиотеки. Суть в генераторе. Советую поискать в Гугле "telegram bot json", "telegram bot request" Очень рекомендую вскрыть библиотеку и разобраться в том, как создаётся запрос (ту же pytelebotapi)
@redrainbowguy
@redrainbowguy 4 жыл бұрын
Да. Генерация JSON очень проста. Там для минимального POST, вроде, 3-4 ключа надо (сообщение, текст)
@redrainbowguy
@redrainbowguy 4 жыл бұрын
Ах да, забыл написать. При первичном создании кнопок, они могут сохраняться со значением false у ключа "isChecked". А при повторном нажатии оно просто будет вытаскиваться, инвертироваться через isChecked = !isChecked (ну.. что-то подобное), а потом обратно помещаться
@redrainbowguy
@redrainbowguy 4 жыл бұрын
Насчёт надписи, думаю, понятно. В генераторе условие if (isChecked): text += " ✔️" else: text += "❌" (Что-то подобное) И упаковать в JSON
@avatarcybertronics2584
@avatarcybertronics2584 4 жыл бұрын
@@redrainbowguy Несколько смущает, что в этой либе это нельзя сделать) интересно почему так. А что насчет python-telegram-bot ? Мне кажется тот вариант что вы описали можно провернуть и в telebot : как я понял хак состоит в том, чтобы сделать типа генератора кода, который делает клавиатуру на лету из данных из базы. И эту клавиатуру менять сразу целиком, то есть обновлять сразу все кнопки, но часть кнопок будет обновлена на старые данные и юзеру будет казаться, что он нажал одну или 2 кнопки.
@vladislavr.1385
@vladislavr.1385 3 жыл бұрын
Подскажи пожалуйста, как эти кнопки выводить после какого то текста, а не перед ним?
@redrainbowguy
@redrainbowguy 3 жыл бұрын
Если в значении "как отправлять клавиатуру после определенного сообщения" - def any_msg(message): - просто указать, чтобы message.text равнялся нужному слову через if. Ну а внутри этого условия возвращать клавиатуру
@triplenine5761
@triplenine5761 4 жыл бұрын
Такой вопрос: Можно ли как-то сделать так, чтобы пользователь (админ) мог добавлять пункты меню и их содержимое через сам бот?
@redrainbowguy
@redrainbowguy 4 жыл бұрын
Логика такая: Для начала выносим создание клавиатуры в отдельную функцию и прописываем импорт файла .py Создание клавиатуры через функцию, которая принимает: 1) Название кнопки 2) Callback кнопки 3) Id клавиатуры (можно использовать название функции для создания клавиатуры) Пусть главная функция переписывает файл с функциями для создания клавиатур так, чтобы добавлять к уже имеющимся дополнительные кнопки или новые клавиатуры
@redrainbowguy
@redrainbowguy 4 жыл бұрын
Думаю, проще написать фраемворк для этого. Информации про динамическое изменение кода очень мало. Возможность есть. Нужна программа, которая перепишет файл с функциями клавиатур, сохранит его, перезапустит основной .py
@triplenine5761
@triplenine5761 4 жыл бұрын
@@redrainbowguy Спасибо большое! Попробую реализовать
@redrainbowguy
@redrainbowguy 4 жыл бұрын
Есть идея
@redrainbowguy
@redrainbowguy 4 жыл бұрын
Так как кнопки представляют из себя объект словаря {'key':'value'} (или список, я, честно говоря, не помню), то можно написать адаптер добавления кнопки, который будет создавать словарь и добавлять в него кнопки (через сообщения), а затем мы пишем Bot.send_message(reply_markup = keyboard), где keyboard - это наш список/словарь с кнопками, импортированный из файла
@modescult
@modescult 4 жыл бұрын
Можно ли сделать такую же многоуровневость с обычными кнопками(ReplyKeyboardMarkup)?
@redrainbowguy
@redrainbowguy 4 жыл бұрын
Да, можете поискать на KZfaq
@redrainbowguy
@redrainbowguy 4 жыл бұрын
kzfaq.info/get/bejne/o8x1ladqz96akYk.html Например
@thebrussicx6747
@thebrussicx6747 5 жыл бұрын
Ребята, если у вас не получается писать текст на русском, то сверху "import telebot" напишите "#_8_ coding: utf-8 _8_"(вместо "8" напишите "*") без ковычек! Благодорить не стоит!
@ErthSunOfPlanet
@ErthSunOfPlanet 3 жыл бұрын
Спасибо за код! Если есть возможность ответьте пожалуйста. Впервые пишу бота есть проблема, когда пользователь запускает бота по команде старт бот должен спросить человека может ли он ответить на несколько вопросов с инлайновой клавиватурой да / нет. Проблема в том что я после ответа на все вопросы хочу и отправить пользователю с потверждением данные которые он ввёл. Где и как хранить информацию полученную от пользователя? Как её отправлять ему помогите пожалуйста советом!(
@redrainbowguy
@redrainbowguy 3 жыл бұрын
Хранить можно, к примеру, в словаре при помощи библиотеки Json. Или в базе данных при помощи sqlite3. Оба модуля встроенные. В качестве ключа - id пользователя, а значения - список (массив) с данными (но, желательно, тоже словарь) { "2848852" : { . . ."first_question": "first_answer", . . ."second_question" : "second_answer" . . .} }
@redrainbowguy
@redrainbowguy 3 жыл бұрын
Получили ответ - проверили текущий вопрос и воткнули в нужную ячейку. И так с каждым
@ErthSunOfPlanet
@ErthSunOfPlanet 3 жыл бұрын
@@redrainbowguy Спасибо огромное!
@user-xx2cb8nk9d
@user-xx2cb8nk9d 4 жыл бұрын
AttributeError: 'Message' object has no attribute 'message' не работаетт
@redrainbowguy
@redrainbowguy 4 жыл бұрын
Без кода будет сложно ответить, так что как насчёт отправить его, если следующий совет не поможет? Насколько понимаю, переменная Message -> dict, не имеющий в себе ключа message В телеграме идёт обмен JSON, состоящим из: {"ok":"", "result":{"update_id":"", "message":"from":"", "chat":"" }} и тп. Т.е. внутри ключа message находится словарь, не имеющий "message". Если проблема в этом, то для решения нужно перечитать документацию или установить idle Intellij IDEA, которая выносит возможное продолжение при введении кода. Вот пример парсинга message в этой библиотеки: message.text message.chat.id
@alexlozovoy400
@alexlozovoy400 5 жыл бұрын
Как сделать так, что бы от кнопки меню снизу(ReplyKeyboardMarkup), ответом было панель кнопок в чате(InlineKeyboardMarkup)
@redrainbowguy
@redrainbowguy 5 жыл бұрын
Написать в if call.data == "значение": ответ с inline клавиатурой. Самое главное - не изменять сообщения, а отправить новое: Bot.send_message(message.chat.id, "текст сообщения", reply_markup= названиеКлавиатуры) __.__.__ Также и наоборот. Необходимо, чтобы в условии создавалась необходимая клавиатура. Отличается от способа из видео лишь командами в написании
@alexlozovoy400
@alexlozovoy400 5 жыл бұрын
@@redrainbowguy Извини если я задаю тупые вопросы, я в написании кода новичок.. Я ниже скину код панели что у меня есть, можешь, пожалуйста, показать как сделать так, что бы ответом на кнопку "1.2, 1" выскакивала смс от бота с клавиатурой под этим смс как у тебя на видео. Буду тебе очень благодарен, я уже 3 часа сижу и не могу это сделать _______ @bot.message_handler(commands=["start"]) def handle_start(message): user_markup = telebot.types.ReplyKeyboardMarkup(True, True) user_markup.row("1.1", "1.2") user_markup.row("2.1", "2.2") user_markup.row("3") send = bot.send_message(message.from_user.id, "start текст", reply_markup=user_markup) bot.register_next_step_handler(send, second) def second(message) : if message.text == "1.1": user_markup = telebot.types.ReplyKeyboardMarkup(True, True) user_markup.row("1.1, 1.1", "1.1, 1.2") user_markup.row("1.1, 2.1", "1.1, 2.2") user_markup.row("◀ К главному меню") send = bot.send_message(message.from_user.id, "1.1 текст", reply_markup=user_markup) bot.register_next_step_handler(send, third) elif message.text == "1.2": user_markup = telebot.types.ReplyKeyboardMarkup(True, True) user_markup.row("1.2, 1") user_markup.row("1.2, 2") user_markup.row("◀ К главному меню") send = bot.send_message(message.from_user.id, "1.2 текст", reply_markup=user_markup) bot.register_next_step_handler(send, third) elif message.text == "2.1": user_markup = telebot.types.ReplyKeyboardMarkup(True, True) user_markup.row("2.1, 1") user_markup.row("2.1, 2") user_markup.row("2.1, 3.1", "2.1, 3.2", "2.1, 3.3") user_markup.row("◀ К главному меню") send = bot.send_message(message.from_user.id, "2.1 текст", reply_markup=user_markup) bot.register_next_step_handler(send, third) elif message.text == "2.2": user_markup = telebot.types.ReplyKeyboardMarkup(True, True) user_markup.row("2.2, 1.1", "2.2, 1.2") user_markup.row("2.2, 2") user_markup.row("◀ К главному меню") send = bot.send_message(message.from_user.id, "2.2 текст", reply_markup=user_markup) bot.register_next_step_handler(send, third) elif message.text == "3": bot.send_message(message.from_user.id, "3 текст") def third(message): if message.text == "◀ К главному меню": handle_start(message)
@redrainbowguy
@redrainbowguy 5 жыл бұрын
@@alexlozovoy400 ?
@redrainbowguy
@redrainbowguy 5 жыл бұрын
@@alexlozovoy400 @bot.message_handler(commands=["start"]) def handle_start(message): user_markup = telebot.types.ReplyKeyboardMarkup(True, True) user_markup.row("1.1", "1.2") user_markup.row("2.1", "2.2") user_markup.row("3") send = bot.send_message(message.from_user.id, "start текст", reply_markup=user_markup) bot.register_next_step_handler(send, second) def second(message) : if message.text == "1.1": user_markup = telebot.types.ReplyKeyboardMarkup(True, True) user_markup.row("1.1, 1.1", "1.1, 1.2") user_markup.row("1.1, 2.1", "1.1, 2.2") user_markup.row("◀ К главному меню") send = bot.send_message(message.from_user.id, "1.1 текст", reply_markup=user_markup) bot.register_next_step_handler(send, third) elif message.text == "1.2": user_markup = telebot.types.ReplyKeyboardMarkup(True, True) user_markup.row("1.2, 1") user_markup.row("1.2, 2") user_markup.row("◀ К главному меню") send = bot.send_message(message.from_user.id, "1.2 текст", reply_markup=user_markup) bot.register_next_step_handler(send, third) elif message.text == "2.1": user_markup = telebot.types.ReplyKeyboardMarkup(True, True) user_markup.row("2.1, 1") user_markup.row("2.1, 2") user_markup.row("2.1, 3.1", "2.1, 3.2", "2.1, 3.3") user_markup.row("◀ К главному меню") send = bot.send_message(message.from_user.id, "2.1 текст", reply_markup=user_markup) bot.register_next_step_handler(send, third) elif message.text == "2.2": user_markup = telebot.types.ReplyKeyboardMarkup(True, True) user_markup.row("2.2, 1.1", "2.2, 1.2") user_markup.row("2.2, 2") user_markup.row("◀ К главному меню") send = bot.send_message(message.from_user.id, "2.2 текст", reply_markup=user_markup) bot.register_next_step_handler(send, third) elif message.text == "3": bot.send_message(message.from_user.id, "3 текст") def third(message): if message.text == "◀ К главному меню": handle_start(message) ################################################################# elif message.text == "1.2, 1": keyboard = types.InlineKeyboardMarkup(row_width=2) first_button = types.InlineKeyboardButton(text="первая кнопка", callback_data="FIRST_CALLBACK") second_button = types.InlineKeyboardButton(text="вторая кнопка", callback_data="SECOND_CALLBACK") back_button = types.InlineKeyboardButton(text="◀ К главному меню", callback_data="back") keyboard.add(first_button, second_button) keyboard.add(back_button) bot.send_message(message.chat.id, "на уровень ниже", reply_markup=keyboard) ################################################################ if __name__ == "__main__": bot.polling(none_stop=True)
@alexlozovoy400
@alexlozovoy400 5 жыл бұрын
@@redrainbowguy пасибаа))
@user-yh5rc3mi1d
@user-yh5rc3mi1d Жыл бұрын
лайк за код
@user-lp5gs4zm5n
@user-lp5gs4zm5n 4 жыл бұрын
А как выровнять текст в inline кнопках по левой стороне?
@redrainbowguy
@redrainbowguy 4 жыл бұрын
Разве API такое поддерживает?
@user-lp5gs4zm5n
@user-lp5gs4zm5n 4 жыл бұрын
@@redrainbowguy Нет( Уже узнал ответ.
@user-lp5gs4zm5n
@user-lp5gs4zm5n 4 жыл бұрын
@@redrainbowguy Привет! Мне нужна помощь, у тебя есть телеграм/vk?
@user-ur9ip8rx7c
@user-ur9ip8rx7c 3 жыл бұрын
а можно как-нибудь просто заменить значение на одной кнопке не создавая новую клавиатуру
@redrainbowguy
@redrainbowguy 3 жыл бұрын
API телеграма допускает замену лишь всей клавиатуры, так что для замены значения одной кнопки необходимо отправить экземпляр всей клавиатуры
@gaky4828
@gaky4828 3 жыл бұрын
выдает ошибку: ERROR - TeleBot: "A request to the Telegram API was unsuccessful. Error code: 400. Description: Bad Request: can't parse inline keyboard button: Text buttons are unallowed in the inline keyboard"
@redrainbowguy
@redrainbowguy 3 жыл бұрын
Если перевести на русский, получится: "кнопка имеет текст, запрещенный для inline клавиатуры". Как вы пытались назвать ее?
@gaky4828
@gaky4828 3 жыл бұрын
@@redrainbowguy а можно ваш телеграмм, я вам все подробно распишу
@gaky4828
@gaky4828 3 жыл бұрын
@@redrainbowguy ну а так, вот мой код на git github.com/TheGaky/CzehcEmbassy_bot
@redrainbowguy
@redrainbowguy 3 жыл бұрын
@@gaky4828 проверьте кнопку covid-19. Вероятно, "-" - проблема
@gaky4828
@gaky4828 3 жыл бұрын
@@redrainbowguy вообще после добавления callback_query_handlers, появилась новая ошибка @bot.callback_query_handlers(func = lambda call:True) TypeError: 'list' object is not callable
@b_b.podcast
@b_b.podcast 3 жыл бұрын
Есть вопрос как записать inline текст на dictionary
@redrainbowguy
@redrainbowguy 3 жыл бұрын
А в чем задача? Не совсем понятно, какой словарь
@b_b.podcast
@b_b.podcast 3 жыл бұрын
@@redrainbowguy а для маленького ресторана чтобы принимать заказы дома просто 35 блюд,7 категории и подумал лучше inline
@b_b.podcast
@b_b.podcast 3 жыл бұрын
@@redrainbowguy bot будет отправлять в группу адрес,телефон, имя и что он заказал
@redrainbowguy
@redrainbowguy 3 жыл бұрын
Нужно создавать клавиатуру из словаря? Если да, то достаточно сделать цикл, который добавляет кнопки с названием товара, а callback приписывает из тех же баз данных
@redrainbowguy
@redrainbowguy 3 жыл бұрын
@@b_b.podcast Использовать json, где под ключом user_id хранить значения, которые потом нужно будет через bot_sendmessage отправить в нужный чат
@vaynakhguitar
@vaynakhguitar 3 жыл бұрын
можно название второй музыки?
@redrainbowguy
@redrainbowguy 3 жыл бұрын
Наконец-то зашазамилась... kzfaq.info/get/bejne/q8t_nJik0a-5Ynk.html
@redrainbowguy
@redrainbowguy 3 жыл бұрын
Fredji - Flying High
@iatwuksfs5455
@iatwuksfs5455 4 жыл бұрын
Несомненна код полезный, но логику я до конца не понимаю, где ее можно изучить подробно?
@redrainbowguy
@redrainbowguy 4 жыл бұрын
Библиотека занимается парсингом json, позволяет генерировать post запросы и тд. Ну а хэндлеры - botpolling через try{}. Можно зайти в Site-packages и изучить файлы telebot. Или github.com/eternnoir/pyTelegramBotAPI/blob/master/README.md
@iatwuksfs5455
@iatwuksfs5455 4 жыл бұрын
@@redrainbowguy Спасибо за информацию. Но делаю кнопки вроде так как нужно, но все равно возникают проблемы такое как AttributeError: 'CallbackQuery' object has no attribute 'date'.
@iatwuksfs5455
@iatwuksfs5455 4 жыл бұрын
@@redrainbowguy @bot.callback_query_handler(func=lambda call: True) def callback_inline(call): if call.data == "main": keyboardmain = types.InlineKeyboardMarkup(row_width=2) first_button = types.InlineKeyboardButton(text="send", callback_data="send") keyboardmain.add(first_button) bot.edit_message_text(chat_id=call.message.chat.id,message_id=call.message.message_id, text="menu",reply_markup=keyboardmain) if call.date == "send": #Вот на этом моменте уже проблема. После нажатие на кнопку send(first_button) keyboardmain = types.InlineKeyboardMarkup(row_width=2) first_button = types.InlineKeyboardButton(text="send", callback_data="send2") keyboardmain.add(first_button) bot.edit_message_text(chat_id=call.message.chat.id,message_id=call.message.message_id, text="menu 2",reply_markup=keyboardmain)
@redrainbowguy
@redrainbowguy 4 жыл бұрын
В "if call.date == "send":" нужно исправить date на data
@redrainbowguy
@redrainbowguy 4 жыл бұрын
@@iatwuksfs5455 @bot.callback_query_handler(func=lambda call:True) def callback_inline(call): if call.data == "main": keyboardmain = types.InlineKeyboardMarkup(row_width=2) first_button = types.InlineKeyboardButton(text="send", callback_data="send") keyboardmain.add(first_button) bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="menu", reply_markup=keyboardmain) if call.data == "send": # Вот на этом моменте уже проблема. После нажатие на кнопку send(first_button) keyboardmain = types.InlineKeyboardMarkup(row_width=2) first_button = types.InlineKeyboardButton(text="send", callback_data="send2") keyboardmain.add(first_button) bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="menu 2", reply_markup=keyboardmain)
@millyardchatv
@millyardchatv 2 жыл бұрын
Где код?
@redrainbowguy
@redrainbowguy 2 жыл бұрын
В описании
@user-uc1qz8oq9h
@user-uc1qz8oq9h 4 жыл бұрын
круто, но одно видео в год это лажа, а не канал
@redrainbowguy
@redrainbowguy 4 жыл бұрын
Странно полагать, что каждый, кто имеет канал, обязан выкладывать видео регулярно. Это не работа. По крайней мере для меня
@user-uc1qz8oq9h
@user-uc1qz8oq9h 4 жыл бұрын
@@redrainbowguy да не, не обязан) но видно что толковые видосы, хочется побольше контента
@user-lp5gs4zm5n
@user-lp5gs4zm5n 4 жыл бұрын
Срочно нужна помощь, нужно добавить товар с помощью sendInvoice, использую модуль pyTelegramBotAPI. Нужно создать товар, привязать все к ЯндексКассе, как привязать это все к ЯндексКассе я понял, а как его создать - нет. Знаю, что должно получиться все как-то вот так: @bot.message_handler(content_types=['text']) def send_text(message): if message.text == 'Салюты💥': bot.send_Invoice( message.chat.id, 'Салют Новогоднее приключение (13 х 0.8)', 'Батарея салютов на 12 залпов калибром 20 мм эффекты: золотистая и красная пальмы+ ива+ треск+облако.', 'payload', '381764678:TEST:12809', 'SOME_RANDOM_STRING_KEY', 'RUB', [ { label: 'Салют Новогоднее приключение (13 х 0.8)', amount: 60000 } ] ) Но так не получается(
@redrainbowguy
@redrainbowguy 4 жыл бұрын
Сейчас занимаюсь разработкой на андроид, поэтому отложил изучение бота. Информацию поищу, но почему бы не задать этот вопрос на stack overflow и подобных сайтах?
@user-lp5gs4zm5n
@user-lp5gs4zm5n 4 жыл бұрын
@@redrainbowguy Спрашивал на разных форумах, игнор. Мне очень срочно нужно узнать эту информацию, заказчик ждет.
@user-lp5gs4zm5n
@user-lp5gs4zm5n 4 жыл бұрын
@@redrainbowguy Дай мне свой вк или телеграм. За ответ на мой вопрос я готов заплатить.
@redrainbowguy
@redrainbowguy 4 жыл бұрын
@@user-lp5gs4zm5n github.com/eternnoir/pyTelegramBotAPI/blob/master/examples/payments_example.py
@redrainbowguy
@redrainbowguy 4 жыл бұрын
@@user-lp5gs4zm5n bot.send_invoice(message.chat.id, title='Working Time Machine', description='Want to visit your great-great-great-grandparents?' ' Make a fortune at the races?' ' Shake hands with Hammurabi and take a stroll in the Hanging Gardens?' ' Order our Working Time Machine today!', provider_token=provider_token, currency='usd', photo_url='erkelzaar.tsudao.com/models/perrotta/TIME_MACHINE.jpg', photo_height=512, # !=0/None or picture won't be shown photo_width=512, photo_size=512, is_flexible=False, # True If you need to set up Shipping Fee prices=prices, start_parameter='time-machine-example', invoice_payload='HAPPY FRIDAYS COUPON') На гитхабе есть примеры
How to send Telegram message from Python | Market Alert |Tradingview
8:31
Русалка
01:00
История одного вокалиста
Рет қаралды 7 МЛН
Despicable Me Fart Blaster
00:51
_vector_
Рет қаралды 24 МЛН
Mom's Unique Approach to Teaching Kids Hygiene #shorts
00:16
Fabiosa Stories
Рет қаралды 23 МЛН
Keyboard Shortcuts Every Programmer Should Know
12:33
Hallden
Рет қаралды 124 М.
I tried 10 code editors
10:28
Fireship
Рет қаралды 2,9 МЛН
Why I Don't Code in Haskell Anymore?
1:56
Tsoding Daily
Рет қаралды 118 М.
Русалка
01:00
История одного вокалиста
Рет қаралды 7 МЛН