14 KiB
Автоматическая смена статуса в мессенджере
Скрипт запускается вместе с ОС, проверяет IP по маске из конфига, ждёт запуска процесса мессенджера, через заданное время выполняет смену статуса через имитацию кликов и ввода с клавиатуры.
Поддерживаются Windows и Linux.
Установка
- Клонируйте или скопируйте папку проекта.
- Создайте виртуальное окружение (рекомендуется):
python -m venv .venv # Windows: .venv\Scripts\activate # Linux: source .venv/bin/activate - Установите зависимости:
pip install -r requirements.txt - Linux: для управления окнами установите
wmctrl:sudo apt install wmctrl # Debian/Ubuntu sudo dnf install wmctrl # Fedora
Настройка
- Скопируйте пример конфига (или отредактируйте существующий):
copy config.json.example config.json # Windows cp config.json.example config.json # Linux - Конфиг config.json — объект JSON:
- Ключи — маски IP (первые три октета, например
"192.168.1"). Скрипт выбирает блок по текущему IP. - Значение для каждой маски — объект: message (текст статуса), pause (задержка в секундах после запуска процесса). Имя процесса и заголовок окна задаются в "_app" по ОС.
- Ключ "_app" — общие настройки для всех масок. Обязательно укажите в зависимости от ОС:
- proc_name_windows и proc_name_linux — имя процесса мессенджера (например
postlink-client.exe/postlink-client). - window_title_windows и window_title_linux — заголовок окна для фокуса и поиска по PID. Скрипт сам выбирает значение по текущей ОС (Windows/Linux).
- proc_name_windows и proc_name_linux — имя процесса мессенджера (например
- Способ клика — для каждой цели (иконка, поле статуса, кнопка «Сохранить») задаётся один из вариантов:
- Поиск по картинке (рекомендуется для разных разрешений): icon_image, status_image, save_button_image — пути к файлам изображений (относительно папки скрипта, например
images/icon.png). Скрипт ищет картинку на экране и кликает в её центр. Требуется opencv-python. - Координаты в пикселях: icon_position, status_position, save_button_position — от левого верхнего угла окна.
- Координаты в долях: icon_position_rel, status_position_rel, save_button_position_rel — доли 0.0–1.0 от размера окна.
- Поиск по картинке (рекомендуется для разных разрешений): icon_image, status_image, save_button_image — пути к файлам изображений (относительно папки скрипта, например
- image_confidence (опционально) — порог совпадения при поиске по картинке (0.0–1.0, по умолчанию 0.8). Чем выше, тем строже совпадение.
- Ключи — маски IP (первые три октета, например
Поиск по картинкам (разные разрешения)
Сделайте скриншоты элементов интерфейса (иконка/аватар для открытия меню, поле статуса, кнопка «Сохранить»), сохраните в папку images/ и укажите в _app:
- icon_image:
"images/icon.png" - status_image:
"images/status.png" - save_button_image:
"images/save.png"
Картинки должны быть небольшими фрагментами (например 40×40–80×80 пикселей), без лишнего фона. Скрипт ищет их на экране и кликает в центр — один конфиг работает на любом разрешении и масштабе. При необходимости понизьте image_confidence (например 0.7), если совпадение не находится.
Координаты в долях (альтернатива картинкам)
Чтобы один конфиг работал на разных разрешениях без картинок, задайте координаты относительно окна в долях 0–1 в полях *_position_rel:
icon_position_rel: [доля по горизонтали, доля по вертикали] — клик по иконке/аватару.status_position_rel: [доля X, доля Y] — поле статуса.save_button_position_rel: [доля X, доля Y] — кнопка «Сохранить».
Пример: при размере окна 400×300 значение [0.5, 0.5] — центр окна. На другом разрешении окно может быть 600×450 — центр останется по центру.
Подбор координат
Запустите вспомогательный скрипт, активируйте окно мессенджера и наведите мышь на нужные элементы — в консоли выводятся координаты относительно окна:
python get_coords.py
Остановка: Ctrl+C. Подставьте полученные значения в config.json в секцию _app: icon_position, status_position, save_button_position.
Запуск
Обычный запуск (для проверки):
python status_automation.py
Логи выводятся в консоль. Скрипт выходит сразу, если текущий IP не совпадает ни с одной маской из конфига; иначе ждёт процесс, затем через pause выполняет клики и устанавливает статус.
Автозапуск при старте ОС
Windows
- Откройте Планировщик заданий (Task Scheduler).
- Создайте задачу:
- Триггер: При входе в систему (или При запуске компьютера).
- Действие: Запуск программы.
- Программа: полный путь к
python.exe(из вашего venv или системы), например:D:\work\PLStatus\venv\Scripts\python.exe - Аргументы:
D:\work\PLStatus\status_automation.py - Рабочая папка:
D:\work\PLStatus.
- В свойствах задачи можно включить «Выполнять с наивысшими правами» только если реально нужно.
Альтернатива — ярлык в папке автозагрузки:
Win+R→shell:startup→ Enter.- Создайте ярлык с целью, например:
D:\work\PLStatus\venv\Scripts\pythonw.exe D:\work\PLStatus\status_automation.py
(использованиеpythonw.exeскрывает консоль.)
Linux
Через systemd (пользовательский сервис):
- Создайте файл
~/.config/systemd/user/plstatus.service:
[Unit]
Description=PLStatus messenger status automation
After=network-online.target
WantedBy=default.target
[Service]
Type=simple
ExecStart=/usr/bin/python3 /home/USER/PLStatus/status_automation.py
WorkingDirectory=/home/USER/PLStatus
Restart=on-failure
Environment=DISPLAY=:0
[Install]
WantedBy=default.target
Замените USER и путь /home/USER/PLStatus на свои.
- Включите и запустите сервис:
systemctl --user daemon-reload
systemctl --user enable plstatus.service
systemctl --user start plstatus.service
Если скрипт должен выполняться после входа в графическую сессию, убедитесь, что DISPLAY=:0 соответствует вашей сессии (или задайте корректный DISPLAY в Environment=).
Поведение
- При запуске читается
config.yaml. - Вычисляются локальные IPv4 и проверяется совпадение с ip_mask (первые три октета). Если совпадений нет — скрипт завершается без действий.
- Ожидается появление процесса с именем process_name (опрос раз в несколько секунд).
- После появления процесса выполняется пауза startup_delay секунд (по умолчанию 60).
- Окно мессенджера активируется по window_title.
- Выполняются клики:
- по иконке/аватару (icon_position),
- по полю статуса (status_position),
- затем Ctrl+A и Delete (очистка текущего статуса),
- вставка status_message (через буфер обмена, поддерживается кириллица),
- клик по кнопке сохранения (save_button_position).
Координаты в секции _app задаются относительно окна приложения, поэтому не зависят от положения окна на экране.
Упаковка в один исполняемый файл
Чтобы не устанавливать Python и библиотеки на других машинах, можно собрать один исполняемый файл со всеми зависимостями.
Варианты
| Инструмент | Плюсы | Минусы |
|---|---|---|
| PyInstaller | Просто, один .exe, одна команда | Размер 50–150 МБ |
| cx_Freeze | Гибкая настройка, кроссплатформа | Часто папка с файлами, не один exe |
| Nuitka | Нативная сборка, быстрый старт | Долгая сборка, нужен C-компилятор |
Рекомендуется PyInstaller: один файл, работает на Windows и Linux.
Сборка (PyInstaller)
Скрипты build.bat (Windows) и build.sh (Linux) собирают exe без окна консоли (--noconsole) и подставляют иконку, если в корне проекта есть icon.ico.
- В папке проекта с активированным venv:
pip install pyinstaller - Иконка (необязательно): положите в корень проекта файл icon.ico (формат ICO, лучше несколько размеров: 16×16, 32×32, 48×48). Если файла нет, при первой сборке создаётся простая заглушка (или запустите
python make_icon.py).
Как взять иконку из другого приложения (Windows):- Resource Hacker (бесплатно): скачайте с angusj.com/resourcehacker. Откройте в нём нужный .exe → в дереве слева откройте Icon Group → выберите нужную иконку (часто первая с большим размером) → правый клик → Save icon as .ico → сохраните как icon.ico в папку проекта.
- IconsExtract (NirSoft): nirsoft.net/utils/iconsext.html — показывает все иконки из папки с exe, можно сохранить выбранную в .ico.
- Рядом с программой иногда уже лежит .ico — скопируйте его в проект и при необходимости переименуйте в icon.ico.
- Windows: запустите
build.batили вручную:pyinstaller --onefile --noconsole --name PLStatus --clean --icon icon.ico status_automation.py - Linux:
./build.shили:pyinstaller --onefile --noconsole --name PLStatus --clean --icon icon.ico status_automation.py
Результат: в папке dist/ появится PLStatus.exe (Windows) или PLStatus (Linux) — при запуске окно консоли не появляется. Размер порядка 80–150 МБ.
Запуск собранного exe
- Рядом с исполняемым файлом должны лежать:
- config.json — конфигурация (скопируйте из проекта или создайте по образцу).
- Папка images/ с файлами icon.png, status.png, save.png (если используется поиск по картинкам).
- Лог пишется в status_automation.log в той же папке.
- На целевой машине Python и библиотеки устанавливать не нужно; на Linux для управления окнами по‑прежнему нужен wmctrl (
sudo apt install wmctrl).