Задать вопрос
  • Как связать html-код c python при помощи Flask?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Закрыть блок for в jinja: {% endfor %}.
    Ответ написан
    3 комментария
  • Поиск по образцу. Как сделать быстрый поиск вхождения картинок-символов на большом чертеже?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    import cv2
    import numpy as np
    
    # Загрузка изображений:
    dr_image = cv2.imread('original.png')
    
    # Преобразуем в серое:
    gray = cv2.cvtColor(dr_image, cv2.COLOR_BGR2GRAY)
    
    # Бинаризация: черные линии → белые (на чёрном фоне).
    _, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
    
    # Шаблоны:
    template1 = cv2.imread('temp2.png', cv2.IMREAD_GRAYSCALE)  # ёлочка
    template2 = cv2.imread('temp1.png', cv2.IMREAD_GRAYSCALE)  # круг
    
    _, template1 = cv2.threshold(template1, 127, 255, cv2.THRESH_BINARY_INV)
    _, template2 = cv2.threshold(template2, 127, 255, cv2.THRESH_BINARY_INV)
    
    # Параметры:
    threshold1 = 0.7  # для ёлочки
    threshold2 = 0.5  # для круга
    
    # Поиск "ёлочки":
    result1 = cv2.matchTemplate(binary, template1, cv2.TM_CCOEFF_NORMED)
    loc1 = np.where(result1 >= threshold1)
    
    # Поиск "круга":
    result2 = cv2.matchTemplate(binary, template2, cv2.TM_CCOEFF_NORMED)
    loc2 = np.where(result2 >= threshold2)
    
    # Результат:
    result = dr_image.copy()
    detected_boxes = []
    
    # Обработка "ёлочки":
    for pt in zip(*loc1[::-1]):
        x, y = pt
        w, h = template1.shape[1], template1.shape[0]
        box = (x, y, x + w, y + h)
    
        if not any(np.allclose(box, b, atol=10) for b in detected_boxes):
            detected_boxes.append(box)
            cv2.rectangle(result, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
            cv2.putText(result, "Tree", (pt[0], pt[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
    
    # Обработка "круга":
    for pt in zip(*loc2[::-1]):
        x, y = pt
        w, h = template2.shape[1], template2.shape[0]
        box = (x, y, x + w, y + h)
    
        if not any(np.allclose(box, b, atol=10) for b in detected_boxes):
            detected_boxes.append(box)
            cv2.rectangle(result, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 2)
            cv2.putText(result, "Circle", (pt[0], pt[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
    
    # Сохраняем результат:
    cv2.imwrite('result_with_labels.png', result)
    print(f"Найдено объектов: {len(detected_boxes)}")
    
    # Показываем:
    cv2.imshow('Detected', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    >>> Найдено объектов: 12

    68cd5e8cccadf938039122.png
    Ответ написан
    3 комментария
  • Как запустить команды в Putty после подключения?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Connection -> SSH -> Remote comand -> Ваши команды.
    Ответ написан
    Комментировать
  • Как правильно встроить FSM в телеграм бот на библиотеке telebot?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    1. storage - объявили, но не используете, надо:
    bot = telebot.TeleBot('TOKEN', state_storage=storage)

    2. Состояние не меняете.
    3. В интернете логичнее всего смотреть примеры в репе создателей: custom_states.
    4. Код:
    import telebot
    from telebot import types
    from telebot.states import State, StatesGroup
    from telebot.states.sync.context import StateContext
    from telebot.states.sync.middleware import StateMiddleware
    from telebot.storage import StateMemoryStorage
    from telebot.types import ReplyParameters
    
    
    storage = StateMemoryStorage()
    bot = telebot.TeleBot('TOKEN', state_storage=storage, use_class_middlewares=True)
    
    class MyStates(StatesGroup):
        START = State()
        US = State()
        SUP = State()
    
    
    @bot.message_handler(commands=["start"])
    def start(message: types.Message, state: StateContext):
        state.set(MyStates.START)
        bot.send_message(
            message.chat.id,
            f'Привет, {message.from_user.first_name}!\n/sup - оформить подписку\n/us - информация о нас',
            reply_parameters=ReplyParameters(message_id=message.message_id),
        )
    
    @bot.message_handler(commands=["us"])
    def us(message: types.Message, state: StateContext):
        state.set(MyStates.US)
        bot.send_message(
            message.chat.id,
            'Информация о нас',
            reply_parameters=ReplyParameters(message_id=message.message_id),
        )
    
    @bot.message_handler(commands=["sup"])
    def sup(message: types.Message, state: StateContext):
        state.set(MyStates.SUP)
        bot.send_message(
            message.chat.id,
            'Оформить подписку',
            reply_parameters=ReplyParameters(message_id=message.message_id),
        )
    
    
    if __name__ == '__main__':
        print('start')
        bot.setup_middleware(StateMiddleware(bot))
        bot.infinity_polling()
    Ответ написан
    Комментировать
  • Где посмотреть примеры оформления кода для экономического анализа данных?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Для ML смотрите на kaggle.
    Ответ написан
    Комментировать
  • Сайт-локеры. Вирус adware от Yandex - возможно ли избавиться?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Vivaldi + uBlock Origin = никакой рекламы на Шедевруме (как и никакого смысла им пользоваться).
    Ответ написан
    Комментировать
  • Как получить из URL имя страницы?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Если исходить из условия, то вам достаточно:
    url = 'test.com/dir1/dir2/dir3/page.html'
    page_name = url.split('/')[-1]
    print(page_name)
    >>>page.html

    И зачем нужен остальной код непонятно.
    Ответ написан
    2 комментария
  • Возможность использования анонимного адреса @MAIL.RU для скрипта рассылки?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    import smtplib
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    
    
    def send_email_mail_ru():
        smtp_server = "smtp.mail.ru"
        smtp_port = 587  # или 465 для SSL.
        username = "*****@mail.ru" # Анонимный ящик.
        password = "****************"  # Пароль от приложения.
    
        # Создаем сообщение:
        msg = MIMEMultipart()
        msg['From'] = username
        msg['To'] = "************@mail.ru"
        msg['Subject'] = "Тестовое письмо с Mail.ru"
    
        # Текст письма:
        body = """тест"""
        msg.attach(MIMEText(body, 'plain', 'utf-8'))
    
        try:
            # Подключаемся к серверу:
            server = smtplib.SMTP(smtp_server, smtp_port)
            server.starttls()
            server.login(username, password)
    
            # Отправляем письмо:
            server.sendmail(username, "*********@yahoo.com", msg.as_string())
            print("Письмо успешно отправлено через Mail.ru!")
    
        except Exception as e:
            print(f"Ошибка при отправке: {e}")
        finally:
            server.quit()
    
    send_email_mail_ru()
    Ответ написан
    8 комментариев
  • Как правильно сформировать запрос Python requests?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Скорее всего requests детектят по фингерпринту. pyOpenSSL + cryptography меняют TLS-стек:
    pip install pyOpenSSL cryptography idna certifi urllib3[secure] requests[security]


    import urllib3.contrib.pyopenssl  # активирует pyOpenSSL для urllib3
    urllib3.contrib.pyopenssl.inject_into_urllib3()
    
    import requests
    
    url = "https://www.wildberries.ru/webapi/product/339182812/data?subject=104&kind=1&brand=311487279&lang=ru"
    
    headers = {
        "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36",
        "Accept": "*/*",
        "Referer": "https://www.wildberries.ru/catalog/339182812/detail.aspx",
        "X-Requested-With": "XMLHttpRequest",
    }
    
    response = requests.get(url, headers=headers)
    print(response.status_code)
    print(response.text)


    >>>200
    >>>{"resultState":0,"value":{"data":{"brandAndSubjectUrl":"/brands/311...


    З.Ы. можно вообще без headers, потому что дело не в них.
    Ответ написан
    1 комментарий
  • Как создать параметризированный SQL запрос через pyodbc к Mysql?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Убрать кавычки вокруг имён столбцов.
    Ответ написан
    2 комментария
  • Не работает код, что делать?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Unandoriz,
    1. В секции инициализации перенести self.load_config() в самый конец:
    def __init__(self, window_title=None):
            ...
            self.load_config()

    2. Создать экземпляр, запустить главный цикл:
    # Ваш код
    if __name__ == "__main__":
        app = AutoKeylogger(window_title="Notepad++")  # Укажите нужное название окна.
        app.root.mainloop()


    З.Ы. Это если вам интересно запустить просто. Работать как вы хотите оно не будет, имхо.
    Ответ написан
    Комментировать
  • Как управлять циклом for?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    import tkinter as tk
    
    
    def generator_sequence(data):
        for i in data:
            yield i
    
    
    def next_step():
        global paused, sequence, after_id
    
        if not paused:
            try:
                value = next(sequence)
                label.config(text=f"Текущее: {value}")
                after_id = root.after(1000, next_step)  # Планируем следующий шаг.
            except StopIteration:
                label.config(text="Завершено!")
                button.config(state=tk.DISABLED)
    
    
    def toggle_pause():
        global paused, after_id
    
        paused = not paused
        button.config(text="Продолжить" if paused else "Пауза")
    
        if not paused:  # Если сняли паузу.
            if after_id:
                root.after_cancel(after_id)  # Отменяем предыдущий запланированный вызов.
            next_step()
    
    
    # Инициализация
    root = tk.Tk()
    after_id = None
    paused = True  # Начинаем в состоянии паузы.
    data = ["A", "B", "C", "D", "E"]
    sequence = generator_sequence(data)
    
    label = tk.Label(root, text="Нажмите 'Старт'")
    label.pack(pady=10)
    
    button = tk.Button(root, text="Старт", command=toggle_pause)
    button.pack()
    
    root.mainloop()


    Если никакой дополнительной логики не нужно и последовательность уже существует, то можно без generator_sequence просто: sequence = iter(data) .
    Ответ написан
    6 комментариев
  • Почему у меня программа вообще не реагирует на свойства в python?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Разве IDE не подчёркивает вам проблемные места?

    Вы не вызываете конструктор родительского класса:
    class Villains(Heroes):
        def __init__(self):
            super().__init__()


    И не очень понятно когда проблема проявляется, при инициализации переменных? Но вы не проверяете никак __hp и __damage. А там, где есть логика проверки, надо понимать что __damage != new_damage и __hp != new_hp.

    После инициализации всё корректно, имхо, работает:
    688e808ad1739508277546.png
    Ответ написан
  • Почему не удаётся создать декоратор метода в typescript?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    В tsconfig.json включить опцию experimentalDecorators.
    Ответ написан
  • Как распарсить смешанный тип json-данных?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Не очень понятен вопрос.

    Если точно известно что там всё есть, то обращаться напрямую:
    parsed_data = json.loads(json_data)
    ip_address = parsed_data["data"]["ipAddress"]


    Если могут быть сюрпризы, то:
    ip_address = parsed_data.get("data", {}).get("ipAddress", "N/A")

    import json
    
    json_data = '''
    {
      "data": {
        "ipAddress": "192.168.1.1",
        "abuseConfidenceScore": 85
      }
    }
    '''
    parsed_data = json.loads(json_data)
    try:
        ip_address = parsed_data.get("data", {}).get("ipAddress", "N/A")
        score = parsed_data.get("data", {}).get("abuseConfidenceScore", 0)
        print(f"IP: {ip_address}, Score: {score}")
    except Exception as e:
        print(f"Ошибка: {e}")
    Ответ написан
    Комментировать
  • Почему не получается создать профиль в программе Dolphin{anty}?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    У меня так сработало:
    import requests
    
    token = '...'
    headers = {
        "Authorization": f"Bearer {token}",
        'Content-Type': 'application/x-www-form-urlencoded'
    }
    
    # Обязательные параметры (заполните своими значениями):
    name = "lol"  # Обязательное поле
    platform = "windows"  # Обязательное поле (например: "windows", "mac", "linux")
    browser_type = "anty"  # Обязательное поле (например: "chrome", "firefox", "anty")
    proxy_type = "http"
    proxy_host = "None" # Тут тоже что-то своё надо, видимо, вставлять.
    useragent_mode = "manual"
    useragent_value = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
    
    # Остальные параметры (можно оставить пустыми или заполнить по необходимости):
    tags = []
    tabs = ""
    main_website = ""
    webrtc_mode = ""
    webrtc_ip_address = ""
    canvas_mode = ""
    webgl_mode = ""
    webgl_info_mode = ""
    webgl_info_vendor = ""
    webgl_info_renderer = ""
    # Заменить webgl2Maximum на ваше. Это всего лишь пример:
    webgl_info_webgl2_maximum = r'{\"MAX_SAMPLES\": 8, \"MAX_DRAW_BUFFERS\": 8, \"MAX_TEXTURE_SIZE\": 16384, \"MAX_ELEMENT_INDEX\": 4294967294, \"MAX_VIEWPORT_DIMS\": [16384, 16384], \"MAX_VERTEX_ATTRIBS\": 16, \"MAX_3D_TEXTURE_SIZE\": 2048, \"MAX_VARYING_VECTORS\": 30, \"MAX_ELEMENTS_INDICES\": 2147483647, \"MAX_TEXTURE_LOD_BIAS\": 15, \"MAX_COLOR_ATTACHMENTS\": 8, \"MAX_ELEMENTS_VERTICES\": 2147483647, \"MAX_RENDERBUFFER_SIZE\": 16384, \"MAX_UNIFORM_BLOCK_SIZE\": 65536, \"MAX_VARYING_COMPONENTS\": 120, \"MAX_TEXTURE_IMAGE_UNITS\": 32, \"MAX_ARRAY_TEXTURE_LAYERS\": 2048, \"MAX_PROGRAM_TEXEL_OFFSET\": 7, \"MIN_PROGRAM_TEXEL_OFFSET\": -8, \"MAX_CUBE_MAP_TEXTURE_SIZE\": 16384, \"MAX_VERTEX_UNIFORM_BLOCKS\": 13, \"MAX_VERTEX_UNIFORM_VECTORS\": 4096, \"MAX_COMBINED_UNIFORM_BLOCKS\": 60, \"MAX_FRAGMENT_UNIFORM_BLOCKS\": 13, \"MAX_UNIFORM_BUFFER_BINDINGS\": 72, \"MAX_FRAGMENT_UNIFORM_VECTORS\": 4096, \"MAX_VERTEX_OUTPUT_COMPONENTS\": 124, \"MAX_FRAGMENT_INPUT_COMPONENTS\": 124, \"MAX_VERTEX_UNIFORM_COMPONENTS\": 16384, \"MAX_VERTEX_TEXTURE_IMAGE_UNITS\": 32, \"MAX_FRAGMENT_UNIFORM_COMPONENTS\": 16384, \"UNIFORM_BUFFER_OFFSET_ALIGNMENT\": 256, \"MAX_COMBINED_TEXTURE_IMAGE_UNITS\": 64, \"MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS\": 229376, \"MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS\": 4, \"MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS\": 229376, \"MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS\": 4, \"MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS\": 128}'
    notes_icon = ""
    notes_color = ""
    notes_style = ""
    notes_content = ""
    timezone_mode = ""
    timezone_value = ""
    locale_mode = ""
    locale_value = ""
    status_id = ""
    geolocation_mode = ""
    geolocation_latitude = ""
    geolocation_longitude = ""
    cpu_mode = ""
    cpu_value = ""
    memory_mode = ""
    memory_value = ""
    do_not_track = ""
    proxy_id = ""
    
    proxy_port = ""
    proxy_login = ""
    proxy_password = ""
    proxy_name = ""
    proxy_change_ip_url = ""
    
    # F-строка
    payload = f'name={name}&tags%5B%5D={tags}&tabs={tabs}&platform={platform}&mainWebsite={main_website}&useragent%5Bmode%5D={useragent_mode}&useragent%5Bvalue%5D={useragent_value}&webrtc%5Bmode%5D={webrtc_mode}&webrtc%5BipAddress%5D={webrtc_ip_address}&canvas%5Bmode%5D={canvas_mode}&webgl%5Bmode%5D={webgl_mode}&webglInfo%5Bmode%5D={webgl_info_mode}&webglInfo%5Bvendor%5D={webgl_info_vendor}&webglInfo%5Brenderer%5D={webgl_info_renderer}&webglInfo%5Bwebgl2Maximum%5D={webgl_info_webgl2_maximum}&webrtc%3A%20%7Bmode%3A%20%22altered%22%2C%20ipAddress%3A%20null%7D&notes%5Bicon%5D={notes_icon}&notes%5Bcolor%5D={notes_color}&notes%5Bstyle%5D={notes_style}&notes%5Bcontent%5D={notes_content}&timezone%5Bmode%5D={timezone_mode}&timezone%5Bvalue%5D={timezone_value}&locale%5Bmode%5D={locale_mode}&locale%5Bvalue%5D={locale_value}&statusId={status_id}&geolocation%5Bmode%5D={geolocation_mode}&geolocation%5Blatitude%5D={geolocation_latitude}&geolocation%5Blongitude%5D={geolocation_longitude}&cpu%5Bmode%5D={cpu_mode}&cpu%5Bvalue%5D={cpu_value}&memory%5Bmode%5D={memory_mode}&memory%5Bvalue%5D={memory_value}&doNotTrack={do_not_track}&browserType={browser_type}&proxy%5Bid%5D={proxy_id}&proxy%5Btype%5D={proxy_type}&proxy%5Bhost%5D={proxy_host}&proxy%5Bport%5D={proxy_port}&proxy%5Blogin%5D={proxy_login}&proxy%5Bpassword%5D={proxy_password}&proxy%5Bname%5D={proxy_name}&proxy%5BchangeIpUrl%5D={proxy_change_ip_url}'
    
    url = "https://dolphin-anty-api.com/browser_profiles"
    response = requests.request("POST", url, headers=headers, data=payload)
    print(response.json())

    68821a5c5cb3a524599248.png

    В сам Dolphin{anty} профиль тоже подсосался после рефреша:
    68821b2fe0493862243582.png
    Ответ написан
    Комментировать
  • Как накапливать сумму в одной ячейке, за счет изменения значений в соседней?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    function onEdit(e) {
      const sheet = e.source.getActiveSheet();
      const range = e.range;
      
      // Проверяем, что изменение произошло в ячейке A1 нужного листа.
      if (range.getA1Notation() === "A1"&& sheet.getName() === "Лист1") {
        const newValue = range.getValue();
        const b1Cell = sheet.getRange("B1");
        const currentSum = b1Cell.getValue() || 0;
        
      if (!isNaN(newValue)) {
          b1Cell.setValue(currentSum + newValue);
        }
      }
    }
    Ответ написан
  • Парсинг на Python при помощи tor?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    зачем нужно прописывать мосты

    Как будто бы это гуглится:
    В некоторых странах доступ к сети Tor может быть заблокирован. Мосты, не являющиеся частью публичного списка узлов, позволяют обойти эти блокировки, так как их сложнее обнаружить и заблокировать.


    Работает, почему бы не работать. Но, имхо, такой себе способ: скорость непредсказуемая, коннект сейчас есть, а через минуту нет, крупные выходные ноды могут быть блокированы ресурсами, которые вы парсите. Одним словом: зачем?
    Ответ написан
    Комментировать
  • Как в Firefox открыть URL в активной вкладке?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    AutoHotKey, вам, вроде бы, предлагали в прошлую итерацию вопроса.
    start_in_firefox.ahk
    #Requires AutoHotkey v2.0
    SendMode "Input"
    SetWorkingDir A_ScriptDir
    
    ; Проверяем, передан ли URL
    if !A_Args.Length {
        MsgBox "Ошибка: Не указан URL. Используйте: `n`nOpenInFirefox.ahk `"https://example.com`""
        ExitApp 1
    }
    
    URL := A_Args[1]
    
    ; Проверяем, запущен ли Firefox
    if ProcessExist("firefox.exe") {
        try {
            ; Активируем окно Firefox и вставляем URL в текущую вкладку
            WinActivate "ahk_exe firefox.exe"
            Sleep 200
            Send "^l"          ; Ctrl+L (фокус на адресную строку)
            Sleep 100
            SendInput URL "{Enter}"
        } catch as e {
            ; Если не удалось активировать окно, открываем URL в новом окне
            Run 'firefox.exe "' URL '"'
        }
    } else {
        ; Если Firefox не запущен, открываем URL в новом окне
        Run 'firefox.exe "' URL '"'
    }

    Запуск через AHK непосредственно:
    "C:\path\to\AutoHotkeyUX.exe" "C:\path\to\open_in_firefox.ahk" "https:\\habr.com"


    start_in_firefox.bat
    @echo off
    "C:\path\to\AutoHotkeyUX.exe" "C:\path\to\open_in_firefox.ahk" %1

    Запуск через bat:
    C:\path\to\start_in_firefox.bat "https://ya.ru"
    Ответ написан
  • Как поменять шрифт в cmd на nerd font?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Ставить те, которые поддерживают cmd.
    Например CaskaydiaCove Nerd Font или FiraCode Nerd Font.
    686bda5a0d062092771824.png
    Ответ написан