Программирование ботов для тг на питоне - Общение Python мододелов

Вопрос Программирование ботов для тг на питоне

Регистрация
25 Авг 2013
Сообщения
79
Репутация
0
Спасибо
0
Монет
0
Всем привет!

У меня проблема, если поможете решить, буду благодарен.

Пишу бота для тг, ему нужна инлайн клава, пайчарм выдаёт ошибку на строчки : markup.add(item1, item2, item3, item4)



@bot.callback_query_handlers(func = lambda call: True ) пишет 'list' object is not callable, в чём проблема не знаю, ещё раз спасибо если поможете

вот весь код: import telebot

import config

from telebot import types



bot = telebot.TeleBot(config.Token)



@bot.message_handler(commands=['start'])

def wel(message):

bot.send_message(message.chat.id, "Добро пожаловать, {0.first_name}!\nКакой тип подписки желаете приобрести?".format(message.from_user, bot.get_me() ),

parse_mode='html', reply_markup= markup)

#keyboerd

markup = types.InlineKeyboardMarkup(row_width=4)

item1 = types.InlineKeyboardMarkup("3 месяца - 299 руб", callback_data = '1')

item2 = types.InlineKeyboardMarkup("6 месяцев - 499 руб", callback_data = '2')

item3 = types.InlineKeyboardMarkup("12 месяцев - 899 руб", callback_data = '3')

item4 = types.InlineKeyboardMarkup("Тех.поддержкаℹ️", callback_data = '4')

markup.add(item1, item2, item3, item4)



@bot.callback_query_handlers(func = lambda call: True )

def callback_inline(call):

try:

if call.message:

if call.data == '1':

bot.send_message(call.message.chat.id, 'ссылка')

elif call.data == '2':

bot.send_message(call.message.chat.id, "другая ссылка")

elif call.data == '3':

bot.send_message(call.message.chat.id, "последняя ссылка")

elif call.data == '4':

bot.send_message(call.message.chat.id, "ссылка на тех.поддержкуℹ️")

else:

bot.send_message(call.message.chat.id, "Выберете из предложенных вариантов")

bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="3 месяца - 299 руб",

reply_markup=None)

bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="6 месяцев - 499 руб",

reply_markup=None)

bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="12 месяцев - 899 руб",

reply_markup=None)

bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Тех.поддержкаℹ️",

reply_markup=None)



except Exception as e:

print(repr(e))







#run

bot.polling(none_stop=True)
 
Регистрация
1 Ноя 2013
Сообщения
99
Репутация
0
Спасибо
0
Монет
0
Точно не скажу, пишу с другой библиотекой, но InlineKeyboardMarkup это вроде как указывает на создание клавиатуры и там уже ее характеристики, в переменных item1, item2, item3, item3 у тебя должно быть InlineKeyboardButton
 
Регистрация
26 Май 2013
Сообщения
72
Репутация
0
Спасибо
1
Монет
0
Я вижу несколько проблем в вашем коде. Давайте их исправим:

1. Вы создаете `markup` после того, как пытаетесь его использовать в `bot.send_message()`
2. Используете `InlineKeyboardMarkup` вместо `InlineKeyboardButton` для создания кнопок
3. Есть опечатка в названии декоратора (`callback_query_handlers` вместо `callback_query_handler`)

Вот исправленный код:
import telebot
import config
from telebot import types

bot = telebot.TeleBot(config.Token)

@bot.message_handler(commands=['start'])
def wel(message):
# Создаем клавиатуру до использования
markup = types.InlineKeyboardMarkup(row_width=4)
# Создаем кнопки используя InlineKeyboardButton вместо InlineKeyboardMarkup
item1 = types.InlineKeyboardButton("3 месяца - 299 руб", callback_data='1')
item2 = types.InlineKeyboardButton("6 месяцев - 499 руб", callback_data='2')
item3 = types.InlineKeyboardButton("12 месяцев - 899 руб", callback_data='3')
item4 = types.InlineKeyboardButton("Тех.поддержкаℹ️", callback_data='4')
# Добавляем кнопки в клавиатуру
markup.add(item1, item2, item3, item4)

bot.send_message(
message.chat.id,
"Добро пожаловать, {0.first_name}!\nКакой тип подписки желаете приобрести?".format(message.from_user),
parse_mode='html',
reply_markup=markup
)

# Исправлен декоратор handlers -> handler
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
try:
if call.message:
if call.data == '1':
bot.send_message(call.message.chat.id, 'ссылка')
elif call.data == '2':
bot.send_message(call.message.chat.id, "другая ссылка")
elif call.data == '3':
bot.send_message(call.message.chat.id, "последняя ссылка")
elif call.data == '4':
bot.send_message(call.message.chat.id, "ссылка на тех.поддержкуℹ️")

# Обновляем сообщение с кнопками
bot.edit_message_text(
chat_id=call.message.chat.id,
message_id=call.message.message_id,
text="Выбран вариант: " + call.data,
reply_markup=None
)

except Exception as e:
print(repr(e))

#run
bot.polling(none_stop=True)

Основные изменения:

1. Перенес создание клавиатуры (`markup`) перед её использованием
2. Заменил `InlineKeyboardMarkup` на `InlineKeyboardButton` для создания кнопок
3. Исправил декоратор `callback_query_handlers` на `callback_query_handler`
4. Упростил логику обновления сообщения после нажатия кнопки
5. Убрал лишние вызовы `edit_message_text`

Теперь код должен работать корректно. После нажатия на кнопку бот будет отправлять соответствующую ссылку и обновлять сообщение с кнопками.
 
Регистрация
20 Май 2013
Сообщения
85
Репутация
0
Спасибо
0
Монет
0
Попроси чат гпт помочь, он тебе весь код сделает нормальным и укажет на ошибки
 
Регистрация
2 Дек 2013
Сообщения
70
Репутация
0
Спасибо
0
Монет
0
Попроси чат гпт помочь, он тебе весь код испортит как в моём случае
 
Сверху Снизу