Программирование

Рассылка Viber в фоне: PyAutoGUI или Viber API без блокировки ПК

Как запустить скрипт pyautogui для автоматической рассылки в группы Viber в фоновом режиме на Windows. Ограничения PyAutoGUI, переход на Viber API, VM, multiprocessing. Полное руководство без блокировки ПК.

Как запустить скрипт pyautogui для автоматической рассылки сообщений в группы Viber в фоновом режиме без блокировки ПК?

У меня есть Python-скрипт на базе pyautogui, который автоматизирует отправку объявлений (текст + фото) в группы Viber из JSON-файла. Скрипт учитывает историю отправок, частоту и выбирает объявления на день. Сейчас выполнение блокирует работу на ПК до завершения (Viber запускается, окно максимизируется, клики по координатам).

Задача: Сделать рассылку фоновой — запустить скрипт и сразу продолжить работу, не дожидаясь окончания.

Текущий код скрипта:

python
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 в фоновом режиме

Коротко: если цель — фоновая, масштабируемая и надёжная рассылка Viber — переходите на Viber API (бот): это реальный фон, никаких кликов по экрану и никакой блокировки ПК. Если же вы не можете использовать API (например, нужно отправлять сообщения в существующие групповые чаты, куда бот не добавлен), то самый надёжный путь — запускать ваш pyautogui-скрипт в отдельной, изолированной десктоп-среде (виртуальная машина, отдельный пользователь/сессия) или запускать отдельно как отключённый процесс и держать UI-автоматизацию внутри этой среды.

Как решить быстро? Задайте себе вопрос: можно ли перевести рассылку на бота и собрать подписчиков? Если да — API. Если нет — VM/отдельная сессия + фоновые процессы.


PyAutoGUI: ограничения при работе в фоне

PyAutoGUI симулирует мышь и клавиатуру через системные вызовы — это значит, что события уходят в активный рабочий стол и активное окно. Практические следствия:

Вывод: если вы хотите «запустить и забыть» на рабочей машине — PyAutoGUI по умолчанию не даёт такого поведения без изоляции.


Лучший путь — перейти на Viber API для фоновой рассылки

Почему это предпочтительно:

Ключевые моменты миграции:

  1. Зарегистрируйте бота, получите X-Viber-Auth-Token.
  2. Соберите user_id подписчиков — при подключении пользователь отправляет событие, его id нужно сохранять (webhook). Viber не даёт “всем подряд” id — вы получаете тех, кто подписался/взаимодействовал.
  3. Для отправки фото используйте поле “media” с публичным URL (изображение должно быть доступно по HTTPS).
  4. Организуйте планировщик (cron / Windows Task Scheduler / отдельный процесс), логирование и повторные попытки по ошибкам.

Простой пример отправки изображения через Viber REST API (Python + requests):

python
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-автоматизацию от основного рабочего стола.

Варианты (по убывающей надёжности/простоте):

  1. Виртуальная машина (рекомендуется)
  • Создайте Windows VM (VirtualBox / Hyper‑V / VMware).
  • Установите Viber и Python/зависимости.
  • Запустите ваш pyautogui-скрипт внутри VM. VM можно держать headless; автозапуск через Task Scheduler.
  • Плюсы: ваши клики не мешают основному пользователю, можно оставить включённой 24/7. Пример старта VM в VirtualBox: VBoxManage startvm "ViberVM" --type headless.
  1. Отдельная учётная запись + VNC (альтернатива)
  • Создайте второго локального пользователя Windows, запустите сессии под ним и подключайтесь через VNC; VNC оставляет графику активной после отключения. RDP часто блокирует GUI при дисконнекте, поэтому RDP — не лучший выбор без хитростей.
  1. Запуск на отдельном физическом ПК/сервере
  • Самый простой и надёжный (вы полностью изолированы).

Почему это лучше, чем пытаться «прикрутить» фон к pyautogui: все события остаются в изолированном рабочем столе, основной пользователь продолжает работу без помех.


Запуск в фоне: примеры subprocess, multiprocessing, pythonw

Если вы хотите просто «запустить и уйти», можно стартовать ваш скрипт как отдельный отключённый процесс. Это не снимет проблему с фокусом, но позволит вам освободить текущую сессию.

  1. Пример — запуск отдельного процесса через subprocess (Windows, без консоли):
python
# 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("Запущено в фоне")
  1. Multiprocessing (внутри одного запуска) — быстрый способ, но дочерний процесс всё равно управляет тем же рабочим столом:
python
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, если хотите, чтобы процесс жил после завершения родителя — демоны завершаются с родителем.

  1. 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) и сбои в отдельный лог/уведомление.

Источники


Заключение

Если хотите реальную фоновую рассылку Viber без блокировки ПК — самый надёжный путь — перейти на Viber API (бот) и отправлять текст/картинки через REST (это и масштабируемо, и не мешает пользователю). Если по каким‑то причинам API неприменим, делайте UI‑автоматизацию внутри изолированной среды (виртуальная машина или отдельная сессия) или используйте инструменты, умеющие посылать команды в неактивные окна (AutoIt/ControlSend, pywinauto), и запускайте скрипт как отдельный отключённый процесс (subprocess / pythonw / Task Scheduler). Начните с оценки: можно ли перевести рассылку на бота — это сэкономит вам массу времени и снимет проблему блокировки рабочего стола.

Авторы
Проверено модерацией
Модерация
Рассылка Viber в фоне: PyAutoGUI или Viber API без блокировки ПК