• Телеграм бот запоминает первое введенное значение Х. Что не так с кодом?

    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 комментарий
  • Как вывести данные из бесконечного subprocess в python?

    Vindicar
    @Vindicar
    RTFM!
    output = proc.stdout.read()
    У read() есть параметр, сколько максимум данных принимать. Просто принимай данные в буфер по 1 КБ (или сколько удобно), режь на строки по разделителю (\n), обрабатывай принятые полные строки, но последнюю неполную строку сохраняй и добавляй в начало следующей порции.
    Ответ написан
    1 комментарий
  • Как получить информацию о сервере на python asyncssh?

    Vindicar
    @Vindicar
    RTFM!
    Библиотека тут ни причём, это вообще не её задача. Тебе нужно научиться выполнять команды, получать их выхлоп и парсить его.
    Если сервер на linux дистре, то uname -a, чтобы понять, на каком (для разных дистров команды могут чуть отличаться).
    Всё остальное - либо ищи псевдофайлы в /proc, либо используй соотв. утилиты, которые должны быть на сервере. Например, hwinfo.

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

    Vindicar
    @Vindicar
    RTFM!
    sqlite3 требует доступ к файлу именно как к файлу. Так что тебе придётся подмонтировать каталог с базой к целевой машине, тем или иным способом. Под виндой скорее всего только webdav, под никсами вариантов больше.
    Ну и да, sqlite НЕ рассчитана на одновременный доступ, так что если с этой базой кто-то одновременно работает на сервере и на целевой машине, есть шансы что она поломается.
    Так что от "никакая другая" лучше отказаться при первой возможности.

    А для отладочных целей лучше скопировать базу и гонять скрипт на копии, чтобы не угробить "боевую".
    Ответ написан
    Комментировать
  • Получение доступа к регистру rip x86-64 архитектура?

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

    Vindicar
    @Vindicar
    RTFM!
    loop() запускается циклически, снова и снова.
    r - глобальная переменная, которая сохраняет значение между вызовами loop().
    Так что, как только ты задал r правильное значение - при последующих вызовах if (r.value == ...) будет отрабатывать каждый раз, пока значение r не сменится.
    Ответ написан
    Комментировать