Ответы пользователя по тегу Telegram
  • Не очищается Словарь на Python, как это можно решить?

    @twistfire92
    Python backend developer
    Вы назвали функцию и строковую переменную одним именем.
    до момента brand = message.text, brand было именем функции, а теперь стало именем какой-то строки. И когда во второй раз вы пытаетесь вызвать функцию brand, интерпретатор ругается на то, что это строка и вызвать ее нельзя.

    И то же самое у вас происходит с остальными функциями. Дайте им другие имена.

    И на будущее указывайте в каком месте произошла ошибка.

    PS. также посоветовал бы не использовать глобальную переменную record_dict. Если через ваш бот будут одновременно оставлять заявки 2 человека, то все у вас перепутается и упадет в ошибку. Лучше пробрасывайте введенные пользователем значения через register_next_step_handler
    Ответ написан
    Комментировать
  • AttributeError: module 'telebot.types' has no attribute 'ReplyKeyboardRemove'?

    @twistfire92
    Python backend developer
    Слушай, даже как-то жалко тебя стало с таким кодом то.

    Объяви глобальную переменную, например places, положи туда список всех адресов. (Для чего - узнаешь ниже)
    places = ["6-й микрорайон, 1 (Краснообск)", "Орджоникидзе, 30", "Кирова, 23",
    			"проспект Карла Маркса, 29", "Героев Революции, 64", "Орджоникидзе, 18",
    			"Никольский проспект, 1 (БЦ Кольцово)", "площадь Карла Маркса, 7 (Сан Сити)",
    			"Советская, 8", "Кошурникова, 33", "Большевистская, 45/1 (РЕКА)",
    			"Красный проспект, 157/1", "Красный проспект, 2/1", "Выставочная, 38/1",
    			"Военная, 5 (Аура)", "Дуси Ковальчук, 179/5 (БЦ Колибри)", "Богдана Хмельницкого, 27",
    			"Фрунзе, 242 (ДЦ Новая высота)", "Максима Горького, 53", "Дуси Ковальчук, 28д",
    			"Красный проспект, 101 (Ройял Парк)", "Светлановская, 50 (Большая Медведица)"]


    Не надо использовать global!!! Сначала почитай что это и для чего. Тут оно вообще не нужно.

    Вот такое вообще не показывай на людях!
    a = 'a'
        if a == 'a':
        ...


    А вместо этой адской вереницы с объявлением переменных под каждую кнопку сделай так:
    markup = telebot.types.ReplyKeyboardMarkup(resize_keyboard=True)
    for place in places: # вот и пригодилась наша глобальная переменная (и без всяких global)
        markup.add(telebot.types.KeyboardButton(place))
    print('Кнопки добавлены!') # если тебе вообще это нужно
    bot.send_message(message.chat.id, 'Пожалуйста, выбери кофейню, в которой ты сейчас находишься.', reply_markup=markup)


    Далее. После абобы. такое тоже на людях не показывай.
    Кучу if elif elif elif.... заменяй на:
    if message.text.strip() in places: # Оп! Опять пригодилось!
        bot.send_message(message.chat.id, f"Отлично! Ты сейчас по адресу: {message.text.strip()}")


    По твоему же вопросу. Зачем отдельно импортируешь ReplyKeyboardRemove?
    msg = bot.send_message(message.chat.id, 'Отлично! Ты сейчас в кофейне!\nЗначит тебе будет легче делать заказ!', reply_markup=telebot.types.ReplyKeyboardRemove())


    Ну и там еще наберется несколько прям жирных косяков.
    Ответ написан
    3 комментария
  • Как получить chat_id telegram?

    @twistfire92
    Python backend developer
    в хендлере сообщения просто добавьте строку
    print(message.chat.id)

    И посмотрите что выведет в консоли.

    Либо ответным сообщением от бота перешлите то же самое
    Ответ написан
    Комментировать
  • Как в кнопку передать user_id?

    @twistfire92
    Python backend developer
    callback_data='<ID>|button1'

    потом просто
    user_id, data = call.data.split('|')

    вот и получил из кнопки user_id
    Ответ написан
    3 комментария
  • Как передать переменную в register_next_step_handler?

    @twistfire92
    Python backend developer
    В коментах уже написал, что второй вариант правильный. Решил сам проверить и да, так и надо делать. Видимо у вас где-то еще проблема с функцией foo2.
    Вот простой пример:

    import telebot
    from telebot import types
    
    API_TOKEN = ''
    
    bot = telebot.TeleBot(API_TOKEN)
    
    @bot.message_handler(func=lambda message: True)
    def start(message):
        msg = bot.reply_to(message, 'Проверка проброса параметра')
        param = 23
        bot.register_next_step_handler(msg, step, param)
    
    
    def step(message, param):
            bot.reply_to(message, f'{message.text}: {param}')
    
    bot.infinity_polling()


    Результат:
    61fa1ac863bd8835159711.png
    Ответ написан
    Комментировать
  • Как сделать чтобы кнопка удалялась после нажатия в телеграм боте python?

    @twistfire92
    Python backend developer
    Как-то так, ну или в этом направлении смотрите

    bot.edit_message_text(call.message.chat.id, call.message.id, reply_markup=None)
    Ответ написан
    Комментировать
  • Как сделать два message_handler для бота на python?

    @twistfire92
    Python backend developer
    Если вам не нравится структура с if, можете раскидать все на отдельные хендлеры.

    @bot.message_handler(func=lambda message: message.text=='Привет')
    def privet(message):
        user_markup = telebot.types.ReplyKeyboardMarkup(True, False)
        user_markup.row('Чат с работами', 'Показать новости')
        user_markup.row('Оставить заявку на выполнение работы')
        bot.send_message(message.from_user.id, "Выбери, что ты хочешь сделать.", reply_markup=user_markup)
    
    @bot.message_handler(func=lambda message: message.text=='Чат с работами')
    def chat_with_works(message):
        markup = types.InlineKeyboardMarkup()
        btn_my_site = types.InlineKeyboardButton(text='Чат с работами', url='https://t.me/AnonChanBot?start=-1001502978392')
        markup.add(btn_my_site)
        bot.send_message(message.chat.id, "Здесь вы можете присылать работы, которые давали вам преподаватели, чтобы облегчить жизнь тем, кому их ещё не давали. Ваши сообщения АНОНИМНЫ.", reply_markup=markup)
    
    # Ну и так далее...


    Если хотите после какого-то конкретного этапа ожидать от пользователя ввода информации текстом и потом использовать этот текст, то вам необходимо использовать register_next_step_handler.
    Пример можно найти тут.
    Ответ написан
    Комментировать
  • Как удалить надпись, вы подписаны на этот канал?

    @twistfire92
    Python backend developer
    Возможно надо поиграться с правами бота в этом канале. Для группы он должен быть администратором, может для канала тоже есть какие-то роли.

    Откуда вы вообще взяли new_channel_members? Из какой документации? Нет такого в aiogram, не отработает.
    Ответ написан
  • Как вызвать функцию ввода текста после обработки callback'a (нажатия на Inline кнопку)?

    @twistfire92
    Python backend developer
    Не совсем понятно в чем проблема, ведь объект call содержит в себе объект message

    bot.register_next_step_handler(call.message, <Твоя функция>)
    Ответ написан
    1 комментарий
  • Как сделать чтобы юзер мог заполнять базу данных через телеграм бота?

    @twistfire92
    Python backend developer
    А что за библиотеку вы используете? Если PyTelegramBotAPI (telebot), то пользуйтесь register_next_step_handler
    Если aiogram, то используйте машину состояний (FSM)
    Ответ написан
    Комментировать
  • Как вывести более десяти Inline кнопок?

    @twistfire92
    Python backend developer
    Внимательно смотрим на строку с добавлением 11-й кнопки

    button11 = types.InlineKeyboardButton('БОЛЬШЕРЕЧЬЕ ', callbsck_data='11')

    Внимательнее с очепятками.
    А что ниже по коду у вас творится??? Ужас же адовый!!! Зачем столько повторений?
    Ответ написан
    2 комментария
  • Telebot. Как отправить сообщение другому пользователю?

    @twistfire92
    Python backend developer
    Вы недавно начали изучать Python. Да и вообще программирование.
    Начните с наименований переменных. Мало того, что у вас глобальные a, z, так вы еще и функции так обозвали. Читаешь и не понимаешь что хотел сказать автор.

    В качестве совета по теме вопроса - При создании Inline (не Inlain) кнопки у пользователя owner, засовывайте в callback_data user_id пользователя от которого пришел заказ.
    button_yes=types.InlineKeyboardButton(text='Принят',callback_data=f'yes|{message.chat.id}')

    А потом
    @bot.callback_query_handler(func=lambda call: True)
    def callback_inline(call):
        answer, user = call.data.split('|')
        if answer=='yes':
            bot.send_message(user,'Принято')


    Уберите все global, зачем они вам???
    Отформатируйте код, расставьте пустые строки между функциями, читать же невозможно
    дайте функциям нормальные имена, вместо однобуквенных a z. Через какое-то время захотите подправить код и пару часов потратите на то, чтобы вспомнить что эти a z обозначают.
    Ответ написан
    Комментировать
  • Как в aiogram получить доступ к тому сообщению, к которому привязана inline кнопка?

    @twistfire92
    Python backend developer
    Когда зарегистрируешь метод, который будет запускать цепочку действий для редактирования поста, в этот метод будешь передавать параметр call с типом CallbackQuery. Этот параметр содержит данные, которые ты поместил в кнопку (call.data), а также объект самого сообщения (call.message).

    Но насколько я понял, тебе не особо то и нужно это сообщение. Ты можешь немного видоизменить функцию get_keyboard()

    def get_keyboard(id: str):
        buttons: list = [
            types.InlineKeyboardButton(text='Редактировать', callback_data=f'edit|{id}'),
            types.InlineKeyboardButton(text='Удалить', callback_data=f'del|{id}')
        ]
        keyboard = types.InlineKeyboardMarkup(row_width=2)
        keyboard.add(*buttons)
        return keyboard
    
    .....
    
    async def list_tasks(message: types.Message):
        user_id: int = message.from_user.id
        lt: list = get_list_tasks(user_id)
        if len(lt) == 0:
            await message.answer('Ни одного таска ещё не создано.')
        else:
            for task in lt:
                id = task[-1] # Ну или под каким индексом тут должен скрываться ID записи? Скорректируешь
                await message.answer(f'{task[0]}\n\n{task[1]}\n\nid: {task[-1]}', reply_markup=get_keyboard(id))


    теперь туда передается ID нужной записи и при нажатии на кнопку вы просто парсите команду и ID записи в БД:
    command, id = call.data.split('|')

    а дальше уже думаю понятно
    Ответ написан
  • Как изменить отправляемый текст в кнопке Telegramm?

    @twistfire92
    Python backend developer
    617663ed00a71877528039.png
    Если вы это имеете ввиду, то вам нужно настроить команды бота в BotFather.

    А кнопки у ботов есть либо обычные, либо Inline. Обычные отправляют сообщение с текстом указанным на кнопке. Inline кнопки не отправляют никаких сообщений. Поэтому если вы говорите не о командах бота, то приведите конкретные примеры со скриншотами, названием других ботов, где это реализовано.
    Ответ написан
  • Зацикливается работа декоратора callback_query_handler, какое решение?

    @twistfire92
    Python backend developer
    Вам надо использовать FSM, машину состояний. Материала с примерами достаточно. А от вложенных хендлеров надо избавляться
    Ответ написан
    Комментировать
  • Может ли телеграм бот читать exel файл который я ему отправил?

    @twistfire92
    Python backend developer
    Да, может. Это возможно. Изучай библиотеки работы с exel файлами и с телеграмм ботами.
    Ответ написан
    Комментировать
  • Не работает bot.register_next_step_handler. Как исправить?

    @twistfire92
    Python backend developer
    очень странный код у вас.
    Конкретно по вашему вопросу.
    в register_next_step_handler передается сообщение и объект функции, а не результат ее работы.
    bot.register_next_step_handler(msg, phone)
    ниже такие же ошибки встречаются.

    Вытащите хендлеры из тела функций, иначе работать не будет ничего нормально.

    функция send_data обращается к глобальной user, которая объявлена в самом начале. Вы понимаете, что эта переменная существует пока работает бот и каждый пользователь будет ее перезаписывать своими данными?

    Изучайте основы, потом возвращайтесь к ботам. Вы написали много лишнего и неработающего кода
    Ответ написан
  • У меня одинаковые названия кнопок, но разные сообщение, как это решить?

    @twistfire92
    Python backend developer
    Бот делает ровно то, что вы и описали.
    elif message.text == 'VK':
                bot.send_message(message.chat.id, 'Держите вашу ссылку: https://vk.com/arizona1phoenix')

    Да, там дальше еще есть варианты с VK, но до них просто уже не дойдет, остановится на первом.
    Для начала советую почитать основы программирования, как работают условные операторы. А по вашему коду видно, что вы не ведаете что творите.

    Как подтянете основы, советую переключиться на Inline клавиатуру. С ней гораздо проще будет решить поставленную вами задачу.
    Ответ написан
  • Как сделать телеграм-бота на Python используя API, а не фреймворки?

    @twistfire92
    Python backend developer
    Вам нужен юзер-бот. API ботов уже не подойдет. Можете посмотреть на библиотеку Telethon
    Ответ написан
    Комментировать