Рассылка Viber в фоне: PyAutoGUI или Viber API без блокировки ПК
Как запустить скрипт pyautogui для автоматической рассылки в группы Viber в фоновом режиме на Windows. Ограничения PyAutoGUI, переход на Viber API, VM, multiprocessing. Полное руководство без блокировки ПК.
Как запустить скрипт pyautogui для автоматической рассылки сообщений в группы Viber в фоновом режиме без блокировки ПК?
У меня есть Python-скрипт на базе pyautogui, который автоматизирует отправку объявлений (текст + фото) в группы Viber из JSON-файла. Скрипт учитывает историю отправок, частоту и выбирает объявления на день. Сейчас выполнение блокирует работу на ПК до завершения (Viber запускается, окно максимизируется, клики по координатам).
Задача: Сделать рассылку фоновой — запустить скрипт и сразу продолжить работу, не дожидаясь окончания.
Текущий код скрипта:
import pyautogui as pag
import subprocess
from time import sleep
import pyperclip as pc
import pygetwindow as gw
import ctypes
import datetime
import os
from datetime import date
import json
pag.FAILSAFE = True
pag.PAUSE = 0.8
SEARCH_X, SEARCH_Y = 140, 46
CLEAR_X, CLEAR_Y = 273, 44
GROUP_X, GROUP_Y = 108, 204
PHOTO_X, PHOTO_Y = 328, 990
DATA_FILE = r'F:\програмирование\python\viber рассылка\ads.json'
HISTORY_FILE = r'F:\програмирование\python\viber рассылка\sending_history.json'
# [остальной код функций click_at, press_ctrl_v, write, go_to, send_photo, send_ad, load_sending_history, save_sending_history, update_sending_history, should_send_today, get_ads_for_today, main без изменений]
Ключевые особенности:
- Автоматизация через клики по фиксированным координатам в Viber.
- Запуск Viber через subprocess.
- Логика ротации объявлений и проверки частоты отправок.
Как реализовать запуск в фоне (мультитрединг, multiprocessing, отдельный процесс)? Рекомендации для Windows, чтобы pyautogui работал стабильно без активного окна.
PyAutoGUI не предназначен для надёжной фоновой рассылки Viber: он симулирует клики/нажатия и требует активного рабочего стола, поэтому будет блокировать работу на ПК. Лучший путь — перейти на Viber API (бот) для полностью фоновой рассылки; если это невозможно, запускать существующий pyautogui-скрипт в изолированной среде (виртуальная машина или отдельная сессия) или стартовать его как отдельный отключённый процесс и/или использовать инструменты типа AutoIt (ControlSend) для работы с неактивными окнами. Ниже — практические шаги, примеры кода и рекомендации для Windows.
Содержание
- Стратегия: кратко — что выбрать для рассылки Viber в фоновом режиме
- PyAutoGUI: ограничения при работе в фоне
- Лучший путь — перейти на Viber API для фоновой рассылки
- Если API нельзя — запуск pyautogui в изолированной среде (VM / отдельная сессия)
- Запуск в фоне: примеры subprocess, multiprocessing, pythonw
- Практические приёмы для UI-автоматизации (AutoIt / ControlSend / pywinauto)
- Советы по стабильности, логам и безопасности рассылки
- Источники
- Заключение
Стратегия: кратко — что выбрать для рассылки Viber в фоновом режиме
Коротко: если цель — фоновая, масштабируемая и надёжная рассылка Viber — переходите на Viber API (бот): это реальный фон, никаких кликов по экрану и никакой блокировки ПК. Если же вы не можете использовать API (например, нужно отправлять сообщения в существующие групповые чаты, куда бот не добавлен), то самый надёжный путь — запускать ваш pyautogui-скрипт в отдельной, изолированной десктоп-среде (виртуальная машина, отдельный пользователь/сессия) или запускать отдельно как отключённый процесс и держать UI-автоматизацию внутри этой среды.
Как решить быстро? Задайте себе вопрос: можно ли перевести рассылку на бота и собрать подписчиков? Если да — API. Если нет — VM/отдельная сессия + фоновые процессы.
PyAutoGUI: ограничения при работе в фоне
PyAutoGUI симулирует мышь и клавиатуру через системные вызовы — это значит, что события уходят в активный рабочий стол и активное окно. Практические следствия:
- Скрипт будет мешать пользователю: движение мыши, клики и переключение окон.
- PyAutoGUI не имеет механизма «послать клик в неактивное окно» — это не та же логика, что у системных UI-инструментов вроде AutoIt/ControlSend. Смотрите обсуждение в официальном репозитории: https://github.com/asweigart/pyautogui/issues/278 и https://github.com/asweigart/pyautogui/issues/424.
- Сообщения сообщества показывают, что даже попытки управления окнами требуют манипуляций с фокусом/свертыванием/разворачиванием: https://stackoverflow.com/questions/43785927/python-pyautogui-window-handle и https://github.com/asweigart/pyautogui/issues/35.
- В Windows переключение фокуса и политик сессий (RDP/локальный пользователь) влияет на поведение — об этом пишут и в Microsoft Q&A (проблемы с автофокусом/сессиями): https://learn.microsoft.com/ru-ru/answers/questions/2798734/question-2798734?page=1.
Вывод: если вы хотите «запустить и забыть» на рабочей машине — PyAutoGUI по умолчанию не даёт такого поведения без изоляции.
Лучший путь — перейти на Viber API для фоновой рассылки
Почему это предпочтительно:
- Viber API (бот) работает по HTTP — никакой эмуляции мыши, всё полностью фоново.
- Можно отправлять текст и картинки программно, планировать отправки, логировать статусы. См. официальную документацию: https://developers.viber.com/docs/api/rest-bot-api/ и вводную секцию по messaging: https://creators.viber.com/docs/bots-api/resources/messaging/intro. Также полезное обзорное руководство по бизнес-чатботам: https://www.infobip.com/blog/viber-chatbot-quick-guide.
Ключевые моменты миграции:
- Зарегистрируйте бота, получите X-Viber-Auth-Token.
- Соберите user_id подписчиков — при подключении пользователь отправляет событие, его id нужно сохранять (webhook). Viber не даёт “всем подряд” id — вы получаете тех, кто подписался/взаимодействовал.
- Для отправки фото используйте поле “media” с публичным URL (изображение должно быть доступно по HTTPS).
- Организуйте планировщик (cron / Windows Task Scheduler / отдельный процесс), логирование и повторные попытки по ошибкам.
Простой пример отправки изображения через Viber REST API (Python + requests):
import requests
TOKEN = "ВАШ_VIBER_TOKEN"
headers = {
"X-Viber-Auth-Token": TOKEN,
"Content-Type": "application/json"
}
payload = {
"receiver": "<USER_ID>",
"type": "picture",
"text": "Объявление: пример текста",
"media": "https://example.com/path/to/photo.jpg"
}
resp = requests.post("https://chatapi.viber.com/pa/send_message", headers=headers, json=payload)
print(resp.status_code, resp.text)
Если целевая аудитория — группы, проверьте, может ли бот быть добавлен в такие чаты или заменить их моделью подписки; часто для масштабной рассылки бизнесы переводят людей на подписку бота/канала.
Если API нельзя — запуск pyautogui в изолированной среде (VM / отдельная сессия)
Когда вы не можете использовать API (например, нужно обязательно кликать по групповым чатам вашей десктоп-версии Viber), то единственный надёжный способ — изолировать GUI-автоматизацию от основного рабочего стола.
Варианты (по убывающей надёжности/простоте):
- Виртуальная машина (рекомендуется)
- Создайте Windows VM (VirtualBox / Hyper‑V / VMware).
- Установите Viber и Python/зависимости.
- Запустите ваш pyautogui-скрипт внутри VM. VM можно держать headless; автозапуск через Task Scheduler.
- Плюсы: ваши клики не мешают основному пользователю, можно оставить включённой 24/7. Пример старта VM в VirtualBox:
VBoxManage startvm "ViberVM" --type headless.
- Отдельная учётная запись + VNC (альтернатива)
- Создайте второго локального пользователя Windows, запустите сессии под ним и подключайтесь через VNC; VNC оставляет графику активной после отключения. RDP часто блокирует GUI при дисконнекте, поэтому RDP — не лучший выбор без хитростей.
- Запуск на отдельном физическом ПК/сервере
- Самый простой и надёжный (вы полностью изолированы).
Почему это лучше, чем пытаться «прикрутить» фон к pyautogui: все события остаются в изолированном рабочем столе, основной пользователь продолжает работу без помех.
Запуск в фоне: примеры subprocess, multiprocessing, pythonw
Если вы хотите просто «запустить и уйти», можно стартовать ваш скрипт как отдельный отключённый процесс. Это не снимет проблему с фокусом, но позволит вам освободить текущую сессию.
- Пример — запуск отдельного процесса через subprocess (Windows, без консоли):
# launcher.py
import subprocess, sys, os
def start_background(script_path):
DETACHED_PROCESS = 0x00000008
CREATE_NEW_PROCESS_GROUP = 0x00000200
pythonw = sys.executable
if pythonw.lower().endswith("python.exe"):
pythonw = pythonw[:-10] + "pythonw.exe"
if not os.path.exists(pythonw):
pythonw = sys.executable
si = subprocess.STARTUPINFO()
si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
si.wShowWindow = subprocess.SW_HIDE
subprocess.Popen([pythonw, script_path],
creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP,
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, stdin=subprocess.DEVNULL,
startupinfo=si)
if __name__ == "__main__":
start_background(r"C:\path\to\send_viber.py")
print("Запущено в фоне")
- Multiprocessing (внутри одного запуска) — быстрый способ, но дочерний процесс всё равно управляет тем же рабочим столом:
from multiprocessing import Process
import send_viber # ваш модуль со функцией main()
def worker():
send_viber.main()
if __name__ == "__main__":
p = Process(target=worker)
p.start()
print("Фоновый процесс PID:", p.pid)
# основной процесс может завершиться, а child продолжит
Замечание: не используйте daemon=True, если хотите, чтобы процесс жил после завершения родителя — демоны завершаются с родителем.
- Windows Task Scheduler — создайте задачу «Run only when user is logged on» для отдельного пользователя или задачу с триггером «по запросу» и запустите её. Это удобно для автозапуска в VM/отдельной сессии.
Практические приёмы для UI-автоматизации (AutoIt / ControlSend / pywinauto)
Если нужен доступ к неактивным окнам (и вы не хотите/не можете использовать VM), есть варианты, которые лучше, чем простые эмуляции мыши:
-
AutoIt — функция ControlSend позволяет отправлять клавиши в окно без его активации. Документация ControlSend: https://www.autoitscript.com/autoit3/docs/functions/ControlSend.htm. В репозитории pyautogui обсуждали необходимость подобного: https://github.com/asweigart/pyautogui/issues/738. Вы можете написать AutoIt-скрипт и запускать его из Python через subprocess (или вызывать AutoHotkey с аналогичным скриптом).
-
pywinauto / pywin32 — позволяют работать с контролами окон через WinAPI (на уровне сообщений), что даёт возможность взаимодействовать с элементами интерфейса без глобальной эмуляции ввода. Это требует изучения структуры окон Viber и иногда не работает с нестандартными элементами.
Пример идеи: создать AutoIt-сценарий для отправки текста в поле и прикрепления файла, и вызывать его из Python при необходимости. Это менее «взломно», чем двигать мышь по координатам, и может работать в фоне (без активации окна).
Советы по стабильности, логам и безопасности рассылки
- Логи и атомарные обновления истории: записывайте отправку в файл/БД сразу после подтверждения, чтобы при перезапуске не было дублирующих отправок.
- Проверка наличия элементов на экране: вместо жёстких координат используйте
pag.locateOnScreen('img.png', confidence=0.8)(OpenCV + Pillow) — но это всё ещё требует видимого десктопа и подходящей области. - Масштабирование экрана (DPI): Windows scaling влияет на координаты — рассчитывайте координаты относительно положения окна (
pygetwindow) или используйте относительные проценты. - FAILSAFE: если вы запускаете в реальной десктоп-сессии, не отключайте pag.FAILSAFE — оставьте промаркированный аварийный выход; в VM можно ужесточить поведение.
- API-токены и конфиденциальность: храните токены в переменных окружения или в зашифрованном виде, не в репозитории.
- Соблюдение правил/законодательства и consent: массовые рассылки — это чувствительная тема; убедитесь, что у вас есть права подписчиков и лимиты по количеству сообщений.
- Мониторинг: если рассылка важна — запускайте мониторинг процесса (health-check) и сбои в отдельный лог/уведомление.
Источники
- Pyautogui in background? · Issue #278 · asweigart/pyautogui
- Pyautogui does not work when Task Manger is focus in Windows 10 · Issue #424 · asweigart/pyautogui
- Python pyautogui window handle - Stack Overflow
- Viber REST API | Viber Developers Hub
- Viber Bot Messaging API | Viber Creators Hub
- A guide to Viber chatbots and how to build one — Infobip blog
- Pyautogui в фоновом режиме - CyberForum
- Отключить автофокус на окно - Microsoft Q&A
- Python скрипт кликающий по экрану — ru.StackOverflow
- asweigart/pyautogui · Issue #738
- asweigart/pyautogui · Issue #35
Заключение
Если хотите реальную фоновую рассылку Viber без блокировки ПК — самый надёжный путь — перейти на Viber API (бот) и отправлять текст/картинки через REST (это и масштабируемо, и не мешает пользователю). Если по каким‑то причинам API неприменим, делайте UI‑автоматизацию внутри изолированной среды (виртуальная машина или отдельная сессия) или используйте инструменты, умеющие посылать команды в неактивные окна (AutoIt/ControlSend, pywinauto), и запускайте скрипт как отдельный отключённый процесс (subprocess / pythonw / Task Scheduler). Начните с оценки: можно ли перевести рассылку на бота — это сэкономит вам массу времени и снимет проблему блокировки рабочего стола.