Задать вопрос
  • Pycharm для старенького мака??

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    izma, здесь, как я понимаю, список профессиональных: https://www.jetbrains.com/pycharm/download/other.html

    Конструируете под свои нужды ссылку:
    https://download.jetbrains.com/python/pycharm-<EDITION>-<VERSION>.<ext>

    Например: https://download-cdn.jetbrains.com/python/pycharm-...
    Ответ написан
    2 комментария
  • Баг с окнами windows server 2019. Правая часть окна всегда за пределами экрана. Кто сталкивался?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Эта проблема всегда существовала. "Запредельные" окна, которые не удаётся схватить, перемещаются клавиатурой по Alt + Пробел -> Переместить -> Стрелки.
    Перемещённое на нужное место окно при повторном открытии, как правило, открывается уже нормально.
    Ответ написан
    2 комментария
  • Как парсить фотографии gspread?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Вытаскивать с google drive как xlsx и потрошить содержимое. Обратить внимание на порядок картинок, если их вытаскивать просто механически, то порядок может не соответствовать ожидаемому (если таблица заполнялась не строго последовательно / картинки менялись местами / строки менялись местами).
    import xml.etree.ElementTree as ET
    import zipfile
    
    from google.oauth2.service_account import Credentials
    from googleapiclient.discovery import build
    import pandas as pd
    
    # Настройки:
    CREDENTIALS_FILE = 'GoogleSheetsCredentional.json'
    FILE_ID = '18c2nnuVKZ-ndfklC6x9Sv9e84PFKc'  # из URL таблицы
    SCHEMA = './/{http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing}'
    
    # Аутентификация и скачивание:
    creds = Credentials.from_service_account_file(CREDENTIALS_FILE, scopes=['https://www.googleapis.com/auth/drive'])
    
    drive_service = build('drive', 'v3', credentials=creds)
    
    # Скачиваем как Excel:
    content = drive_service.files().export_media(
        mimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', fileId=FILE_ID).execute()
    
    # Сохраняем временный файл:
    with open('temp.xlsx', 'wb') as f:
        f.write(content)
    
    # Извлекаем данные и картинки:
    df = pd.read_excel('temp.xlsx')
    
    with zipfile.ZipFile('temp.xlsx', 'r') as z:
        # Парсим drawing.xml - потому что порядок картинок может быть не тот что ожидается...
        drawing_data = z.read('xl/drawings/drawing1.xml')
        root = ET.fromstring(drawing_data)
        file_names = []
        # Извлекаем картинки:
        for anchor in root.findall(f'{SCHEMA}oneCellAnchor'):
            image_name = anchor.find(f'{SCHEMA}cNvPr').get('name')
            file_names.append(image_name)
            z.extract(f'xl/media/{image_name}', 'images')
    
        df['image'] = pd.Series(file_names)
    print(df)

    68e5e85041844803428218.png

    З.Ы. можно тоже самое сделать на openpyxl и, наверное, даже проще.
    Ответ написан
    Комментировать
  • Xiaomi AX3000T или Cudy WR3000E?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    На текущий момент однозначно Cudy (WR3000E или WR3000S).
    C Xiaomi AX3000T у вас есть отличный от нуля шанс купить роутер ревизии RD03V2 на Qualcomm, на который нет (и вероятно не будет) OpenWRT.

    А так, оба спокойно и легко прошиваются на OpenWRT. Работают стабильно со всеми штуками, ради которых их перепрошивают. Памяти хватает, места хватает. Cudy к тому же не препятствует перепрошивке.
    Ответ написан
    Комментировать
  • Существуют ли сервисы: онлайн python editor для совместного использования?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    JetBrains Fleet?
    С помощью Fleet удобно работать над кодом вместе с коллегами в реальном времени. IDE не только поддерживает совместное редактирование кода, но и позволяет использовать общий терминал, заниматься отладкой и исследованием кода, выполнять код-ревью и многое другое — все это без дополнительной настройки.
    Ответ написан
  • Как связать 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}")
    Ответ написан
    Комментировать