• Discord.py как получить количество участников?

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

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

    Vindicar
    @Vindicar
    RTFM!
    Составить список популярных пакетных менеджеров и команд их вызова. Разные дистры используют разные менджеры (apt и yum встречаются чаще всего, ЕМНИП).
    Для каждого менеджера попытаться получить список установленных пакетов. Также иметь ввиду, что данного менеджера может и не быть на данной машине.
    Свести результаты в один список.

    Например, для дистров, которые используют apt (Debian и его потомки), это либо apt-mark showmanual, либо apt list --installed | grep -v 'automatic' (чтобы исключить пакеты, которые были поставлены как зависимости для других). Но и там будут пакеты, поставленные при установке ОС.

    Если хочется ну прямо супер детальный анализ... найти все файлы, помеченные как исполняемые. Потом узнать список установленных пакетов. Для каждого пакета узнать список установленных файлов. Исключить эти файлы из числа найденных. То, что останется, было установлено помимо менеджера пакетов и потому заслуживает более пристального внимания. Но сам понимаешь, это долго и жорко, ну и всё равно может не дать 100% покрытия. Грубо говоря, если некий файл script.sh не помечен как исполняемый, его всё равно можно запустить через bash script.sh.

    Я думаю, стоит обращать внимание, если в списке установленных пакетов есть wine, mono или виртуальные машины. В остальном... вряд ли что-то найдётся.
    Ответ написан
    Комментировать
  • Как хранить переменные в кэше, а через 3 часа их сбрасывать и запрашивать новые данные?

    Vindicar
    @Vindicar
    RTFM!
    Храни дату последнего запроса к гисметео. При запросе данных проверяй, устарел ли кэш (сколько времени прошло с последнего запроса). Если устарел - делай новый запрос, помещай ответ в кэш.
    А потом, независимо от условия, отдавай ответ из кэша.
    Ответ написан
    Комментировать
  • Что именно означают эти 2 строчки?

    Vindicar
    @Vindicar
    RTFM!
    Цикл while переносит содержимое связного списка в питоновский list.
    А дальше проверяется, палиндром ли этот list.
    Вот и всё.
    Ответ написан
  • Телеграм бот запоминает первое введенное значение Х. Что не так с кодом?

    Vindicar
    @Vindicar
    RTFM!
    @dp.message_handler()
            async def reply_message_X1(message: types.Message):

    Не надо описывать обработчики событий динамически, внутри других обработчиков. Поведение очень нетривиальное, и затрагивает ВСЕХ пользователей.
    Набор обработчиков должен быть статичен. Вместо этого храни и проверяй, что до этого делал данный пользователь.
    Почитай про finite state machine.
    Ответ написан
    Комментировать
  • Как сделать белый список для тг бота?

    Vindicar
    @Vindicar
    RTFM!
    1. Хранить список допущенных к работе пользователей.
    2. При обработке каждого события определять id пользователя-отправителя и проверять его на вхождение в список.
    3. Добавить команды для управления списком.
    Ответ написан
  • Как сделать автозапуск скрипта при попытке подключения к SSH-серверу?

    Vindicar
    @Vindicar
    RTFM!
    Закинуть его в .bashrc пользователя, под которым подключаешься. Я так сделал кастомный MOTD скрипт, который показывает состояние сервера, когда я подключаюсь.
    Ответ написан
    4 комментария
  • Как перезапустить на Линукс упавшего бота, если он многопоточный?

    Vindicar
    @Vindicar
    RTFM!
    1. Починить бота, чтобы не падал. Лови исключения в обработчиках событий, для начала. А если падает не из-за исключения там (а, например, инет отвалился) - ставь обработку исключений на тело бота и заверни всё в цикл while, например.
    2. Пометить вспомогательный поток как daemon. Скрипт завершается, когда не остаётся активных потоков - при этом daemon-потоки не считаются. Смотри документацию на модуль threading.
    Ответ написан
    5 комментариев
  • Пытаюсь написать выдачу роли при присоединении в дискорд, но выдает ошибку, как решить?

    Vindicar
    @Vindicar
    RTFM!
    Что делать, что делать... голову включить и посмотреть на вызов utils.get().
    Тебя не смущает, что ты передаёшь список ролей в параметр, который называется "id гильдии"?
    Передай коллекцию ролей первым позиционным параметром, без имени. Фильтр id= оставь, с ним всё ок.
    И вообще, не понимаешь как использовать какой-то метод - ищи и читай документацию.
    Ответ написан
    Комментировать
  • Почему код выдает ошибку, хотя файл llvmlite.dl находится в указанном каталоге?

    Vindicar
    @Vindicar
    RTFM!
    Возможно, проблема с разрядностью. Если DLL на 32 бита а питон на 64 (или наоборот), он её не подгрузит. Это верно практически для любой программы.

    EDIT: и да, как ниже написали, та же самая ошибка будет, если не найдена DLL, требуемая этой DLL. Утилита Dependency Walker в помощь. Может, нужен специфичный пакет MS VC++ Redistributable.
    Ответ написан
    2 комментария
  • Проверка четного числа (четное/нечетное)?

    Vindicar
    @Vindicar
    RTFM!
    Если вопрос именно "как работает данная строка", то ответ простой.
    В десятичной системе круглые числа (т.е. кончающиеся нулём) - те, которые делятся на 10.
    В двоичной системе круглые числа - те, которые делятся на 2.
    Значит, если запись числа в двоичной системе заканчивается нулём, оно делится на 2, т.е. оно чётное.

    А если вопрос "стоит ли так делать", то ответ тоже простой.
    Однозначно нет.
    Ответ написан
    Комментировать
  • Не понимаю почему код выводит пустой список?

    Vindicar
    @Vindicar
    RTFM!
    А ты запиши содержимое req в файл, всё сразу понятно станет...

    Ваш браузер не смог пройти проверку. Для доступа к веб-ресурсу включите в настройках вашего веб-браузера поддержку JavaScript или воспользуйтесь другим веб-браузером, который поддерживает JavaScript.


    Популярные сайты парсить - не в носу ковырять, они от этого защищаются.

    EDIT:
    NaoFumi008, а причём тут твой браузер? Твой код сам выполняет запрос, браузер ему не нужен.
    Очень советую почитать про то, как вообще работает Web.
    Кратко

    Клиент (браузер или иная программа) делает HTTP запрос, посылая запрашиваемую часть URL и заголовки (в наиболее простом случае).
    Серверная часть отвечает на запрос тем или иным документом (например, просто текстом) и своими заголовками (что это за документ, его размер, устанавливаемые cookies, и т.д.).
    Клиент принимает документ и обрабатывает его. Так, браузеры находят в документе JS-скрипты и выполняют их.
    Эти скрипты могут выполнять дополнительные запросы, которые обслуживаются по тому же принципу.
    Сервер может сохранять сведения о запросах и сопоставлять их.

    Есть две основных точки проверки клиента: непосредственно заголовки запроса (например, передан ли Referer? Переданы ли соответствующие cookies? Похож ли на правду User-Agent? Переданы ли другие необязательные, но типовые заголовки, вроде Accept-Language?) и обработка скриптов клиентом. Скажем, если клиент сделал запрос на одну страницу, но скрипт на этой странице не сделал второй запрос - возможно, клиент не браузер, а бот. Стоит его запомнить и попытаться пометить.
    В твоём случае, скорее всего, отрабатывает первый сценарий, но ты можешь напороться и на второй тоже.

    Выхода два: либо пытаться методом проб и ошибок выяснить, что проверяет сайт (например, сделать запрос браузером, открыть панель разработчика и скопировать заголовки запроса целиком). Либо использовать "безголовый" браузер и пакет для управления им, вроде selenium. Первый вариант долгий, второй очень жадный на ресурсы. Ни один не даёт гарантии, так как selenium вроде всё же можно обнаружить.
    Ответ написан
    7 комментариев
  • Как сделать асинхронную многопоточность?

    Vindicar
    @Vindicar
    RTFM!
    Причём тут многопоточность вообще? -_-

    Если бот b знает, по какому пути лежит бот a и где в каталоге a лежит БД, он может подключиться, так как БД sqlite это просто файл - но только до тех пор, пока b туда ничего не пишет. И даже тогда есть риск, если a будет обновлять информацию в момент её чтения b. sqlite вообще не предназначена для одновременного доступа.
    Так что когда встаёт вопрос об одновременном доступе к БД, от sqlite лучше уходить в сторону полноценных серверных СУБД.

    Либо научи бота a отдавать требуемую информацию по запросу, скажем, через сокет. Если он написан на базе asyncio (или фреймворка который его использует), то это не так уж сложно. Тогда с БД будет работать только a, а b должен только знать, как подключиться к a.
    Ответ написан
    1 комментарий
  • Как задать значение по умолчанию для всех созданных combobox в Tkinter?

    Vindicar
    @Vindicar
    RTFM!
    По итогам ряда экспериментов у меня получилось следующее...

    Когда ты ставишь ссылку на переменную Tk (например, экземпляр StringVar) для элемента управления, элемент запоминает внутреннее имя этой переменной (если ты его не задал явно, оно будет иметь вид PY_VAR*), а не хранит ссылку на сам экземпляр класса StringVar. Поэтому переменная умирает, когда значение питоновской переменной value перезаписывается на следующей итерации, что ломает логику работы.
    Ты должен сам хранить ссылки на все StringVar на всё время жизни твоего окна. Например, так:
    variables = {}
    
    def s():
        unique_types = ['1', '2', '3', '4', '5']
        entry = {}
        label = {}
        combo_list = []
        types = ['Соответсвия нет', 'A', 'B', 'C']
    
        for row, name in enumerate(unique_types, 0):
            value = StringVar()
            variables[name] = value
            lb = ttk.Label(root, text=name)
            lb.grid(row=row, column=0)
            label[name] = lb
    
            combobox = ttk.Combobox(root, textvariable=value, values=types, width=90, state="readonly")
            combobox.current(0)
            combobox.grid(row=row, column=2, padx=10, pady=5)
            combo_list.append(combobox)
            entry[name] = combobox
    
        b = ttk.Button(root, text="Print all", command=lambda: print_all_entries(unique_types, entry, label))
        b.grid(row=row + 1, column=2, padx=10, pady=5)


    Одна из причин, почему я обычно советую описывать окно как класс-наследник tkinter.Frame. В конструкторе создаёшь переменные, сохраняешь в поля класса, и они лежат себе. Когда экземпляр класса умрёт, они тоже уничтожатся.
    А потом этот экземпляр пакуешь уже в окно верхнего уровня.
    Ответ написан
  • Как из Python отдать команды в PowerShell от имени администратора?

    Vindicar
    @Vindicar
    RTFM!
    Нужно, чтобы твой скрипт был запущен от имени администратора.
    Можно использовать команду runas, но она потребует пароль.
    Ответ написан
    Комментировать
  • Как направить вывод ошибок из консоли в файл?

    Vindicar
    @Vindicar
    RTFM!
    Посмотри в сторону модуля atexit. Если падение прогарммы вызвано питоновским исключением, а не чем-то низкоуровневым, то это позволит сделать flush при выходе из программы.
    Ответ написан
  • Где ошибки в коде Python?

    Vindicar
    @Vindicar
    RTFM!
    print = (........)
    Читай, как правильно вызывать функции. Ты создаёшь переменную print, вместо того, чтобы вызвать функцию print().
    Ответ написан
    Комментировать
  • Почему после "apt-get upgrade -y" некоторые пакеты не обновляются?

    Vindicar
    @Vindicar
    RTFM!
    Проверь через apt-mark showhold, может, эти пакеты поставлены на удержание (hold)?
    Если так, на это наверняка есть причина.
    Ответ написан
    1 комментарий