• Почему не меняются кнопки в боте?

    Vindicar
    @Vindicar
    RTFM!
    Кнопки привязаны к сообщению. Чтобы отправить новые кнопки, нужно послать новое сообщение. Ты этого не делаешь.
    Ответ написан
  • Тайминг в сообщении?

    Vindicar
    @Vindicar
    RTFM!
    Модуль time. Храни для каждого пользователя сведения о том, когда он успешно вызвал команду последний раз.
    При вызове команды проверяй, есть ли это время, и если есть, достаточно ли времени прошло.

    Код - сам.
    Ответ написан
    Комментировать
  • Ошибка в боте 'NoneType' object has no attribute 'lower'?

    Vindicar
    @Vindicar
    RTFM!
    Очевидно, event.obj.text содержит значение None по какой-то причине. Проверяй значение, прежде чем пытаться вызывать его методы.
    Ответ написан
  • Как изменить кортеж в файле?

    Vindicar
    @Vindicar
    RTFM!
    Не изобретать велосипед, а использовать формат JSON. Средства работы с ним в питоне есть из коробки, в одноименном модуле.

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

    Vindicar
    @Vindicar
    RTFM!
    Один из сайтов, на которые ты делаешь запрос через get(), или не отвечает, или недоступен по какой-то другой причине.

    Собственно, наивно думать, что это всегда сработает. Сеть непредсказуема. Сайт может работать, может тормозить, может лежать, может тебя забанить, у тебя может не быть интернета - есть сто и одна причина, почему сайт может не работать. Так что готовься к ошибкам заранее. Заворачивай обращения к сайту в try-except, продумывай, что делать, если обращение не удалось, и т.д.
    Ответ написан
    Комментировать
  • Почему код перестает работать когда пишу с Numpad?

    Vindicar
    @Vindicar
    RTFM!
    По поводу твоего второго вопроса: listener - это почти наверняка поток выполнения. И я подозреваю, что этот поток отмечен как daemon - т.е. фоновый поток. Он работает независимо от главного потока, который выполняет тело программы. Главный поток запускает listener, и переходит на input(). Когда input() вернёт управление, главный поток дойдёт до конца программы и завершится.
    Когда в программе на питоне остаются только фоновые потоки, она завершается.
    Так что если тебе нужно, чтобы программа просто ждала, while True: time.sleep(1.0) в помощь. Этот цикл прервать будет сложно.
    Ответ написан
    Комментировать
  • To many values to unpack как фиксить?

    Vindicar
    @Vindicar
    RTFM!
    Если ты используешь распаковку коллекции (т.е. оператор вида a, b, c = some_value), тебе нужно быть уверенным, что some_value содержит в точности столько значений, сколько переменных ты распаковываешь.
    Если это не так, есть три варианта:
    1. Если ты знаешь, сколько значений в возвращаемой коллекции, ты можешь просто добавить нужное количество переменных. a, b, c, _ = some_value. Символом _ обычно обозначаются неиспользуемые переменные/параметры.
    2. Если ты не знаешь, сколько значений в возвращаемой коллекции, или это число меняется, можно не выпендриваться, а работать с индексами. Но тебе нужно быть уверенным, что у тебя всегда есть как минимум нужное число значений.
    a = some_value[0]
    b = some_value[1]
    c = some_value[2]
    # и так далее.

    3. Есть ещё вариант распаковки, который работает, если ты значешь, что значений больше, чем нужно:
    a, b, c, *_ = somevalue

    Я бы посоветовал второй вариант
    Ответ написан
    Комментировать
  • Зачем PyCharm просит создавать пустую строку в коце?

    Vindicar
    @Vindicar
    RTFM!
    Документ PEP 8 (на который ссылается PyCharm) описывает рекомендуемую стилизацию кода на питоне. Чем единообразнее код, тем проще одному человеку будет читать код другого. И не стоит забывать, что ты сам через полгода - это всё равно что другой человек.
    Ряд инструментов позволяет автоматически проверить соответствие заданного кода стилю PEP 8, и PyCharm в их числе.
    Ответ написан
    Комментировать
  • Как извлечь эмодзи из картинки?

    Vindicar
    @Vindicar
    RTFM!
    Окей, гугл, opencv template matching.
    Когда научишься находить заранее известный эмодзи в изображении, делаешь базу эмодзи в искомом приложении и пробуешь находить их по очереди.
    Процесс можно будет ускорить, создав дерево - например, ищешь желтые кружки, если такой нашёлся с определённой степенью уверенности, только тогда ищешь желтые лица. Но это уже подробности.
    Ответ написан
    Комментировать
  • Как создать свой каскад для распознавания объектов?

    Vindicar
    @Vindicar
    RTFM!
    Я создавал лабораторную по этой теме, могу привести инструкцию.
    1. Загрузите набор утилит opencv(гугл-диск, но я советую поискать самостоятельно), в частности opencv_createsamples и opencv_traincascade, а также необходимые им DLL-библиотеки. Распакуйте их в рабочий каталог в корне диска, без русских букв и пробелов в названии. Здесь и далее предполагается, что C:\MyDirName - ваш рабочий каталог.
    2. Подготовьте фото вашего объекта. Используйте контрастный объект без движущихся частей, и желательно не дающий бликов. Для этой цели хорошо подходят логотипы.
    3. Подготовьте отрицательные примеры (не менее 100 изображений). Для этого можно снять короткое видео помещения, затем написать программу, которая разделяет это видео на отдельные кадры. Рекомендуется поместить их в отдельный подкаталог negatives.
    4. Подготовьте файлы, содержащие список файлов в этом каталоге. Их можно сгенерировать следующей парой команд в терминале:
      dir C:\MyDirName\negatives\*.jpg /B /S >C:\MyDirName\negatives\negatives_abs.txt

      dir C:\MyDirName\negatives\*.jpg /B >C:\MyDirName\negatives\negatives_rel.txt

    5. Создайте пустые подкаталоги C:\MyDirName\positives и C:\MyDirName\training. Поместите ваше изображение - положительный пример в каталог C:\MyDirName\ и назовите его positive.jpg. В качестве положительного примера желательно разместить ваш объект на светлом фоне, если он тёмный, и наоборот.
    6. Сгенерируйте положительные примеры с помощью утилиты opencv_createsamples. Команда будет выглядеть примерно следующим образом:
      C:\MyDirName\opencv_createsamples.exe -info positives\info.lst -img positive.jpg -bg negatives\negatives_rel.txt -maxxangle 0.1 -maxyangle 0.1 -maxzangle 0.1 -bgcolor 0 -bgthresh 0 -w 50 -h 50 -num 100

      Параметры:
      -info - выходной файл.
      -img - входное изображение - положительный пример
      -bg - фоновые изображения. Положительный пример будет наложен на них (в оттенках серого).
      -max?angle - допустимые углы поворота примера. Утилита выполнит перспективное преобразование примера перед наложением.
      -bgcolor и -bgthresh задают яркость (среднее и диапазон изменения) для "прозрачного цвета". Например, если ваш объект на белом фоне, задайте эти параметры равными 240 и 15 (диапазон яркости 225-255). Задав оба параметра равными 0, вы отключите эту функцию и все цвета будут непрозрачными.
      -w и -h задают минимальный размер для размещаемой копии вашего образца.
      -num - количество примеров, которые стоит генерировать. Не должно превышать количество изображений в каталоге.
      Утилита должна вывести ряд сообщений вида "Open background image", а в конце вывести "Done".
    7. Сгенерируйте vec файл следующей командой:
      C:\MyDirName\opencv_createsamples.exe -info positives\info.lst -num 100 -w 20 -h 20 -vec positives\positives.vec

      где info.lst был сгенерирован в ходе пункта 6.
      -w и -h задают минимальный размер для объекта, распознаваемого в ходе работы каскада.
      -num - количество сгенерированных примеров. Столько же, сколько и в пункте 6.
    8. Проведите обучение каскада с помощью утилиты opencv_traincascade. Команда будет иметь примерно следующий вид:
      C:\MyDirName\opencv_traincascade.exe -data training -vec positives\positives.vec -bg negatives\negatives_abs.txt -numStages 100 -numPos 100 -numNeg 100 -featureType haar -w 20 -h 20 -minHitRate 0.999 -maxFalseAlarmRate 0.4 -precalcValBufSize 4048 -precalcIdxBufSize 4048 -numThreads 24 -acceptanceRatioBreakValue 10e-5

      -data - каталог для рабочих данных, который вы создали в пункте 5.
      -vec - индекс, который был создан в пункте 7.
      -bg - файл со списком отрицательных примеров (используйте абсолютные пути!)
      -numPos и -numNeg - количество положительных примеров (пункт 6) и отрицательных примеров (пункт 3).
      -numStages - максимальное количество этапов каскада. Итоговый каскад может содержать меньшее количество этапов.
      -featureType - определяет тип признаков. Признаки Хаара обучаются медленнее, но зато более точны.
      -w и -h задают минимальный размер для объекта, распознаваемого в ходе работы каскада. Должны строго совпадать с заданными в пункте 7.
      -minHitRate и -maxFalseAlarmRate задают качество работы одного каскада.
      -acceptanceRatioBreakValue определяет момент, когда каскад перестаёт обучаться.
      -precalcValBufSize и -precalcIdxBufSize задают потребление памяти процессом.
      -numThreads определяет число рабочих потоков.
    9. По итогам обучения в каталоге training должен появиться файл cascade.xml, который можно загружать так же, как типовые каскады, поставляемые с opencv. Обратите внимание, что если вы хотите запустить обучение с начала, нужно очистить содержимое каталога training, иначе утилита будет дообучать существующий каскад.
    Ответ написан
    5 комментариев
  • Ошибка при попытке создать асинхронную функцию RuntimeWarning: coroutine 'gather_data' was never awaited?

    Vindicar
    @Vindicar
    RTFM!
    Ну если почитать внимательнее, тебе говорят в чём дело:
    File "D:\all\Programming\Парсинг\main.py", line 46, in gather_data
    pagination = int(soup.find('div', class_='pagination-wrapper').find('ul', class_='pagination-list css-1vdlgt7').find_all('li', class_='pagination-list-item')[-1].text)
    AttributeError: 'NoneType' object has no attribute 'find'

    Ты лихим кавалерийским наскоком пытаешься пройти по тегам, а какого-то из них просто нет в странице.
    Заверни код хотя бы в try-catch, и имей ввиду - сетевые операции по природе своей ненадёжны. Если сайт не твой, он может не ответить, ответить через полчаса, или прислать гоатсе вместо ответа. Так что нужно быть готовым к худшему.
    Ответ написан
  • Как использовать bot.exception_handler(telebot)?

    Vindicar
    @Vindicar
    RTFM!
    class ExHandler:
        def handle(self, error):
            print('Error: ', error)
    Ответ написан
    Комментировать
  • Не могу запустить пишет Error no such table: users?

    Vindicar
    @Vindicar
    RTFM!
    sqlite3.connect('teor.db')
    Ты уверен, что питоновский скрипт и клиент sqlite открывают один и тот же файл с базой данных?
    Ты указал относительный путь, т.е. путь относительно текущего рабочего каталога. Он может совпадать или не совпадать с каталогом, где лежит скрипт.
    На всякий случай, попробуй так:
    import pathlib, sys
    script_dir = pathlib.Path(sys.argv[0]).parent.resolve()  # путь к каталогу скрипта
    db_file = script_dir / 'teor.db'  # путь к файлу БД
    print(db_file)  # для проверки, какой файл открывается
    conn = sqlite3.connect(db_file)
    ...  # далее по тексту


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

    Vindicar
    @Vindicar
    RTFM!
    str.maketrans() чтобы сделать таблицу преобразований
    str.translate() чтобы её использовать.
    Правда, этот подход работает только для преобразований "1 символ -> 1 символ".
    Если тебе нужно что-то другое, то, как написали выше, словарь в помощь.
    Ответ написан
    2 комментария
  • Можно ли в месте файл указать ссылку?

    Vindicar
    @Vindicar
    RTFM!
    Можно было чуть-чуть погуглить примеры, и почитать код, там всё написано простым английским:
    async def recognize_song(
            self, data: Union[str, pathlib.Path, bytes, bytearray, AudioSegment]
        ) -> Dict[str, Any]:
            """
            Creating a song signature based on a file and searching for this signature in the shazam
            database.
                :param data: Path to song file or bytes
                :return: Dictionary with information about the found song
            """

    Т.е. data принимает или путь к файлу, или байты с содержимым файла.
    Поэтому ответ на твой вопрос: нужно самому скачать аудиофайл по ссылке, и скачанное содержимое отдать в recognize_song().
    Если у тебя ссылка на youtube, то либо используй пакет youtubedl, либо посмотри в примерах есть что-то на тему.
    Ответ написан
    Комментировать
  • Почему бот не отправяет мне значение после функции?

    Vindicar
    @Vindicar
    RTFM!
    if i1 == proverka_slova:
    Ты сравниваешь функцию со строкой. Что ты ожидал получить-то?
    Если тебе нужен текст сообщения, обращайся к свойствам объекта message (подозреваю, нужное свойство так и называется - text).
    Ответ написан
    4 комментария
  • OSError: exception: access violation reading, ctypes, Python, что делаю не так?

    Vindicar
    @Vindicar
    RTFM!
    a = c_char_p(f'{getcwd()}\\file.txt'.encode())
    b = c_char_p(b'Help me pls')

    Тут есть проблема. Ты получаешь указатель на объект, но ты не хранишь ссылку на этот объект.
    Что, если Питон сразу же его подберёт сборщиком мусора? У тебя указатель будет указывать на адрес, где был объект, а что там сейчас - фз. Если память не будет освобождена, то обращение может быть удачным. Если страницу памяти освободят - то поймаешь access violation.
    Положи строку в переменнную, и бери указатель по переменной. Тогда объект будет жить, пока жива переменная.
    Во-всяком случае, я бы начал с этого.
    Ответ написан
    2 комментария
  • Как выполнить код после завершения потоков?

    Vindicar
    @Vindicar
    RTFM!
    t.join() дождётся завершения для одного потока t. Если нужно дождаться завершения всех трёх потоков, то можно сделать join() в цикле.
    Ответ написан
    Комментировать
  • Не знаю как сделать так чтобы скрипт обрабатывал сообщения которые приходят ко мне в ЛС, а не в группах?

    Vindicar
    @Vindicar
    RTFM!
    Если хочешь, чтобы бот видел сообщения, отправленные на твою учетку, нужно запускать бота не как бота, а как клиента от твоей учётки. Потенциально чревато баном, и я не знаю, какие библиотеки позволяют делать такой userbot.
    Ответ написан
  • Как сделать так, чтобы бот отправлял текст в таком формате который я ему отправляю?

    Vindicar
    @Vindicar
    RTFM!
    caption отдаёт только plaintext (без форматирования). Вроде как есть свойство-список caption_entities, содержащее сведения о форматировании.
    Либо попробуй указать это свойство при отправке сообщения, параметром entities = message.caption_entities, либо разбирай элементы этого списка, ищи форматирование, и вставляй его вручную (там указывается позиция в строке, где форматирование начинается/заканчивается).
    Ответ написан
    3 комментария