• Что делаю не правильно с SSH?

    Vindicar
    @Vindicar
    RTFM!
    Учи язык, что тут скажешь. Точнее, читай про области видимости и время жизни объекта.
    У тебя SSHClient - локальная переменная в методе InitSSH(). Она существует, пока метод выполняется, и видна только внутри этого метода. По завершению метода она уничтожается.
    Если тебе нужно, чтобы время жизни объекта превышало время выполнения метода, т.е. чтобы объект не уничтожался по его завершении - объект должен лежать в атрибуте класса. Тогда его время жизни будет (как правило) равно времени жизни экземпляра класса (например, формы), а область видимости будет покрывать все методы класса.
    Ответ написан
  • Почему не работает программа нормально?

    Vindicar
    @Vindicar
    RTFM!
    Ты объявляешь функцию replay(), но не вызываешь её.
    А вообще, тебе тут нужен цикл, а не рекурсия.
    Ответ написан
    Комментировать
  • Как перевести строку со шрифтом в обычный текст?

    Vindicar
    @Vindicar
    RTFM!
    Встроенной функции нет. И похоже, что речь идёт не столько о разных шрифтах, а сколько о гомоглифах - символах юникода из разных алфавитов, которые выглядят похоже. Например, как русское и латинское "о". Это нетривиальная задача, но пакет confusable_homoglyphs (ставится через pip) может помочь. В частности, функция is_confusable().
    from confusable_homoglyphs.confusables import is_confusable
    
    
    wtf = 'YOᑌ ᑎᗩᗰE 42'
    
    is_good = []
    result = []
    for c in wtf:
        data = is_confusable(c, preferred_aliases=[], greedy=True)
        if data:
            data = data[0]
            alias = data['alias']
            if alias in ('LATIN', 'COMMON'):
                data = False
        if data:
            is_good.append('!')
            print(data)
            result.append(data['homoglyphs'][0]['c'])
        else:
            is_good.append(' ')
            result.append(c)
        print()
    print(''.join(result))
    print(''.join(is_good))

    Работает неидеально, но настройки модуля лежат в JSON - можно кое-что поправить. Или создать issue на гитхабе проекта.

    Конечно, можно извратиться, отрендерить строку и прогнать по ней OCR, но это такая себе идея.
    Ответ написан
    1 комментарий
  • Можно ли воспроизвести синтезированный текст сразу после озвучки?

    Vindicar
    @Vindicar
    RTFM!
    Документация хромает, но есть такой пример.
    import torch
    
    language = 'ru'
    model_id = 'v3_1_ru'
    sample_rate = 48000
    speaker = 'xenia'
    device = torch.device('cpu')
    
    model, example_text = torch.hub.load(repo_or_dir='snakers4/silero-models',
                                         model='silero_tts',
                                         language=language,
                                         speaker=model_id)
    model.to(device)  # gpu or cpu
    
    audio = model.apply_tts(text=example_text,
                            speaker=speaker,
                            sample_rate=sample_rate)

    Я бы посмотрел на свойства/методы объекта audio через dir().
    Ответ написан
    Комментировать
  • Как принимать только уникальных пользователей?

    Vindicar
    @Vindicar
    RTFM!
    CREATE TABLE IF NOT EXISTS accounts (
                    id INTEGER PRIMARY KEY AUTOINCREMENT, 
                    users_name TEXT, 
                    acc_id INTEGER
    )

    Doplis01, ну вот и результат. Если у тебя УЖЕ ЕСТЬ уникальное для каждого пользователя целое число acc_id (естественный ключ), зачем ты добавил синтетический ключ id? Просто переделай таблицу, выкинь id, сделай acc_id PRIMARY_KEY без автоинкремента.
    Ответ написан
    2 комментария
  • Почему код из книги Эрика Метиза "Изучаем Python" не работает?

    Vindicar
    @Vindicar
    RTFM!
    def build_person(first_name, last_name, age=None):
    Ответ написан
    Комментировать
  • Почему съезжает последний элемент?

    Vindicar
    @Vindicar
    RTFM!
    " "*(len(str(len(filenames)))-len(str(i+1)))
    1. Открой для себя переменное выравнивание в форматировании
    2. Открой для себя join()
    3. Открой для себя второй параметр enumerate()

    max_index_len = len(str(len(filenames)))
    m = '\n'.join([
        f"{i:>{max_index_len}}. {filename}" 
        for i, filename in enumerate(filenames, 1)
    ])
    Ответ написан
    4 комментария
  • Как создать триггер cv2 Python?

    Vindicar
    @Vindicar
    RTFM!
    1. Выясни, что возвращает haar_cascade.detectMultiScale(), если в кадре нет лица - None или пустой массив?
    2. Храни флаг "на прошлом кадре было лицо", обновляй его в конце тела цикла while True
    3. После детекта лица проверяй, если на прошлом кадре лица не было, а на новом есть - делай отправку уведомления.

    А вот как подружить ТГ бота с этим циклом - уже второй вопрос. Я бы запустил приведённый код в потоке и использовал queue.Queue для связи потока с анализом видео и потока с ботом. Т.е. когда обнаружил лицо, кидаешь кадр в очередь. А в основном потоке периодически проверяешь очередь на предмет наличия новых кадров.
    Альтернативно, если бот асинхронный, можно переделать цикл на корутину, добавив небольшую задержку через await asyncio.sleep() и заменив requests на aiohttp. Не очень изящное решение, но может и сойдёт.
    Ответ написан
    Комментировать
  • Как организовать работа нескольких пользователей с ботом (ООП telebot)?

    Vindicar
    @Vindicar
    RTFM!
    Хранилище, где значению chat.id сопоставляется значение answer.
    Простейший вариант - словарь (dict), но этот словарь не переживёт перезапуск бота.
    БД будет сложнее, но зато персистентно - что в БД попало, то там и будет при следующем запуске.
    Ответ написан
    2 комментария
  • Как пофиксить RuntimeError: This event loop is already running?

    Vindicar
    @Vindicar
    RTFM!
    Разработчик - идиот и не подумал, что его код может вызываться в асинхронной программе. Либа валится не только в асинхронной программе, но и в Jupyter Notebook, и в Google Collab, потому что и тот и тот по природе асинхронные. Фикс обещается с прошлого мая, а воз и ныне там.
    Но на гитхабе описан костыль с пакетом nest-asyncio. Попробуй его. Просто поставь пакет и добавь в начало кода бота:
    import nest_asyncio
    nest_asyncio.apply()

    С моей точки зрения это грязнущщий хак, но всё же лучше чем ничего.
    Ответ написан
    5 комментариев
  • ERROR:asyncio:Task exception was never retrieved не могу разобраться?

    Vindicar
    @Vindicar
    RTFM!
    await message.reply(chat_id,f"Привет, {user_full_name}!\n"
    f"Введите ваше имя :",reply_markup = nav.mainMenu)

    На кой ты при ответе на конкретное сообщение указываешь chat_id? Сообщение и так знает, кто его отправил.

    Подробнее

    Как найти строку, в которой проблема?
    В секции Traceback (most recent call last): только одна запись относится непосредственно к твоему коду:
    File "d:\telegram_bot\bot.py", line 79, in start_handler
    await message.reply(chat_id,f"Привет, {user_full_name}!\n"

    Всё выше и ниже ссылается на venv\lib\site-packages\aiogram. Значит, дело именно в этой строке.

    Как понять, в чём проблема?
    При отправке сообщения можно указать два позиционных параметра: текст сообщения и parse_mode, т.е. как отформатировано сообщение (HTML, markdown или еще что). Раз unsupported parse_mode, значит, во второй параметр попало что-то постороннее. А самый простой способ этому случиться - если перед текстом сообщения есть что-то лишнее. У тебя chat_id стало текстом, а собственно текст стал parse_mode.
    Ответ написан
    Комментировать
  • Как запланировать перезапуск программы на Python?

    Vindicar
    @Vindicar
    RTFM!
    Вообще это лучше делать не внутренними средствами сервиса, а средствами сервера, на котором он развёрнут: cron под никсами, планировщик задач под виндой.

    Но фраза "чтобы даты обновлялись" намекает, что имеет место проблема XY: вместо того, чтобы поправить логику программы, пытаешься прикостылить её периодический перезапуск.
    Можешь поделиться, что там за даты такие?
    Ответ написан
  • Почему бот не отправляет сообщения?

    Vindicar
    @Vindicar
    RTFM!
    У обработчика сообщений должен быть только один параметр - message.
    Ответ написан
    Комментировать
  • Почему не получается авторизироваться через requests?

    Vindicar
    @Vindicar
    RTFM!
    Потому что надо исходный код целевой страницы почитать, ну и разобраться, как пользоваться инструментами разработчика в браузере, чтобы понять, какие запросы выполняются.
    https://edu.tatar.ru/login - это URL для получения страницы с формой входа. А вот сама форма отправляет данные на URL https://edu.tatar.ru/logon. Именно по этому адресу я бы и делал запрос.
    Ответ написан
    Комментировать
  • Почему звук останавливается на пару миллисекунд а потом продолжает воспроизводиться?

    Vindicar
    @Vindicar
    RTFM!
    Потому что на остальные операции (такие как подгрузка нового чанка, подготовка объектов, и прочее) уходит ненулевое время.
    Тебе нужно два потока, и очередь (queue.SimpleQueue или queue.Queue) для связи между ними. Один поток подгружает данные, формирует экземпляры AudioSegment, и подкладывает их в очередь. Другой - только вытаскивает их из очереди и делает play. Тогда если у тебя соединение достаточно быстрое, то очередь будет пополняться быстрее, чем она опустошается.
    Но и тогда могут быть проблемы из-за питоновских потоков. Надо экспериментировать.
    Ответ написан
    Комментировать
  • Что делать если бот дискорд не отвечает на комнды?

    Vindicar
    @Vindicar
    RTFM!
    Если ты используешь не slash commands, а классические команды в сообщениях, то боту нужно иметь доступ к тексту сообщений. А значит, нужен интент guild_messages (и dm_messages для команд в личке).
    Собственно, slash commands для того и ввели, чтобы ботов не оповещать постоянно о болтовне в чате на случай если там вдруг проскользнёт команда.
    Ответ написан
    2 комментария
  • Запуск Python скрипта по HTML кнопке?

    Vindicar
    @Vindicar
    RTFM!
    Если сайт уже есть, то настроить скрипт как CGI-приложение, кнопка должна делать запрос к серверу, который будет обрабатываться этим приложением. Конкретная настройка зависит от того, какой http-сервер используется.

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

    Vindicar
    @Vindicar
    RTFM!
    Перебрать список, проверить каждый кортеж.
    Ответ написан
    Комментировать
  • Как заменить time.sleep(N)?

    Vindicar
    @Vindicar
    RTFM!
    Создай threading.Event и используй метод wait(). Если event взведён (set()), то wait прервётся немедленно.
    Правда, я не помню, как он сигнализирует о таймауте - если исключением, его нужно ловить.
    Ответ написан
    Комментировать
  • Как убрать эту ошибку?

    Vindicar
    @Vindicar
    RTFM!
    Размер двух накладываемых изображений точно одинаков? Проверь.
    Ответ написан