• Как определить размер и координаты любого окна python?

    Vindicar
    @Vindicar
    RTFM!
    Ответ для винды - с линуксовыми оконными менеджерами я дела не имел.
    Можно посмотреть на видимый заголовок окна или на т.н. строку класса окна. Возможно, pyautogui или pywinauto могут найти окна по заголовку.
    Более сложные и надёжные решения требуют работы с WinAPI: в принципе можно найти окна, принадлежащие процессу с заданным экзешником, уточнить через заголовок/класс окна, а дальше получить их позицию.
    Проблема в том, что до WinAPI надо достукиваться через модуль ctypes, а значит, нужно уметь не только Питон, но и хотя бы основы C или C++. Я могу описать этот вариант подробнее, если захочешь связываться с этой канителью.
    Ответ написан
    Комментировать
  • Почему ответ из request, появляется только после того как зашёл сайт, с которого и пытаемся получить ответ через запрос, а так он пуст?

    Vindicar
    @Vindicar
    RTFM!
    Потому что сайт трекает кто заходит? "Ага, это вроде действительно браузер... считаем этот IP человеком на ближайшие N минут."
    Ответ написан
  • Как рисовать поверх фото в tkinter?

    Vindicar
    @Vindicar
    RTFM!
    Вместо того, чтобы изобретать велосипед, используй элемент Canvas. Он и рисовать позволяет, и изображение вставить.
    Ответ написан
    Комментировать
  • Есть ли в Python библиотека для работы с экзотическими видами прокси?

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

    Vindicar
    @Vindicar
    RTFM!
    Правильно будет:
    import sqlite3 
    
    with sqlite3.connect(r'D:\Programming\Python\base.db') as db:
        cursor = db.cursor()
        request = """ SELECT name FROM marks WHERE mark = 4 """  # выбираем один столбец
        cursor.execute(request)  # выполняем запрос на курсоре - зря, что ли, мы его создали?
        # теперь у нас курсор содержит строки выдачи - ответ на запрос
        for row in cursor:  # row - это кортеж, где элементы идут в том же порядке, что и столбцы
            name = row[0]  # у нас один элемент - столбец name. Добываем его.
            print(name)  # а дальше делаем с этим элементом что захотим
    Ответ написан
    Комментировать
  • Как сделать очередь из нескольких таймеров, каждый из которых должен исполнять свой собственный файл на Python?

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

    Если ОЧЕНЬ надо - делаешь свой планировщик на базе пакета schedule, только не забудь запустить скрипты в дочернем процессе, например, через subprocess. Но я бы не изобретал велосипед.
    Ответ написан
    1 комментарий
  • Как проверить если сообщение содержит фразу в vk_api python?

    Vindicar
    @Vindicar
    RTFM!
    Оператор in в помощь, но он учитывает регистр.
    print('Hello' in 'Hello world!')  # True
    print('hello' in 'Hello world!')  # False
    Ответ написан
    Комментировать
  • Yargy-парсер | Как задать интерпретацию рекурсивного правила вывода для извлечения неизвестного числа терминалов в качестве repeatable-атрибута факта?

    Vindicar
    @Vindicar
    RTFM!
    Как я подозреваю, проблема в том, что во всех твоих попытках при повторе SECTION повторяется и правило для заголовка секции - тогда как нужно повторять только правила для тела секции.
    Т.е. я бы сделал что-то типа такого...
    SECTION_CONTENT = forward().interpretation(Node.successors)
    SECTION_NAME = ...
    FEATURE = ...
    SECTION_CONTENT = or_(
        rule(FEATURE, SECTION_CONTENT),
        FEATURE
    )
    SECTION = rule(SECTION_NAME, SECTION_CONTENT)
    Ответ написан
  • Почему не работает публичная сеть на uvicorn?

    Vindicar
    @Vindicar
    RTFM!
    Есть ли роутер? Если да, надо пробросить порт на нём.
    Ответ написан
    1 комментарий
  • Как сделать после ввода сообщения выполнение функции в aiogram?

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

    Vindicar
    @Vindicar
    RTFM!
    Зачем ты складываешь строки в список? Почему не писать их сразу в выходной файл?
    with open("sus.txt", "r", encoding='utf-8') as source:
        idx = 1  # номер файла-приёмника
        go = True
        while go:
            with open(f'part{idx}.txt', 'w', encoding='utf-8') as dest:
                for _ in range(500):  # не более 500 строк в каждый файл
                    line = source.readline()
                    if not line:  # пустая строка = конец файла
                        go = False
                        break
                    dest.write(line)
            idx += 1
    Ответ написан
    Комментировать
  • Как бот может переслать все сообщения с канала, в личный чат пользователя?

    Vindicar
    @Vindicar
    RTFM!
    Смотря что ты понимаешь под пересылкой. Если только контент, то это тривиально.
    Бот должен знать твой id, тогда он сможет отправить тебе сообщение.
    Если бот в канале, он может реагировать на сообщения там, извлекать их контент, и формировать на этой основе своё сообщение для тебя. Заморочка будет только в том, чтобы учесть реакции на все виды контента (фото, файл, аудио и т.п.).
    Ответ написан
  • Как получить user.id боту aiogram 2.23.1 через ответ на сообщение?

    Vindicar
    @Vindicar
    RTFM!
    Из постановки задачи: тебе надо работать с сообщением, так?
    Открываешь документацию и ищешь класс, описывающий сообщение. Подсказка: обычно такой класс называется Message.
    Внимательно просматриваешь его свойства и методы, ищешь всё, что касается ответов (ключевые слова: reply, response и т.п.).
    Находишь свойство reply_to_message. Читаешь:
    reply_to_message: Message | None
    Optional. For replies in the same chat and message thread, the original message. Note that the Message object in this field will not contain further reply_to_message fields even if it itself is a reply.

    Тип данных (Message | None) и подсказка Optional говорят о том, что в этом поле может лежать либо None (очевидно, если сообщение не является ответом), либо ещё один объект Message (тогда это сообщение, на который был ответ).
    Теперь как разобраться с автором сообщения. Аналогично ищем свойства и методы класса Message по ключевым словам user, author и т.п. Находим свойство from_user.
    from_user: User | None
    Optional. Sender of the message; empty for messages sent to channels. For backward compatibility, the field contains a fake sender user in non-channel chats, if the message was sent on behalf of a chat.

    Достаточно, чтобы понять, что в этом свойстве должен лежать объект, описывающий автора сообщения.

    Теперь осталось собрать вместе логику работы бота:
    1. Бот получает уведомление о сообщении
    2. Бот проверяет, было ли сообщение отправлено в тот чат, где он должен работать (свойство chat)
    3. Бот проверяет, отправлено ли сообщение тобой (свойство from_user)
    4. Бот проверяет, является ли сообщение ответом (свойство reply_to_message)
    5. Бот получает оригинальное сообщение и извлекает его отправителя
    6. Бот банит этого отправителя

    Как забанить пользователя - упражнение для читателя.
    Учись искать и разбираться в документации, без этого навыка никуда.
    Ответ написан
    4 комментария
  • Как создать многопоточную программу обращающиеся к API?

    Vindicar
    @Vindicar
    RTFM!
    Причём тут конкретно многопоточность?
    Если дело в том, что в нескольких потоках трудно координировать обращения к API, то как выше правильно сказали - делайте очередь запросов (например, queue.SimpleQueue) и отдельный поток, который будет эти запросы выполнять с учётом лимитов.

    Например, так: поток-клиент кладёт в очередь словарь вида
    task = {'ready': threading.Event(), 'params': {...тут параметры запроса...} }
    , а потом делает
    task['ready'].wait()
    if 'error' in task:
        ... # реагируем на ошибку
    else:
        ...  # читаем результат из task['result']

    Тогда рабочий поток, реализующий обращения, будет принимать очередное задание из очереди, делать запрос к API согласно содержимому params, потом записывать результат в task['result'] или ошибку в task['error'] и делать task['ready'].set(), чтобы уведомить клиента о том, что его задание завершено.
    Ответ написан
    5 комментариев
  • Как преобразовать эмбеддинг текста в понятный сверточным слоям?

    Vindicar
    @Vindicar
    RTFM!
    Свёрточные слои работают только с изображениями (ну или с картами особенностей, что частный случай изборажений). Они ищут локальные взаимосвязи между соседними элементами изображения.

    Эмбеддинг изображением не является, в нём нет локальных вазимосвязей между элементами - он имеет смысл только при рассмотрении всех элементов эмбеддинга.

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

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

    Vindicar
    @Vindicar
    RTFM!
    Простой способ: настрой фаервол, чтобы молча дропал все пакеты, отправляемые на эту пару адрес-порт.
    Если прога использует HTTP, она отправит SYN-пакет для установки TCP-соединения и будет ждать ответа SYN-ACK, но не дождётся - и почти наверняка соединение отвалится по таймауту. Дольше чем этот таймаут ты соединение не подвесишь.
    Правила фаервола найти в Панель управления - Брандмауэр - Дополнительные параметры - Правила для исходящего подключения, и дальше можно будет создать правило в деталях. Если я правлиьно понимаю, виндовый фаервол как раз и дропает пакеты для запрещённых соединений, а не посылает им явный RST (отказ).
    Ответ написан
  • Как правильно обработать exception PasswordHashInvalidError?

    Vindicar
    @Vindicar
    RTFM!
    Огранизовать цикл while True, при вводе правильного пароля (т.е. если не было исключения) делать break.
    while True:
        try:
            attempt_stuff_and_things()
        except SomeException as err:
            react_to_error(err)
        else:  # исключения не было
            break
    Ответ написан
    Комментировать
  • Как в python запустить скрипт из venv?

    Vindicar
    @Vindicar
    RTFM!
    activate нужен, чтобы задать алиас для питона и других утилит из текущего окружения, и ещё парочку переменных среды. Каких - можешь увидеть, открыв скрипт activate.
    Если твой скрипт их не использует, то разницы никакой - можешь просто вызывать питон из .venv/bin/python3 и отдавать ему свой скрипт, и всё будет ок.
    Ответ написан