Ответы пользователя по тегу Telegram
  • Как ограничить отправку в боте Telegram?

    @o5a
    Без кода сложно что-то однозначное сказать, но можете выставлять статус по пользователям (хотя бы просто словарь с данными). Обработка началась - выставляете пользователю статус, что обрабатывается запрос. И пока статус стоит, другая команда не выполняется. По окончании обработки статус сбрасывается. Условно:
    user_status = {}
    
    @bot.message_handler ...
    def process_something(message):
        if user_status.get(message.from_user.id, 0) == 0:
            user_status[message.from_user.id] == 1
            start_our_process()
    Ответ написан
    Комментировать
  • Telegram bot с Tesseract на борту не хочет работать, пожалуйста просмотрите мой код?

    @o5a
    Логично, что такие ошибки, если не придерживаться одного цикла. Этот фрагмент
    ...
            for plate in plates:
                x, y, w, h = plate
            centreX = int((x + (x + w)) / 2)
    ...

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

    @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 комментарий
  • Пишет None в рейтинге?

    @o5a
    Так функция ничего и не возвращает. Если нужен топ N, то можно просто сразу возвращать N строк со всеми данными, используя limit
    def get_top_surviveds(self, limit=3):
      with self.connection:
        return self.cursor.execute("SELECT * FROM stats ORDER BY survived desc LIMIT ?", (limit, )).fetchall()
    Ответ написан
  • Вывод данных из бд в свой профиль telegram bot python?

    @o5a
    Если удобнее, то можно получать данные в виде словаря (где ключи - названия столбцов). Тогда можно напрямую обращаться к нужному полю по имени.
    class SQLighter:
      def __init__(self, database):
          self.connection = sqlite3.connect(database, check_same_thread = False)
          self.connection.row_factory = sqlite3.Row # этой строкой указываем, что результат получаем в виде словаря
          self.cursor = self.connection.cursor()
          self.cursor.execute("CREATE TABLE IF NOT EXISTS stats (user_id INT, user_name TEXT, survived INT, infected INT)")
    ...
      # и можно сделать такую функцию, возвращающую всю информацию пользователя
      def get_info(self, id):
          with self.connection:
              return self.cursor.execute("SELECT * FROM stats WHERE user_id=?", (id, )).fetchone()
    
    sql_lighter = SQLighter("database.db")
    sql_lighter.add_user(982543922, "Владимир", 1, 1)
    # затем получаем весь словарь данных и можем использовать любые нужные поля из него
    data = sql_lighter.get_info(982543922)
    print(data)
    print(data['user_name'])
    print("Информация пользователя {}: имя: {}, survived: {}, infected: {}".format(data['user_id'], data['user_name'], data['survived'], data['infected']))
    Ответ написан
    7 комментариев
  • Почему бот выдает ошибку?

    @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 комментарий
  • Как сделать чтобы в 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))
    Ответ написан
  • Как получать Id фотографии в телеграмм?

    @o5a
    Зависит еще от того, как эту фотографию скинули. Если отправлять без сжатия, то оно придет в исходном виде, с типом (content_type) 'document', а идентификатор будет
    message.document.file_id

    Если со сжатием (по умолчанию для фото), то оно придет типа 'photo', а идентификаторов будет несколько, под разные разрешения, в таком виде:
    message.photo - список из разных разрешений со своими file_id

    Т.е. для получения идентификатора нужно из списка выбрать нужный вариант.
    Например, так (максимальный размер)
    photo = max(message.photo, key=lambda x: x.height)
    file_id = photo.file_id
    Ответ написан
    Комментировать
  • Как узнать какой тип данных пришел в бота?

    @o5a
    message.content_type
    Ответ написан
    Комментировать
  • Вывод данных из БД в Телеграмбот?

    @o5a
    Форматировать вывод можно например так
    data = [
    [1, "10:55", "math"],
    [2, "12:35", "geo"],
    ]
    
    s = '\n'.join('\t'.join(map(str, row)) for row in data)
    print(s)

    1	10:55	math
    2	12:35	geo


    И использовать надо fetchall, т.к. fetchone возвращает только первую строку ответа.
    Ответ написан
    Комментировать
  • Как записать данные которые отправляются боту?

    @o5a
    Список заполняется, просто в текущем коде возвращается он только один раз (в самом начале, когда он еще пустой), т.к. main() запускается только один раз.

    Можно увидеть, добавив например команду /info
    @bot.message_handler(commands = ['info'])
    def send_info(message):
      bot.send_message(message.chat.id, f'data={data}')


    Так что не нужно все эти функции оборачивать в main, они просто должны идти на глобальном уровне.
    Ответ написан
    2 комментария
  • Python(telebot) как можно сделать активацию переменной при вызове определённой функции или? Нужно для проверки в боте активна ли клавиатура или нет!?

    @o5a
    Не зная, как у вас реализовано, сложно сказать. Насколько понял речь все еще про ReplyKeyboardMarkup. Можно использовать например словарь (или класс для хранения данных) для хранения состояний. И для каждой клавиатуры проставлять состояние. Условно
    states = {"kb":None}
    
    def ... клавиатура1
        keyboard = telebot.types.ReplyKeyboardMarkup(resize_keyboard=True)
        button1 = telebot.types.KeyboardButton(f'Да')
        button2 = telebot.types.KeyboardButton(f'Нет')
        keyboard.row(button1, button2)
        states["kb"] = "kb1"
        bot.send_message(message.chat.id, message, reply_markup=keyboard)
    
    def ... клавиатура2
        keyboard = telebot.types.ReplyKeyboardMarkup(resize_keyboard=True)
        button1 = telebot.types.KeyboardButton(f'Да')
        button2 = telebot.types.KeyboardButton(f'Нет')
        keyboard.row(button1, button2)
        states["kb"] = "kb2"
        bot.send_message(message.chat.id, message, reply_markup=keyboard)
    
    @bot.message_handler(content_types=['text'])
    def echo_text(message):
        if states["kb"] == "kb1":
            if message.text == 'Да':
        elif states["kb"] == "kb2":
            if message.text == 'Да':
    Ответ написан
  • Как использовать функцию в других функциях?

    @o5a
    Если цель - использовать одно соединение, можно сделать через класс.

    class DataBase():
        def __init__(self, database_name):
            self.conn = sqlite3.connect(database_name)
            self.cursor = self.conn.cursor()
    
        def commit(self):
            self.conn.commit()
    
        def close(self):
            self.conn.close()
    
    # создаем объект класса
    db = DataBase('my_db.db')
    cursor = db.cursor
    
    # и в любой функции можем использовать
    cursor.execute ...
    db.commit()
    Ответ написан
    Комментировать
  • Sqlite3 возвращает только часть запроса, как исправить?

    @o5a
    Не совсем понятно, о чем речь, но запрос в шапке вообще никак не связан с полем id_q
    Если действительно используется указанный запрос, и данные не выбираются, возможно у Вас в поле answers (или наоборот в тексте вопроса) лишние пробелы. По скриншотам этого не оценить.
    Ответ написан
    3 комментария
  • Как сохранить видео которое отправил пользватель телеграмм боту?

    @o5a
    Простейший вариант. Стоит добавить проверки в виде try..except на случай ошибок.
    @bot.message_handler(content_types=['document'])
    def get_file(message):
        file_name = message.document.file_name
        file_info = bot.get_file(message.document.file_id)
        with open(file_name, "wb") as f:
            file_content = bot.download_file(file_info.file_path)
            f.write(file_content)
        bot.reply_to(message, f"OK. Сохранил {file_name}")


    Типы принимаемых файлов как раз прописываются в content_types, т.е. для видео надо будет использовать 'video' (добавить к списку или заменить).

    Я глянул, для видео нужно другие тэги использовать, и почему-то по аналогии с document не работает, но вот так должно
    @bot.message_handler(content_types=['video'])
    def get_file(message):
        file_name = message.json['video']['file_name']
        file_info = bot.get_file(message.video.file_id)
        with open(file_name, "wb") as f:
            file_content = bot.download_file(file_info.file_path)
            f.write(file_content)
        bot.reply_to(message, f"OK. Сохранил {file_name}")
    Ответ написан
  • Ошибка погодного телеграм бота "Город не найден"?

    @o5a
    В новых версиях библиотеки owm нужно использовать manager для работы, и уже через него запрашивать данные
    owm = pyowm.OWM(OWM_KEY, {'language': 'ru'})
    mgr = owm.weather_manager()
    observation = mgr.weather_at_place(location)
    Ответ написан
    4 комментария
  • Как из текста пользователя в телеграмм сделать переменную?

    @o5a
    Судя по логике, хотите иметь возможность получить запрашиваемый после "Введите текст" текст?
    Тогда нужно использовать register_next_step_handler. В нем прописывается следующая функция, которая принимает уже ввод текста.

    bot.send_message(message.chat.id, 'Введите текст')
    bot.register_next_step_handler(message, get_text)
    
    def get_text(message):
        message.text будет как раз запрашиваемый текст
    Ответ написан
    Комментировать