Ответы пользователя по тегу Боты
  • Как отправить json информацию в боте ВК?

    @o5a
    В сообщении передаете текст вида '/команда ник сервер' т.е. например '/find n4g1b4t0r 31337',
    а затем делаете такую проверку:
    if event.text == '/find'
    Не находите противоречий?
    Ответ написан
    Комментировать
  • Ошибка записи данных из бота в файл?

    @o5a
    Потому что это так не делается. От того, что хэндлеры записали как вложенные функции, они не будут работать только внутри тех функций. Первый записанный хэндлер одинакового типа (в данном случае content_types=['text']) и будет использоваться для всех вводов.
    В данном случае подойдет использование register_next_step_handler, когда указывается функция, обрабатывающая последующий шаг операции. Про нее много где написано подробно, в т.ч. на этом сайте.
    Для данного бота будет примерно так:
    вместо
    @bot.message_handler(commands=["api_id"])
    def api_id(m, res=False):
        bot.send_message(m.chat.id, 'Введите Api ID, полученное на сайте my.telegram.org')
        @bot.message_handler(func=lambda message: True, content_types=['text'])
        def msg(message):
            print(message.text)
            f = open('C:/Users/асер/Desktop/python/bot/api_id.txt', 'a')
            f.write(message.text + '\n')
            f.close()
            bot.send_message(m.chat.id, 'Прекрасно!')

    сделать так (указать запрос api_id следующим шагом):
    @bot.message_handler(commands=["api_id"])
    def api_id(m, res=False):
        bot.send_message(m.chat.id, 'Введите Api ID, полученное на сайте my.telegram.org')
        # указываем запуск следующего шага обработки - свою функцию
        bot.register_next_step_handler(message, get_api_id)
    
    def get_api_id(message):
        print(message.text)
        with open('C:/Users/асер/Desktop/python/bot/api_id.txt', 'a') as f:
            f.write(message.text + '\n')
        bot.send_message(m.chat.id, 'Прекрасно!')


    Аналогично для обработчиков других команд.
    Ответ написан
    1 комментарий
  • Как изменить переменную в бд, при условии наличия нужного параметра из того-же бд?

    @o5a
    Если речь про формирование бонуса по условию, зависящему от других полей (как в данном случае buster1 и т.п.), можно это прописать в самом запросе через оператор case (по логике похоже на ветвления if в самом python). Например:

    sql = "UPDATE users SET balance = balance + \
    CASE WHEN buster1 = 'Нет' AND buster2 = 'Нет' AND buster3 = 'Нет' THEN 0.010 \
        WHEN buster1 = 'Да' AND buster2 = 'Нет' AND buster3 = 'Нет' THEN 0.050 \
        WHEN buster1 = 'Да' AND buster2 = 'Да' AND buster3 = 'Да' THEN 0.100 \
    END \
    WHERE id = ?"

    И соответственно в запросе передавать только id пользователя, сам бонус будет считаться автоматически.
    Таким образом сами формируете зависимость бонуса от этих полей.

    Если же имелось в виду что-то другое, лучше пишите подробнее с примером.
    Ответ написан
    1 комментарий
  • Как сделать, чтобы бот не обращал внимания на пунктуацию?

    @o5a
    Можно через str.translate удалить все указанные символы по списку
    text = 'Как съесть яблоко?'
    text = str.translate(text, str.maketrans('', '', '.,?:-;/\\'))
    Ответ написан
    9 комментариев
  • В какую строку кода надо добавить lower?

    @o5a
    if msg.text.lower().startswith('инфа'):
    Ответ написан
    Комментировать
  • Как получить значения после сообщения?

    @o5a
    Все данные в message.text. Разрезайте по split и берите, что нужно
    Соответственно для того случая "отправить евро 500" нужно взять все, кроме первого элемента
    currency, amount = message.text.split()[1:]
    Только стоит добавить проверки (в зависимости от запланированной логики работы) на случай, если параметры не будут указаны.

    Еще в aiogram есть свой метод, message.get_args() возвращающий строку аргументов, но он вернет строку, которую тоже надо будет разрезать split()
    Ответ написан
    Комментировать
  • Как исправить sqlite3.IntegrityError: NOT NULL constraint failed?

    @o5a
    В таблице поля объявлены обязательными (нельзя вставить NULL), что в целом нормально. Но при этом нельзя заносить данные постепенно, нужно делать INSERT один раз в самом конце, когда все данные от пользователя получили, т.е. в функции patronymic.
    def patronymic(message): #получаем отчества
        ...
        cursor.execute("INSERT INTO Profile (user_id, name, surname, patronymic) VALUES (?, ?, ?, ?)", (user_id, name, surname, patronymic))
    Ответ написан
    5 комментариев
  • Выдает ошибку, не знаю что делать ( создаю бота Дискорд по экономике ), что делать?

    @o5a
    Ошибка указывает на то, что запрос из базы не возвращает данных. Т.е. по данному id пользователя в таблице не нашлось.
    Ответ написан
  • Ограничение ввода данных в переменную?

    @o5a
    Проверку нужно до перевода в число делать, плюс добавить проверку на само число (или отсутствие букв, по желанию)
    async def process_start_command(message: types.Message):
        number1 = message.text.split()[1]
        if not (number1.isdigit() and 1 <= int(number1) <= 1000):
        	await message.answer(f'введите число меньше 1000')
        else:
            random_number = random.randint(0, int(number1))

    И кстати random.randint(0, x) выдаст число из x+1 набора чисел, а не x.
    Ответ написан
  • Дает кучу ошибок при написании бота на Python. Что делать?

    @o5a
    Параметры (команды, типы) в хэндлере нужно указывать списком:
    @bot.message_handler(commands=['start'])
    Ответ написан
    3 комментария
  • Как мне отправить все картинки из папки через бота на питоне?

    @o5a
    Потому что в msg.photo содержится не одно, а список вариантов с разными разрешениями. Так что сначала нужно выбрать нужное. Например так
    photo = max(msg.photo, key=lambda x: x.height)
    file_id = photo.file_id

    P.S. хотя я упустил, что ругается на 'NoneType', т.е. информации о фото вообще нет (msg.photo = None), причина еще в чем-то
    Ответ написан
  • Ошибка в sqlite3 python?

    @o5a
    Для tik не использован fetchone(), так что в него запишется сам курсор, а не его данные. Но даже в таком случае он текстом должен был написать что-то типа <sqlite3.Cursor ...а не просто пустую строку.
    Лучше сделать этот кусок так:
    ...
          user_info = sql.execute(f"SELECT tiktok, cash from users WHERE login = '{message.from_user.id}'").fetchone()
          if user_info:
              tik, balance = user_info
              bot.send_message(message.chat.id, f"ваш тикток: {tik}")
              bot.send_message(message.chat.id, f" Ваш баланс: {balance} RUB ")
    Ответ написан
    Комментировать
  • Как боту сделать рассылку в телеграмме через python?

    @o5a
    fetchall() в get_subscriptions в текущем виде будет возвращать вложенные списки со всеми полями. Лучше сразу возвращать только нужную информацию - список самих id
    ...
        def get_subscriptions(self, status = True):
            with self.connection:
                return [x[0] for x in self.cursor.execute("SELECT user_id FROM `subscriptions` WHERE `status` = ?", (status,)).fetchall()]

    тогда можно просто напрямую использовать идентификаторы при отправке
    @dp.message_handler(commands=['go'])
    async def go(message: types.Message):
      subscriptions = db.get_subscriptions()
      for user in subscriptions:
        await bot.send_message(user, "...")
    Ответ написан
  • Как распознавать дин. команды боту?

    @o5a
    Если xxx это просто параметр поиска, то его можно передавать через пробел. Тогда команда будет универсальная, а аргумент можно вытащить из строки.
    @bot.message_handler(commands=['search'])
    def search(message):
      if ' ' in message.text:
        param = message.text.split(maxsplit=1)[1]
        ...
      else:
        bot.send_message(message.chat.id, 'no params')

    Будет понимать команды вида
    /search XXX
    Ответ написан
    Комментировать
  • Как в Python использовать инфу из переменной w_info в функции def answer(call):?

    @o5a
    Можно сделать глобальный словарь данных (в данном простом случае только для ветра, но можно и все похожие данные в таком виде записывать), в который записывать данные по городу. Затем при нажатии кнопки "Ветер" просто брать уже готовые данные из этого словаря.
    # на верхнем уровне объявляем наш словарь
    wind_info = {}
    
    ...
        elif w1 > 33:
            w_info = 'Огромные разрушения, серьезно повреждены здания, строения и дома, деревья вырваны с корнями, растительность уничтожена.'
    # после определения w_info заносим эти данные в наш словарь
        wind_info[message.text] = w_info # т.к. message.text это наш город (вообще хорошо бы его сразу в отдельную переменную выделять, так код проще читается)

    Но нам нужно в колбеке для ветра как-то указать, по какому городу хотим получить информацию о ветре. Мы можем сам город передать в колбеке
    item_wind = types.InlineKeyboardButton(text = 'Ветер', callback_data = f'wind_{message.text}')

    а затем его извлечь в самом колбеке
    вместо старого
    elif call.data == 'wind':
    обрабатываем колбек вида "wind_Москва"
    elif call.data.startswith('wind'):
            # извлекаем название города
            city = call.data.split('_',1)[1]
            # и берем нашу информацию из словаря данных по ветру
            w_info = wind_info[city]
            bot.send_message(call.message.chat.id, w_info)
    Ответ написан
    1 комментарий
  • Почему бот выдает ошибку?

    @o5a
    IDE как тут пишут конечно хорошо, но для изучения программирования Sublime вполне подходит. Просто нужно читать свои ошибки.

    Не замечаете, что в представленном Вами коде стоит
    @bot.messege_handler(content_types=['text'])
    а в сообщении об ошибке ругается на строку
    @bot.handler_backends(content_types=['text'])
    Значит, или запускаете не тот файл, или запускаете, не сохранив изменения.
    И правильно должно быть
    @bot.message_handler(content_types=['text'])
    Ответ написан
    Комментировать
  • Система лайков Python?

    @o5a
    Можно так например. Таблица для хранения лайков в разрезе поста и пользователя:
    CREATE TABLE IF NOT EXISTS post_likes (
    id integer primary key,
    post_id integer, -- id поста
    user_id integer, -- id пользователя
    likes integer
    );


    Лайки можно записывать в одно поле "likes". 1 - лайк, 0 - ничего, -1 - дизлайк.
    Соответственно чтобы собрать итоги, можно использовать такой запрос:
    select sum(likes) total_score, -- общий счет
    sum(case likes when 1 then 1 end) sum_likes, -- кол-во лайков
    sum(case likes when -1 then 1 end) sum_dislikes -- кол-во дизлайков
    from post_likes where post_id = нужный_id_поста
    Ответ написан
  • Как сохранить Audio в переменную?

    @o5a
    Можно передавать дополнительные параметры
    bot.register_next_step_handler(sent, audio_description, audio)
    ...
    def audio_description(message, audio):
    Ответ написан
    1 комментарий
  • В чем заключаеться ошибка?

    @o5a
    вместо "select ..", q= ... прибавлять сумму в самом SQL:
    cursor.execute("UPDATE users SET cash = cash + ? WHERE id = ?", (arg, member.id))
    Ответ написан
    Комментировать
  • Как сделать чтобы в sqlite id людей бота не повторялись?

    @o5a
    Для SQL базы правильнее будет объявить уникальность поля (UNIQUE/PRIMARY KEY), и затем при вставке можно не делать самостоятельных проверок, дубликаты итак не будут заноситься.

    При создании таблицы:
    CREATE TABLE users (
    user_id INTEGER PRIMARY KEY # чтобы заполнялся автоматически, тогда вообще не нужно указывать id, он всегда будет проставляться автоматом новый
    user_name TEXT);

    Тогда при вставке не нужно вообще использовать user_id, оно будет проставляться автоматически
    cur.execute('''INSERT INTO users(user_name) VALUES(?)''', (user_name, ))


    или
    CREATE TABLE users (
    user_id INTEGER UNIQUE, # если планируется самостоятельно заносить id
    user_name TEXT);

    Тогда user_id нужно проставлять самому, но проверку дубликатов делать тоже не придется, если указать OR IGNORE
    cur.execute('''INSERT OR IGNORE INTO users(user_id, user_name) VALUES(?, ?)''', (user_id, user_name))
    Ответ написан