Задать вопрос
  • Как найти адрес в памяти процесса?

    Vindicar
    @Vindicar
    RTFM!
    Читаем документацию же!
    https://pymem.readthedocs.io/en/latest/api.html#py...
    Given a handle over an opened process and a module will scan memory after a byte pattern and return its corresponding memory address.


    https://pymem.readthedocs.io/en/latest/api.html#py...
    Search a byte pattern given a memory location. Will query memory location information and search over until it reaches the length of the memory page. If nothing is found the function returns the next page location.
    Ответ написан
  • Как посмотреть все редиректы запроса?

    Vindicar
    @Vindicar
    RTFM!
    Туда попадают только редиректы через коды ответа HTTP 3XX.
    Javascript-редиректы или тег meta-refresh сработают в браузере, но requests их не обрабатывает, и потому ничего о них не знает.
    Ещё один возможный механизм - DNS-запись CNAME для запрошенного доменного имени. Не уверен насчёт её реализуемости и взаимодействия с requests, но я сомневаюсь, что это будет замечено.
    Ответ написан
  • Can only concatenate list (not "str") to list. В чём проблема?

    Vindicar
    @Vindicar
    RTFM!
    Что в списке?
    Чтобы твой код работал, task должен быть не просто списком, а списком списков. Если в нём затесалась строка, то получишь именно эту ошибку.

    До кучи, для решения вашей задачи может быть проще использовать itertools.chain.from_iterable().
    Ответ написан
  • Как можно защитить компиляцию python?

    Vindicar
    @Vindicar
    RTFM!
    Можешь предварительно обфусцировать код с помощью pyarmor. Но это далеко не панацея. Или накрутить на исполняемый файл упаковщик.
    Ответ написан
  • Как правильно использовать selenium в асинхронном коде?

    Vindicar
    @Vindicar
    RTFM!
    Посмотри в сторону arsenic
    Ответ написан
    Комментировать
  • Почему не работает api в моем коде бота дискорд discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Не работает - выводит ошибку в консоль? Или молча не работает?
    Если молча, заверни тело vimeworld() в блок
    try:
        ...
    except Exception as err:
        print(err)

    Также можно расставить отладочные print(), чтобы понять, на каком месте происходит ошибка/подвисает программа.

    Вообще я вижу как минимум ошибку в строке
    r[0]['total'].json
    Судя по JSON, который мне отдаёт указанный URL, это должно выглядеть примерно так:
    json_data = r.json()
    total = json_data['total']
    await ctx.send(total)


    Когда разберёшься с этим, прими к сведению следующее: discord.py - асинхронная однопоточная библиотека. Пока выполняется синхронный код, например, твой обработчик команды, бот не может делать ничего другого. А request - как раз синхронная библиотека! Пока она выполняет запрос, она блокирует работу программы. Поэтому если целевой сайт "задумается", твой бот подвиснет. Мигрируй код на библиотеку типа aiohttp. Она тоже асинхронная, и на время общения с сайтом твой бот сможет заниматься другими делами.

    Ну и напоследок, не стоит начинать учить питон с написания ботов. Тут достаточно подводных камней. Начни с азов, потом вернись к этому проекту.
    Ответ написан
    8 комментариев
  • Как лучше использовать библиотеки python в нескольких файлах с кодом?

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

    Также посоветую придерживаться норматива PEP8 в плане порядка импорта:
    Сначала импорты стандартных модулей.
    Потом импорты сторонних библиотек (то что ставил через pip).
    В последнюю очередь импорты модулей из твоего проекта.
    В каждой секции элементы можно упорядочить по алфавиту, если нет особых причин импортировать их в другом порядке.
    Ответ написан
    Комментировать
  • Что не так между кавычками: "sqlite3.OperationalError: near "̀": syntax error"? Учусь писать бота, по необходимости, но так ничего и не понял что там?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, если ты используешь синтаксис INSERT INTO table VALUES (...), то список значений должен в точности повторять список столбцов. У тебя порядок явно не совпадает. Используй синтаксис INSERT INTO table (столбец, столбец, ...) VALUES (значение, значение, ...), так проще контролировать правильность запроса.

    Во-вторых, никогда не формируй строку запроса с помощью форматирования строк! Это хороший способ заполучить SQL-инъекцию, Бобби Тейблз подтвердит. =) Используй плейсхолдеры (поищи строку "Never do this -- insecure!", и почитай рядом).
    Ответ написан
    3 комментария
  • Как сделать таймер в команде mute?

    Vindicar
    @Vindicar
    RTFM!
    Взять и сделать. В чём конкретно вопрос? Что именно не получается?
    Тупой лобовой вариант - использовать простую цепочку вызовов
    # выдать мьют
    await asyncio.sleep(время) # подождать
    # снять мьют
    в обработчике команды !mute. Но проблема в том, что если бот будет перезапущен, пока идёт ожидание, он забудет про этот таймер - и юзер останется замьюченным. Кроме того, проблематично будет управлять списком замьюченных.
    Вторая мысль - в обработчике !mute выдаём мьют, вычисляем время, когда его нужно снять, и записываем в БД пользователя, сервер, время снятия и причину.
    Затем раз в минуту проверяем эту БД на предмет наличия истёкших мьютов, извлекаем их и снимаем.
    Плюс - мьют переживёт перезапуск бота, и всегда можно посмотреть кто-когда-насколько-за что.
    Минус - так как проверяем раз в минуту, то сроки и остатки меньше минуты будут округлены вверх. Можно исправить, увеличив частоту проверки, но понапрасну долбать бота этой проверкой тоже не стоит.

    Сам мьют проще всего реализовать, создав соответствующую роль, и выдавать/снимать её юзеру.

    Как-то так. За конкретными ответами "какие методы вызвать" - в документацию. Если нужна помощь с конкретными ошибками - создавай новый вопрос, приводи код (отформатируй кнопкой </>!) и полный текст ошибки.
    Ответ написан
    Комментировать
  • Как исправить следующую ошибку?

    Vindicar
    @Vindicar
    RTFM!
    Гуглинг нашел вот этот ответ на stackoverflow.
    Если я верно понял, там предлагается сделать так:
    from tqdm._tqdm_notebook import tqdm_notebook
    tqdm_notebook.pandas()

    И далее по тексту. Но гарантий дать не могу, сам с такой ошибкой не сталкивался.
    Ответ написан
    1 комментарий
  • Как проверить присутствие данного файла в данном каталоге с помощью os.listdir()?

    Vindicar
    @Vindicar
    RTFM!
    Что-то типа такого. Метод resolve() нужен, чтобы разобраться с элементами типа .. и символическими ссылками, и получить абсолютные пути.
    from pathlib import Path
    target_path = ... #определяешь целевой путь
    
    if Path(sys.argv[0]).parent.resolve() == Path(target_path).resolve():
        print('Тот же путь!') #оба пути указывают на один каталог
    Ответ написан
    Комментировать
  • Не могу спарсить страницу?

    Vindicar
    @Vindicar
    RTFM!
    1. Проверь, что за ответ получает твой скрипт от сайта (тупо запиши в файл и посмотри). Многие сайты защищаются от таких горе-парсеров.
    2. Даже если сайт не защищается специально, информация может подгружаться скриптом, т.е. страница изначально её не содержит. В этом случае нужно или реверс-инжинирить скрипт (выяснять, что за запрос он делает и пытаться воспроизвести), или использовать управляемый скриптом браузер типа selenium.
    Ответ написан
    Комментировать
  • Свойства файлов в python?

    Vindicar
    @Vindicar
    RTFM!
    Для каждого формата файла всё равно потребуется свой отдельный подход.
    Тема изображения - вообще не вариант. Разве что ты хочешь обучать классификатор и потом гонять его на каждом изображении.
    Ответ написан
  • Подписка на софт на пайтоне?

    Vindicar
    @Vindicar
    RTFM!
    Посмотри в сторону pyarmor, он это умеет (и, главное, умеет обфусцировать код, чтобы защиту было не так-то просто отломать). Обойти его можно, но уже не совсем тривиально.
    Ответ написан
  • Как проверить, выключил ли участник микрофон?

    Vindicar
    @Vindicar
    RTFM!
    Почитать документацию.
    class discord.VoiceState
    Represents a Discord user’s voice state.
    deaf
    bool – Indicates if the user is currently deafened by the guild.
    mute
    bool – Indicates if the user is currently muted by the guild.
    self_mute
    bool – Indicates if the user is currently muted by their own accord.
    self_deaf
    bool – Indicates if the user is currently deafened by their own accord.
    Ответ написан
    Комментировать
  • Как настроить расширение frame'ов?

    Vindicar
    @Vindicar
    RTFM!
    self.surf.grid_columnconfigure(0, weight=1)
    self.surf.grid_columnconfigure(1, weight=1)

    Обозначит, что при расширении сжатии оба столбца должны расширяться одинаково.
    Если веса сделать, скажем, 3 и 1, то столбец с весом три "отъест" 75% дополнительного пространства, а с весом 1 - 25%. Если вес столбца 0, он не меняет размер.

    Аналогично есть метод .grid_rowconfigure().
    Ответ написан
    3 комментария
  • Как разобрать запрос на несколько переменных в боте телеграм?

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

    Так что я бы сначала посмотрел argparse. Оно заточено на аргументы командной строки, но чат-боты недалеко от неё ушли.
    Ответ написан
    4 комментария
  • Как добавить айдишников в конфиг.py?

    Vindicar
    @Vindicar
    RTFM!
    > operator = "4609....71" and "109....307"
    Извините мой французский, но что это за фигня? Вы применяете логические операторы к строкам, неужели ничего неладного не заподозрили?
    Вам нужна коллекция idшников, и нужно проверять вхождение в эту коллекцию!
    Например, множество (так как я не думаю, что оператор должен входить в список дважды, верно?):
    operators = {"4609....71",  "109....307"}
    for op in operators: #перебираем элементы множества
        await bot.forward_message(op, message.from_user.id, message.message_id)

    Тогда добавить нового оператора будет легко и просто:
    operators.add("1234....890")
    При этом при попытке повторного добавления просто ничего не произойдёт.
    Аналогично можно удалить:
    operators.remove("1234....890")
    При попытке удаления отсутствующего оператора будет выброшено KeyError.
    Ну и если надо проверить, является ли id оператором:
    if "1234...890" in operators:
    Ответ написан
    Комментировать
  • Как изменить sys.path в venv?

    Vindicar
    @Vindicar
    RTFM!
    А что за модули?
    Если это pip-пакеты, их нужно установить в этот конкретный venv, используя местный pip.
    Если это твои собственные модули, которыми ты часто пользуешься - можешь попытаться создать свой пакет и установить его как любой другой. Пакет не требуется загружать pypi.org, pip вполне устанавливает пакеты из файла.
    Если же это локальные модули проекта, то тут надо смотреть структуру каталогов этого проекта.
    Ответ написан
  • Sqlite3.OperationalError: no such table: users?

    Vindicar
    @Vindicar
    RTFM!
    Засунь текст ошибки в гугл-транслейт, что ли...
    Он тебе английским по белому говорит, что таблица users не создана. Как mr_forlife объяснил, нужно создать таблицу через запрос вида CREATE TABLE. Ты создаёшь только login_id, но не users.
    Ответ написан
    2 комментария