• При запуске скрипта пишет 'NoneType' object has no attribute 'encode' Check your login or password please! как решить проблему?

    Vindicar
    @Vindicar
    RTFM!
    Ну если 31я строка, то разгадка несложная. Ты откуда пароль-то получаешь?
    Через os.getenv(). А если переменная окружения (в твоему случае EMAIL_PASSWORD) не задана, то getenv() вернёт None. Твой код эту возможность не учитывает.
    Ответ написан
  • Как временно хранить кэш в python?

    Vindicar
    @Vindicar
    RTFM!
    Реализуй кэш как отдельную функцию, самостоятельно или через functools.
    def do_stuff_nocache(*args, **kwargs):
        ...
    
    @lru_cache
    def do_stuff(*args, **kwargs):
        return do_stuff_nocache(*args, **kwargs)


    Ну или залезь в кишки lru_cache. Но это плохая идея, так как если ты уберешь декоратор, код сломается.
    @lru_cache
    def do_stuff(*args, **kwargs):
        ...
    
    
    print(do_stuff.__wrapped__(*args, **kwargs))


    Еще можно сделать do_stuff.clear_cache() но это очистит кэш вообще, что, скорее всего, нежелательно.
    Ответ написан
    Комментировать
  • Как получить нажатую реакцию из ЛС бота discord pycord?

    Vindicar
    @Vindicar
    RTFM!
    В документацию к используемой библиотеке? По идее реакции в ЛС обрабатываются точно так же, как реакции на сервере, разницы быть не должно.
    Если ты используешь discord.py, то можешь
    а) попытаться использовать wait_for()
    б) хранить где-то соотношение "id пользователя - id сообщения", и обрабатывать on_reaction_add(). А в обработчике уже смотреть, если данному сообщению сопоставлен ждущий роли пользователь - дать роль.
    Ответ написан
  • Как отправить sql запрос к базе данных на вывод даты регистрации пользователя?

    Vindicar
    @Vindicar
    RTFM!
    SELECT user_id, join_date EXTRACT(DAY FROM date) as day FROM users VALUES (?, ?)

    SELECT запросы c условием пишутся не так.
    Ответ написан
    Комментировать
  • Как принимать и обрабатвать ключи типа `-key "value"` в строках?

    Vindicar
    @Vindicar
    RTFM!
    argparse, но ей требуется уже подготовленный список токенов, т.е. отдельных частей строки. Такой список можно сделать через shlex.
    Ответ написан
    Комментировать
  • Почему не работает выдача ссылки в боте телеграмма?

    Vindicar
    @Vindicar
    RTFM!
    aiogram.utils.exceptions.BadRequest: Can't invite members to a private chat

    Ты передаёшь в функцию ID приватного чата, а не комнаты. Проблема в этой строке.
    await bot.approve_chat_join_request(chat_id=callback_query.message.chat.id, user_id=user_id)
    Ответ написан
    Комментировать
  • Как использовать minet библиотеку для скрапинга из csv файла?

    Vindicar
    @Vindicar
    RTFM!
    Скорее всего, никак. Я не думаю, что автор библиотеки предусматривал ТАКОЙ вариант использования.
    Да и потом, что значит "при помощи query"? Если речь про поисковый запрос, то этот запрос почти наверняка передаётся на соответствующий endpoint для api твиттера, так что поиск реализует не библиотека.

    Ну а csv можно читать питоном "из коробки", с помощью одноименного модуля. Так что вопрос будет только "как подключить полнотекстовый поиск к скрипту на питоне".
    Ответ написан
    Комментировать
  • Что делаю не правильно с 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 комментария
  • Как оптимизировать элементы на двухмерном массиве(пиксели) в прямоугольники?

    Vindicar
    @Vindicar
    RTFM!
    Для простых случаев - да.
    Если текущий и следующий элемент формируют горизонтальную или вертикальную прямую, запоминаем, который вариант реализовался (влево, вправо, вверх, вниз) и составляем список сегментов для отрисовки.
    Пока элементы после следующего ложатся на эту прямую, добавляем их в список отрисовки. Если встретили элемент, который не ложится - дальше не проверяем.
    Все элементы в списке можно отрисовать за один проход, так как они формируют линейный сегмент. Дальшейшую обработку выполняем, начиная с первого "неподходящего" элемента.
    В этом случае мы каждый элемент читаем только один раз, поэтому алгоритм должен по идее иметь линейную сложность, как и просто цикл.

    Но тут есть два вопроса.
    1. А ты уверен, что дело именно в количестве "пикселей"? Ты замерял производительность, и именно это - узкое место?
    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()

    С моей точки зрения это грязнущщий хак, но всё же лучше чем ничего.
    Ответ написан
    4 комментария
  • 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: вместо того, чтобы поправить логику программы, пытаешься прикостылить её периодический перезапуск.
    Можешь поделиться, что там за даты такие?
    Ответ написан