Ответы пользователя по тегу Python
  • Является ли python-shell безопасным решением для запуска untrusted-кода на Node.js сервере?

    Vindicar
    @Vindicar
    RTFM!
    Не думаю, он создаёт дочерний процесс от ноды, но в доках не написано, что этому процессу задаются особые права - значит, права будут как у ноды.

    Я бы сделал минимум три уровня защиты:
    1. Полученный от пользователя скрипт выполняется не напрямую, а в скрипте-обёртке. Обёртка подписывается на события аудита Питона, и мониторит событие импорта. При попытке импорта модуля не из белого списка сигнализируем родительскому процессу и вызываем заранее сохранённую os._exit(), чтобы немедленно прибить интерпретатор. Также на обёртку можно возложить собственно прогон тестов.
    2. Скрипт-обёртка должен выполняться от nobody:nobody с правами только на временную директорию, в которой лежит сам скрипт и его виртуальное окружение. Директория должна пересоздаваться заново при каждом запуске скрипта. Может иметь смысл оформить выполнение обёртки внутри chroot.
    3. Выполнение должно происходить внутри контейнера, который должен перезапускаться время от времени (не обязательно при каждом запуске скрипта, можно раз в сутки или около того). Передача скрипта внутрь контейнер - через сетевой сервис, хотя можно и через примонтированную директорию. Внутри контейнера сервис сам создаёт временную директорию с окружением, переносит скрипт в эту директорию (с переименованием в заранее известное имя - user_script.py или подобное) и только тогда запускает обёртку.

    В этом случае атакующему нужно будет сначала обойти аудит импортов, потом сделать эскалацию привилегий, потом выбраться из-под chroot. И даже если он закрепится в контейнере, контейнер периодически перезапускается, так что малварь будет снесена.
    Ответ написан
    3 комментария
  • Как сравнить пустое значение из БД?

    Vindicar
    @Vindicar
    RTFM!
    Учи матчасть. Всё делается одним запросом.
    SELECT referal_id, COUNT(*) FROM users GROUP BY referal_id

    Группировка сделает так, что для каждого referal_id будет выведена одна строка, а групповые функции посчитают некий итог для каждой группы строк с одним и тем же значением referal_id. В частности, COUNT() посчитает сколько строк в группе.
    Ответ написан
    Комментировать
  • Как сделать такой функционал кнопок Telebot python?

    Vindicar
    @Vindicar
    RTFM!
    Отредактируй сообщение, при редактировании отправь новую разметку для кнопок?
    Ответ написан
    Комментировать
  • Почему не корректно работает код?

    Vindicar
    @Vindicar
    RTFM!
    for i in range(len(zones)):
                        pin = i + 2  # Номер пина соответствует номеру зоны + 1
                        if i+1 in in_zones:
                            # Если объект находится в зоне, зажигаем светодиод
                            board.digital[pin].write(1)
                        else:
                            pin = i + 2
                            # Если объект не находится в зоне, гасим светодиод  <--- НАПРАСНО
                            board.digital[pin].write(0)

    Косяк вот тут. Если текущий объект не находится в зоне, это не значит что никакой другой, ранее найденный объект не находится в этой зоне.
    Сделай массив bool по числу зон, в начале итерации выставь все элементы в false. По ходу итерации выставляй элемент в true если в зоне найден человек.
    В конце итерации выставляй светодиоды по элементам массива.
    Ответ написан
    1 комментарий
  • Почему не заканчивается цикл while true?

    Vindicar
    @Vindicar
    RTFM!
    В твоём коде break прервёт цикл for command in commands.
    Выполнение внешних двух циклов продолжится.
    Ответ написан
    Комментировать
  • Можно ли задать условия для работы opencv?

    Vindicar
    @Vindicar
    RTFM!
    Ну и в чём вопрос? У тебя в коде уже есть проверка на силу совпадения (сравнение найденного максимума силы с некоторым порогом). Если тебе нужно выполнять другое действие, то добавь ветку else туда.
    Если тебе нужно просто крутить цикл, и выполнять действие, когда изображение найдётся, можешь завернуть в цикл while тело red() или даже просто вызывать её саму в цикле. Условие завершения цикла обдумай сам, я без понятия что ты хочешь сделать.
    Ответ написан
    Комментировать
  • Как отправить аудиофайл в боте телеграм Python?

    Vindicar
    @Vindicar
    RTFM!
    Сначала проверь путь. Ты указываешь относительный путь к файлу, а он рассчитывается исходя из текущей рабочей директории. Которая может совпадать или не совпадать с директорией где лежит скрипт, это зависит от способа запуска скрипта.

    Так что лучше ориентируйся так. sys.argv[0] содержит путь к скрипту, а модуль pathlib позволяет манипулировать путями.
    import sys
    from pathlib import Path
    
    BASE_DIR = Path(sys.argv[0]).parent.resolve()  # каталог скрипта
    AUDIO = BASE_DIR / 'audio.mp3'  # файл в каталоге скрипта
    #......
    async def send_songs(message):
        await message.answer("Hello!")
        await message.answer("World!")
        audio = AUDIO.open('rb')
        await bot.send_audio(message.chat.id, audio)
    Ответ написан
  • Как "помечать" объекты, красиво ли добавлять свои атрибуты в чужие объекты?

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

    Vindicar
    @Vindicar
    RTFM!
    Проверять равенство строк (==), а не вхождение подстроки в строку (in).
    Ответ написан
    Комментировать
  • Ошибка в sqlite3 telebot?

    Vindicar
    @Vindicar
    RTFM!
    Выучить питон ДО того, как бросаться писать ботов, а не после.
    def summa (message: int) -> int:
        msg = bot.send_message(message.chat.id, 'Введите сумму перевода:')
        bot.register_next_step_handler(msg, perevod)


    Ты заявляешь, что функция возвращает int, и используешь её, как будто она возвращает int, но она ничего не возвращает - а раз так, она возвращает None.

    Ну и да, читай примеры из документации, как правильно использовать register_next_step_handler().

    sqlite тут вообще не при делах, но я замечу: не используй f-строки для формирования запросов. Вот, INSERT ты вроде правильно делаешь, так в чём проблема везде делать так же?
    Ответ написан
    Комментировать
  • Disnake не находит команду. как решить?

    Vindicar
    @Vindicar
    RTFM!
    На полноценную глобальную регистрацию команды бота в дискорде уходит время. Кто-то называл срок около часа что ли, я сам не пробовал.
    В доках написано, как тестировать в рамках одного сервера. Попробуй сначала так.
    from disnake.ext import commands
    
    command_sync_flags = commands.CommandSyncFlags.default()
    command_sync_flags.sync_commands_debug = True  # чтобы бот писал в лог ход регистрации
    
    bot = commands.Bot(
        command_prefix='!',
        test_guilds=[123456789], # локальная регистрация для одного сервера
        command_sync_flags=command_sync_flags,
    )
    Ответ написан
  • С чем может быть связана ошибка "asyncio.exceptions.CancelledError"?

    Vindicar
    @Vindicar
    RTFM!
    Открой доки и почитай. CancelledError выбрасывается в корутине, когда она завёрнута в таск через create_task() и на этом таске вызван метод cancel(). Это позволяет прервать выполнение корутины через выбрасывание специального исключения. Исключение не наследуется от Exception, поэтому обычный try-except его не ловит, если только специально не указать try ... except CancelledError. Так сделано, потому что при выходе через всплывание исключения будут отрабатывать все нормальные питоновские механизмы: блоки finally, блоки with и так далее.
    Я полагаю, команда на остановку бота делает cancel() на его главной корутине, скорее всего запущенной внутри start_polling(). Это исключение всплывает в твой main(). Но поскольку main() выполняется в asyncio.run(), то исключение всплывает туда. Это исключение не имеет особого смысла вне asyncio, так что я полагаю, run() ловит это исключение и вместо него выбрасывает KeyboardInterrupt() как ближайший не-асинхронный эквивалент. Это исключение всплывает на верхний уровень и останавливает интерпретатор.

    Ты можешь ловить CancelledError в main(), чтобы спокойно завершить работу бота. Ну или ловить KeyboardInterrupt() в теле скрипта, на вызове asyncio.run().
    Ответ написан
    1 комментарий
  • Как подключить 2 коннектора в 1 сессии aiohttp?

    Vindicar
    @Vindicar
    RTFM!
    Из гитхаба aiohttp_proxy:
    class ProxyConnector(TCPConnector):
        def __init__(
            self, ..., 
            **kwargs
        ):
            ...
            super().__init__(**kwargs)
            ...

    Т.е. ProxyConnector наследует от TCPConnector и пробрасывает в него все неизвестные kwagrs-параметры.
    А раз так, ты можешь попробовать прокинуть ssl_context прямо в ProxyConnector.

    Правда, вопрос такой - для чего должен использоваться этот ssl_context? Для коннекта скрипта к прокси, или для коннекта к прокси к сайту? Потому что я сомневаюсь, что второе возможно.
    Ответ написан
  • Как использовать cfscrape асинхронно?

    Vindicar
    @Vindicar
    RTFM!
    loop.run_in_executor() чтобы запустить код в отдельном потоке, и обернуть этот поток в асинхронный таск.
    Ответ написан
  • Как работает код в python и почему разные значения?

    Vindicar
    @Vindicar
    RTFM!
    У тебя условие имеет вид: A and B or C, и вычисляется как (A and B) or C.
    Если C истина, то условие будет иметь вид (A and B) or True, что всегда даст истину, независимо от A and B.
    Полагаю, ты был уверен, что условие вычисляется как A and (B or C), но набор скобок у тебя этому порядку не соответствует.
    Ответ написан
    Комментировать
  • Почему telebot не отправляет фото?

    Vindicar
    @Vindicar
    RTFM!
    Ты задал относительный путь к файлу. Ты уверен, что он лежит в текущей рабочей директории?
    Текущая рабочая директория может, но не обязана совпадать с директорией скрипта.
    Тебе лучше вычислить полный путь к файлу, используя sys.argv[0], чтобы узнать путь к скрипту, и модуль pathlib для манипуляции путями.
    Ответ написан
    Комментировать
  • Как сделать полное выполнение условия if-elif Python?

    Vindicar
    @Vindicar
    RTFM!
    Не надо описывать один обработчик внутри другого.
    Это НИКОГДА не будет работать так, как ты этого ожидаешь.
    Ответ написан
  • При нажатие на кнопку в telebot ни сего не происходит, проблема и её решение?

    Vindicar
    @Vindicar
    RTFM!
    @bot.callback_query_handler(func = lambda callback: True)

    Ты говоришь боту "если пользователь нажал кнопку, вызови функцию ниже, и делай это для любых кнопок" (func = lambda callback: True). Но у тебя в коде ДВЕ функции-обработчика, и обе говорят, что их надо вызывать для любых кнопок. Бот в таком случае вызывает только одну из них.
    Измени func так, чтобы она проверяла, какая кнопка нажата. Например, если укажешь
    func = lambda callback: callback.data == 'register'
    , то только кнопка, отдающая строку "register", будет вызывать срабатывание этой функции.

    Если тебе удобнее сделать выбор внутри функции, то можно сделать так:
    func = lambda callback: callback.data in ('faq', 'register')
    , тогда функция ниже будет вызвана при нажатии любой из двух кнопок, и тебе нужно будет внутри функции выбрать один из двух вариантов.

    В любом случае, нельзя допускать, чтобы у двух и более обработчиков проверка подходила под одну и ту же кнопку.
    Ответ написан
    Комментировать
  • Почему не скачивается модуль discord?

    Vindicar
    @Vindicar
    RTFM!
    Какой питон стоит? 3.12 вроде как ещё не поддерживается.
    Ответ написан