↩️ Назад

Категории

Слежка за сотрудниками: от скрипта до нейросетей

23.09.2026 | из категории: Нейросети

Слежка за сотрудниками - как организована слежка в компаниях
Заметки для блога · Employee Monitoring

Слежка за сотрудниками: от «скрипта на коленке» до нейросетей, которые читают поведение

Разбираю, как устроен рынок корпоративного мониторинга, что уже умеют большие системы, и где в этой картине живёт простая идея «скриншот каждые 5 минут + анализ активности». Материал — черновик, потом можно доработать.

01 Введение: почему тема живая

Идея «следить за сотрудниками через скриншоты» кажется новой только на первый взгляд. На самом деле это огромный рынок, который последние 5 лет переживает бум из-за удалёнки и генеративного ИИ.

Ключевой сдвиг: раньше мониторинг = «поймать вора». Сейчас мониторинг = «понять поведение, оптимизировать процессы и защититься от утечек через ИИ-инструменты».

02 Три уровня мониторинга

Условно всё делится на три этажа. Чем выше — тем больше денег, сложнее архитектура и серьёзнее юридические риски.

Уровень 1

Простейший

Один скрипт на Python. Скриншоты, активное окно, отправка на сервер. Без ML, без OCR. Анализ — глазами или простыми эвристиками.

Стоимость: 0 ₽. Время: вечер.

Уровень 2

Средний

Локальная нейросеть (Ollama + vision-модель), SQLite, дашборд. Анализ активности: «работает / ютуб / переписка». Всё локально.

Стоимость: 0 ₽ + железо. Время: неделя.

Уровень 3

Корпоративный

Агенты, DLP, OCR, поведенческая аналитика, графы коммуникаций, детект аномалий, интеграция с SIEM. Сертификации, юристы, отдел внедрения.

Стоимость: от тысяч $ в год. Время: месяцы.

03 Корпоративные монстры: что они реально делают

Это не «скриншот каждые 5 минут». Это полноценные платформы, где картинка с экрана — лишь один из сотни сигналов.

StaffCop Enterprise (Россия)

  • Контроль почты, мессенджеров (Skype, Telegram), веб-сайтов, буфера обмена, USB.
  • «Автоматический детектор аномалий пользователей» — ищет отклонения от типичного поведения.
  • Графы коммуникаций и миграции файлов: кто с кем общается, какие данные пересылает.
  • Ориентация на ИБ и расследования инцидентов, а не на «кто сколько работал».

Teramind (США)

  • OCR экрана: ищет PII, номера карт, медицинские данные прямо в пикселях.
  • Контекстно-зависимый DLP для генеративного ИИ — следит, что сотрудник копирует в промпты ChatGPT, и блокирует утечки.
  • Анализ «промпт-инъекций» и теневого использования ИИ.
  • Поведенческая аналитика: риск-скоринг пользователей в реальном времени.

Hubstaff

  • Специализация — выявление аномалий ввода.
  • Ловит «mouse jigglers» — программы, имитирующие движение мыши.
  • Аномально высокая или низкая активность клавиатуры/мыши → сигнал о выгорании или имитации работы.
  • Больше про продуктивность, чем про безопасность.

Soroco

  • Патентованная технология анализа последовательностей UI-экранов.
  • ML (детекция объектов + OCR) понимает, какую именно бизнес-задачу решает пользователь в CRM/ERP.
  • Цель — не слежка, а автоматизация: записать процесс и отдать роботу.
  • Пример «безумного анализа поведения»: система знает, что «этот клик + этот экран = оформление возврата».

Chronometry (open-source)

  • Всё локально: скриншоты обрабатывает Ollama с vision-моделью.
  • Строит таймлайн дня и «дайджест» с категориями активности.
  • Акцент на приватность и самоанализ, а не на слежку за другими.
  • Ближе всего к тому, что можно собрать самому.
Общий паттерн: большие системы не полагаются на один сигнал. Они комбинируют активное окно, OCR, сетевые события, DLP-правила и ML-модели аномалий.

04 Средний уровень: self-hosted и open-source

Если не хочешь корпоративную махину, но и «скрипт на коленке» уже мало — вот сюда стоит смотреть.

Стек, который реально работает

Скриншот (mss) Активное окно (pywin32) Локальная vision-модель (Ollama) JSON с описанием SQLite Дашборд
  • Плюс: данные не покидают машину, нет юридических рисков, можно анализировать себя.
  • Минус: нужна нормальная видеокарта или терпение, vision-модели медленные.
  • Модели: qwen2.5vl, llava, moondream — все умеют «опиши, что на экране».

Что можно вытащить из анализа активности

  • Категория: работа / соцсети / видео / переписка / игры.
  • Приложение: IDE, браузер, мессенджер, терминал.
  • Примерная задача: «пишет код», «смотрит лекцию», «читает документацию».
  • Аномалии: «резко переключился на личное», «долго статичный экран».

05 Простейший уровень: твоя идея

Скрипт под именем host.exe, скриншот каждые 5 минут, отправка на внутренний сервер, потом анализ нейросетью. Давай разложим честно.

Что хорошо

  • Быстро собирается, легко понять принцип.
  • Можно поиграться с ML на реальных данных.
  • Хороший учебный проект для понимания мониторинга.

Что плохо

  • Имя host.exe — красная тряпка. Любой антивирус и любой админ насторожатся. Это маскировка под системный процесс, а не «нейтральное имя».
  • Один сигнал. Скриншот раз в 5 минут не говорит, работает человек или нет. 10 минут чтения документа = «статичный экран» = ложное «ваньку валяет».
  • Нейросеть без контекста ошибается постоянно. Нужны метаданные: активное окно, время в нём, ввод.
  • Юридически — это скрытый сбор данных. В РФ и ЕС есть требования к уведомлению сотрудников.

Как сделать то же самое, но адекватно

  • Честное имя: activity-logger, chrono.
  • Локальная обработка вместо отправки сырых скриншотов.
  • Анализ не картинки, а активного окна + времени.
  • Пилот на себе, чтобы увидеть ложные срабатывания.

06 Пример реализации: «activity-logger»

Минимальный, но осмысленный прототип. Делает скриншот, определяет активное окно, спрашивает локальную модель «чем занят пользователь», пишет в SQLite. Всё локально.

Архитектура

Каждые N минут Скриншот + активное окно Ollama (vision) JSON: категория, приложение, описание SQLite

Зависимости

pip install mss pywin32 pillow requests

Плюс установленный Ollama с моделью, например: ollama pull qwen2.5vl:3b

Код (activity-logger.py)

import time
import json
import base64
import sqlite3
import io
from datetime import datetime

import mss
import requests
from PIL import Image
import win32gui
import win32process

# --- Настройки ---
INTERVAL_SEC = 300          # раз в 5 минут
OLLAMA_URL = "http://localhost:11434/api/generate"
MODEL = "qwen2.5vl:3b"      # лёгкая vision-модель
DB_PATH = "activity.db"


def get_active_window_title():
    """Возвращает заголовок активного окна и имя процесса."""
    try:
        hwnd = win32gui.GetForegroundWindow()
        title = win32gui.GetWindowText(hwnd)
        _, pid = win32process.GetWindowThreadProcessId(hwnd)
        # имя процесса без psutil — через tasklist было бы медленно,
        # поэтому просто оставим pid, а имя добавим опционально
        return title, pid
    except Exception:
        return "", 0


def take_screenshot_base64():
    """Скриншот всего экрана → base64 PNG (сжатый)."""
    with mss.mss() as sct:
        monitor = sct.monitors[1]
        shot = sct.grab(monitor)
        img = Image.frombytes("RGB", shot.size, shot.rgb)
        # уменьшаем, чтобы модель работала быстрее
        img.thumbnail((1280, 720))
        buf = io.BytesIO()
        img.save(buf, format="PNG", optimize=True)
        return base64.b64encode(buf.getvalue()).decode("utf-8")


def ask_model(image_b64, window_title):
    """Спрашиваем локальную модель: чем занят пользователь."""
    prompt = (
        "Ты анализируешь скриншот рабочего стола сотрудника. "
        "Ответь строго в JSON без пояснений:\n"
        "{\n"
        '  "category": "work|social|video|messaging|games|other",\n'
        '  "app": "название приложения или сайта",\n'
        '  "activity": "краткое описание, чем занят (до 15 слов)",\n'
        '  "is_work_related": true/false\n'
        "}\n"
        f"Заголовок активного окна: {window_title}"
    )
    payload = {
        "model": MODEL,
        "prompt": prompt,
        "images": [image_b64],
        "stream": False,
        "options": {"temperature": 0.1}
    }
    try:
        r = requests.post(OLLAMA_URL, json=payload, timeout=120)
        r.raise_for_status()
        raw = r.json().get("response", "").strip()
        # вытаскиваем JSON из ответа
        start = raw.find("{")
        end = raw.rfind("}") + 1
        return json.loads(raw[start:end])
    except Exception as e:
        return {"category": "error", "app": "", "activity": str(e), "is_work_related": False}


def init_db():
    con = sqlite3.connect(DB_PATH)
    con.execute("""
        CREATE TABLE IF NOT EXISTS activity (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            ts TEXT,
            window_title TEXT,
            pid INTEGER,
            category TEXT,
            app TEXT,
            activity TEXT,
            is_work_related INTEGER
        )
    """)
    con.commit()
    return con


def save(con, window_title, pid, result):
    con.execute(
        "INSERT INTO activity (ts, window_title, pid, category, app, activity, is_work_related) "
        "VALUES (?, ?, ?, ?, ?, ?, ?)",
        (
            datetime.now().isoformat(timespec="seconds"),
            window_title,
            pid,
            result.get("category", ""),
            result.get("app", ""),
            result.get("activity", ""),
            1 if result.get("is_work_related") else 0,
        ),
    )
    con.commit()


def main():
    con = init_db()
    print(f"[activity-logger] старт, интервал {INTERVAL_SEC} сек, модель {MODEL}")
    while True:
        try:
            title, pid = get_active_window_title()
            img_b64 = take_screenshot_base64()
            result = ask_model(img_b64, title)
            save(con, title, pid, result)
            print(f"[{datetime.now():%H:%M:%S}] {result.get('category')} | "
                  f"{result.get('app')} | {result.get('activity')}")
        except Exception as e:
            print(f"[!] ошибка: {e}")
        time.sleep(INTERVAL_SEC)


if __name__ == "__main__":
    main()

Что получится в базе

SELECT ts, category, app, activity FROM activity ORDER BY ts DESC LIMIT 10;

Пример строк: work | VS Code | пишет код на Python, video | YouTube | смотрит лекцию по ML, messaging | Telegram | переписка.

Дальше можно прикрутить

  • Простой дашборд на Flask: сколько времени в каждой категории за день.
  • Агрегацию: «% work-related за неделю».
  • Детект аномалий: резкие скачки в games или video в рабочее время.
  • Экспорт в CSV для анализа в pandas.
Важно: это прототип для себя. Если запускать на чужих машинах — нужно уведомление сотрудников и согласие, иначе это нарушение закона и просто подлость.

06.5 Как это делает сама Microsoft (Recall + Phi Silica)

Ты придумал скриншот каждые 5 минут и локальную нейронку для анализа. Microsoft сделала то же самое, но назвала это Recall, встроила в Windows и добавила кучу железа. Разбираем архитектуру.

Что такое Recall

Recall — это фича Windows 11 для Copilot+ PC, анонсированная в мае 2024 года. Она каждые несколько секунд делает скриншот экрана (или когда содержимое активного окна меняется), прогоняет его через OCR и строит семантический индекс — локальную векторную базу, по которой можно искать всё, что ты когда-либо видел на экране[citation:1][citation:8].

Идея ровно твоя: «запомнить всё, что делает пользователь, и потом анализировать». Только вместо отправки на сервер — всё локально, и вместо «ваньку валяет или работает» — «найди мне ту таблицу с синим графиком, которую я видел на прошлой неделе».

Как это работает технически

Скриншот каждые N секунд OCR + Florence vision encoder Векторные эмбеддинги SQLite + DiskANN индекс Семантический поиск
  • OCR вытаскивает текст из пикселей.
  • Vision encoder (Florence) превращает изображение в вектор, чтобы можно было искать по смыслу, а не только по словам. Например, запрос «синее платье» найдёт картинку, даже если слова «синее платье» на экране не было[citation:12][citation:14].
  • Векторная база хранит эмбеддинги в SQLite с индексом DiskANN. Это позволяет искать миллионы векторов быстро и локально[citation:12].
  • LLM на этапе индексации не используется — только эмбеддинги. LLM (Phi Silica) подключается, когда ты задаёшь вопрос на естественном языке и нужно сформулировать ответ[citation:12].

Phi Silica — та самая «локальная нейронка»

Phi Silica — это маленькая языковая модель (SLM) от Microsoft, оптимизированная для запуска прямо на NPU (нейропроцессоре) Copilot+ PC[citation:3][citation:9]. Это не Llama на 8B, а компактная модель, которая:

  • Работает полностью локально, без интернета.
  • Использует 4-битную квантизацию (QuaRot), чтобы влезть в память и не жрать батарею[citation:3].
  • Умеет не только текст, но и vision: смотрит на картинку, описывает её, генерирует alt-text для скринридеров[citation:14].
  • Заточена под задачи: суммаризация, перефразирование, Q&A по локальным данным[citation:9].

Требования: NPU с 40+ TOPS, 16GB+ RAM. На обычном железе Phi Silica может запуститься на GPU, но это уже не «встроенная фича», а костыль[citation:4][citation:19].

Почему Microsoft пришлось «переобуться»

Изначальный релиз Recall был катастрофой. Скриншоты хранились в открытом виде в обычной папке. Исследователи показали, что любой малварный процесс или другой пользователь на той же машине может вытащить всё, что ты когда-либо видел[citation:18].

После волны критики Microsoft полностью переделала архитектуру:

  • Opt-in: по умолчанию выключено, пользователь должен явно включить[citation:2][citation:13].
  • Шифрование: все снапшоты шифруются ключами, привязанными к TPM и Windows Hello, и хранятся в VBS Enclave[citation:13].
  • Локальность: данные никогда не покидают устройство, не шарятся между пользователями и не используются для обучения моделей[citation:2][citation:16].
  • Фильтры: InPrivate-сессии, DRM-контент, пароли и номера карт автоматически исключаются[citation:13].

Главный вывод для блога

Твоя идея — это Recall без бюджета Microsoft. Ты хочешь:

  • Скриншот каждые 5 минут → Microsoft: каждые несколько секунд.
  • Отправку на сервер → Microsoft: всё локально, но с кучей железа.
  • Анализ нейросетью → Microsoft: OCR + эмбеддинги + Phi Silica.
  • Маскировку под host.exe → Microsoft: явный opt-in с иконкой в трее.

Разница в том, что у Microsoft есть юристы, инженеры и репутация, которую они чуть не потеряли на первом релизе. У тебя есть Python-скрипт и блог. Это не значит, что идея плохая — это значит, что ты нащупал реальный тренд, который корпорация пытается монетизировать.

«Recall — это не фича. Это ответ Microsoft на вопрос: что если бы у компьютера была фотографическая память? И да, они сделали это ровно так, как ты придумал. Просто у них NPU на 45 TOPS, а у тебя — mss и Ollama».

07 Этика, закон и почему это важно

  • РФ: скрытый сбор данных о сотруднике может нарушать трудовое законодательство и право на неприкосновенность частной жизни. Даже рабочие мессенджеры содержат личные сообщения.
  • ЕС: GDPR требует законного основания и информирования. Скрытая слежка почти всегда незаконна.
  • Доверие: исследования показывают рост тревожности и падение лояльности там, где вводят тотальный мониторинг.
  • Обход: сотрудники быстро учатся имитировать активность (mouse jigglers, «правильные» окна).
Если система нужна для безопасности — она должна быть прозрачной и согласованной. Если для «поймать» — она будет врать и вредить.

08 Куда двигаться дальше

Если интересен ML

  • Собрать датасет своих скриншотов за неделю.
  • Разметить категории вручную.
  • Сравнить ответы vision-модели с разметкой.
  • Посчитать precision/recall по «work vs not work».

Если интересен продукт

  • Локальный дашборд «мой день» с таймлайном.
  • Экспорт в Notion/Obsidian для самоанализа.
  • Режим «только для себя» как альтернатива корпоративной слежке.
  • Open-source с акцентом на приватность (как Chronometry).

Если интересна безопасность

  • DLP-правила: искать в скриншотах паттерны карт, паспортов, API-ключей.
  • Детект копирования в ChatGPT/Claude.
  • Алерты на подозрительные последовательности.

Если хочется хайпа в блоге

  • «Я неделю следил за собой нейросетью — вот что она поняла».
  • «Сравнил 5 vision-моделей на задаче "работает или ютуб"».
  • «Почему корпоративный мониторинг не работает так, как вы думаете».
Теги: #анализ_поведения #безопаность #утечки



Категории:

Категории

← Назад к списку

Посетителей сегодня: 0
о блоге | карта блога | 📡 Подписаться на RSS

© Digital Specialist | Не являемся сотрудниками Google, Яндекса и NASA