Несколько копий и порты
Каждый экземпляр Studio слушает свой HTTP-порт. Скрипт с зашитым localhost:7010 во второй копии бьёт в первую или в мёртвый порт — часто это unknown command. Хост берите из окружения процесса, которым Studio запускает скрипт.
Зачем две копии
- Два независимых робота сразу: разные прокси, разные профили, разные ящики почты.
- Отладка нового скрипта, пока боевой крутится по расписанию.
- Разные проекты без общей папки Settings и общего download.
Одна копия = один HTTP-сервер команд = один исполнитель расписания. Параллельность — это несколько процессов, не «два navigate подряд».
Не ставьте две копии в одну папку установки «поверх» друг друга без разных портов: Settings, download и лог будут общими, отладка превратится в лотерею. Либо две папки, либо явный другой порт и другие пути файлов — см. чеклист ниже.
Что не является второй копией
- Вкладки браузера внутри одной Studio — один порт. Методы вкладок на хабе browser.
- Две задачи в одном scheduler — очередь, не параллель. См. гайд расписания.
- Два PHP-файла, один процесс Studio — всё равно один порт; второй скрипт просто ждёт, если первый ещё бежит из панели.
xhe_host из окружения
При запуске из Studio в процесс попадает RPABOT_HOST_URL. Актуальные шаблоны читают её в xhe_host. Это сделано как раз чтобы не ловить смену порта руками.
$xhe_host = getenv("RPABOT_HOST_URL");
Python:
import os
xhe_host = os.environ.get("RPABOT_HOST_URL", "127.0.0.1:7010")
Подробнее про шаблоны языков: первый скрипт на Python/C#/JS. Старые примеры с "localhost:7010" или 127.0.0.1:7013 — порт чужой машины. В многоэкземплярном контуре их нельзя копировать как есть.
Как проверить, куда стучитесь
app→get_port — порт живого приложения. Сравните с хвостом xhe_host. Панель информации Studio показывает HTTP-запросы команд: видно IP и порт.
Запуск из внешней IDE: выставьте ту же переменную окружения, что у целевой Studio, либо явно хост:порт этой копии. Без живого приложения обёрткам некуда слать POST.
Разведите файлы
Даже при разных портах легко затереть работу соседа:
- папка download — своя на копию;
- файлы logger и sqlite — свои;
- выход Excel/PDF — префикс имени или подпапка
botA/botB.
Общий Settings в одной папке установки удобен, пока не начнёте одновременно менять прокси и отпечаток. Тогда лучше две установки или явный профиль на скрипт.
Окна и трей
В настройках задайте «Название окна» — в панели задач будут разные заголовки. «Сворачивать в трей» / «скрывать при старте» не плодят десяток одинаковых кнопок. Для RT то же самое: две службы визуально не различить без заголовка.
Порт второй копии меняйте в настройках этой копии, не «подождите, 7010 освободится». Если порт занят — жива первая Studio или процесс не убился после падения.
Чеклист перед двумя роботами
- Две установки или две явно разные папки Settings — не один и тот же профиль «на двоих» без необходимости.
- Разные HTTP-порты. Скрипт читает
getenv("RPABOT_HOST_URL"), неlocalhost:7010. - Свои папки download, логов, Excel/PDF. Префикс
botA/botBв именах файлов. - Разные заголовки окон. Свои задачи в расписании — очередь не общая между копиями.
- Проверка: get_port совпадает с хвостом
xhe_host. Иначе — unknown command.
$xhe_host = getenv("RPABOT_HOST_URL");
$logger->info("host", $xhe_host);
$logger->info("port", $app->get_port());
Внешняя IDE: выставьте ту же переменную окружения, что у целевой Studio. Без живого приложения обёрткам некуда слать POST.
FAQ
Порт занят. Первая копия жива или процесс не убился. Смените порт второй копии в настройках, не «подождите и стучите на 7010».
Скрипт из расписания бьёт не туда. Расписание запускает файл в контексте той Studio, где оно висит. Не ожидайте, что задача из копии A пойдёт в порт B.
Harvestor / «многопоточный сбор HTML». Это отдельный объект harvestor, не вторая Studio. Не путайте с двумя полными браузерами.
Две вкладки ≠ два порта. Методы вкладок на хабе browser. Параллельный прокси и разные отпечатки — отдельные процессы.
Скрипт из PyCharm бьёт в 7010, робот на 7020. В окружении IDE нет RPABOT_HOST_URL или зашит старый хост. См. языки.