Ответы пользователя по тегу Python
  • Как в боте сделать нажатие кнопки только 1 раз?

    @twistfire92
    Python backend developer
    вы в кнопку заносите чей user_id? Бота? Канала? И у всех пользователей при нажатии один и тот же id (mandm) заносится в базу данных.

    Вам надо при нажатии на кнопку сначала делать запрос в БД, проверять ставил ли этот пользователь (call.from_user.id) лайк или дизлайк этому сообщению (call.message.id). Если такая запись есть, то выводить сообщение о том, что уже были лайки/дизлайки.
    Ответ написан
    Комментировать
  • Как изменить текст inline кнопки в telebot?

    @twistfire92
    Python backend developer
    Во-первых первым параметром надо передавать текст сообщения, а не chat id.
    Во-вторых вы вроде хотели не текст сообщения менять, а текст кнопки. Но это можно сделать лишь пересоздав кнопку.
    bot.edit_message_reply_markup(<chat_id>, <message_id>, <inline_markup>)
    Ответ написан
  • Как изменить клавиатуру в сообщении телеграм pyTelegramBotAPI?

    @twistfire92
    Python backend developer
    метод edit_message_reply_markup можете использовать.
    Ответ написан
    Комментировать
  • Не очищается Словарь на Python, как это можно решить?

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

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

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

    PS. также посоветовал бы не использовать глобальную переменную record_dict. Если через ваш бот будут одновременно оставлять заявки 2 человека, то все у вас перепутается и упадет в ошибку. Лучше пробрасывайте введенные пользователем значения через register_next_step_handler
    Ответ написан
    Комментировать
  • Как правильно развернуть список из *args?

    @twistfire92
    Python backend developer
    Зачем вы передали список в качестве параметра?
    def f(*args):
        for i in args:
            print(i)
    f(1, 2, 3, 4, 5)
    Ответ написан
    Комментировать
  • 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 комментария
  • Обязательно ли использовать класс в Python?

    @twistfire92
    Python backend developer
    https://www.youtube.com/watch?v=o9pEzgHorH0

    Можешь посмотреть что об этом думает один из разработчиков самого языка (из названия видео в принципе понятно)

    Если кратко: Можно обойтись без класса - обходись без него.
    Ответ написан
    1 комментарий
  • Как передать переменную в 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)
    Ответ написан
    Комментировать
  • Как можно сократить этот код?

    @twistfire92
    Python backend developer
    self.x = kwargs.get("x", True)
    Ответ написан
    Комментировать
  • Как делать каждый пиксель всё тускнее?

    @twistfire92
    Python backend developer
    ну как-то так. шаг понижения яркости рассчитал и все
    color = 0.9
    step = 0.9/len(snake[1])
    for pix in snake[1]:
      pygame.draw.rect(screen, [i*color for i in snake[0]["color"]],  [pix[0], pix[1], 10, 10])
      color -= step
    Ответ написан
    1 комментарий
  • Заполнение пустых ячеек pandas?

    @twistfire92
    Python backend developer
    df['occupation'] = df['occupation'].fillna(method='ffill')
    Ответ написан
    Комментировать
  • Как приобразовать str в json?

    @twistfire92
    Python backend developer
    модуль json.
    Метод loads
    Ответ написан
  • Как сравнить строку с массивом на python?

    @twistfire92
    Python backend developer
    На вскидку есть 2 варианта:

    1.
    Цикл по tag
    Каждый символ проверяешь на наличие в списке alpha
    Если символ не находится - выводишь ошибку

    2.
    Делаешь 2 множества (set) первое - символы в tag, второе - символы в alpha.
    Если разница этих множеств будет не пустой - тогда выводишь ошибку.

    Если нужен код, то сначала попробуй свой написать, если не получится - показывай что написал - направим.
    Ответ написан
    Комментировать
  • Может ли оператор In объединить 3 словаря в один?

    @twistfire92
    Python backend developer
    Во-первых вопрос нужно оформлять по правилам ресурса. Код оборачивать в соответствующий тег.

    По вопросу:
    у вас словари никак не складываются. Вы вызываете проход по кортежу из этих словарей. Переменная d принимает значение каждого следующего словаря на следующей итерации цикла for.

    Все равно, что вывести в консоль значения переменных по очереди.

    for i in (a, b, c):
        print(i)


    переменные a b c не складываются, а просто перебираются по очереди

    А в вашем случае 3 словаря в один объединяет метод update(), который вызывается по очереди с каждым словарем в качестве параметра.
    Ответ написан
    Комментировать
  • Можно ли в зависимости от содержания строки изменять вызываемые функции?

    @twistfire92
    Python backend developer
    Вообще такие вещи делаются через словарь.

    Если хотите просто сделать шаблонную строку, то можете использовать замену через replace, обойдя все пары ключ-значение вашего словаря.

    d = {1: 'Hi', 2: 'hello', 3: 'nice'}
    
    def foo(s):
        for key, value in d.items():
            s = s.replace(str(key), value)
        print(s)
    
    foo('1')
    foo('2')
    foo('1 2 3')
    foo('1-3')


    только не напутайте с типами данных.
    Ответ написан
    Комментировать
  • Как сделать два 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
    Зачем вы сделали вложенную структуру функций? Они все должны быть на верхнем уровне

    @bot.message_handler(commands=['spam'])
    def start_message(message):
        bot.send_message(message.chat.id, 'Пиши что угодно')
    
    @bot.message_handler(content_types=['text'])
    def get_text(message):
        text = message.text
        markup = telebot.types.InlineKeyboardMarkup()
        markup.add(telebot.types.InlineKeyboardButton(text='Десять', callback_data=10))
        markup.add(telebot.types.InlineKeyboardButton(text='Пятьдесят', callback_data=50))
        markup.add(telebot.types.InlineKeyboardButton(text='Сто', callback_data=100))
        bot.send_message(message.chat.id, text="Выбери сколько раз повторить", reply_markup=markup)
    
    @bot.callback_query_handler(func=lambda call: True)
    def query_handler(call):
        bot.answer_callback_query(callback_query_id=call.id, text='11111')
        so = []
        bot.send_message(message.chat.id, f'Пишем {call.data} раз')
        for i in range(int(call.data)):
            so.append(text)
            sos = '\n'.join(so)
        bot.send_message(call.message.chat.id, sos)


    И да, в последней строке обращаться к объекту message напрямую нельзя, через call только
    Ответ написан