Как записать видео работы скрипта в режиме запуска?

Поддержка
  • Подскажите как записать видео работы браузера в скрипте баса в режиме запуска?

    Конечно же можно тыкнуть "отобразить браузер" и записывать экран любой софтиной типа camtasia\faststone. таким образом мы будем видеть что происходит в раскрытом браузере и в логе.

    Но если выполнится кубик сброс то браузер конечно же исчезнет и потом если в скрипте браузер снова открывается, то он откроется в свёрнутом режиме и захват экрана уже не будет видеть "движуху" в браузере.

    Самое простое Что приходит в - это костыль с помощью autohotkey который будет постоянно тыкать раскрывая браузер , но опять же это костыль(((

    есть ещё такой модуль как snapshot, но он делает скрины и только на конкретных местах.

    Может кто-то знает более простой вариант? мне нужно именно чтобы браузер всегда был раскрыт в режиме запуска.
    5b71dfea-329c-4b8a-bbe5-8191117d2b78-image.png

  • @Nikolas Сам не пробовал, но может этот способ более норм.
    Нужен автокликер с определением скриншотов (этот нашёл, но не пробовал, может есть и альтернативы).
    https://github.com/fckguapp/AutoImageClicker
    Если на экране будет виден этот скриншот,
    825084ef-1135-4750-802b-9844b1a3093e-image.png
    то кликер сделает по нему клик. Заодно можно сделать и разворачивание браузера на весь экран.

    Ну, может ещё пригодится расширение для записи видео
    https://chromewebstore.google.com/detail/screen-recorder/hniebljpgcogalllopnjokppmgbhaden

    А можно попросить разработчика сделать какой-нибудь код для запуска скрипта с развёрнутым браузером.

  • в общем Решил проблему написав autohotkeyscript. вот он . может кому-то тоже будет полезно
    требует autohotkey версии v1.1.37.02
    горячие клавиши запуска\паузы:
    Ctrl+Alt+P

    вместо :

    BasPidStatic := 10696
    

    поставьте свой номер процесса из Диспетчера задач:
    53684ddb-91d7-43ee-93b2-889c6ea09fd6-image.png

    вместо:

    BasTitleKey  := "instagram_5.2"
    

    поставьте текст без разрыва на латинице который присутствует в заголовке окна вашего процесса
    fe719f0c-3974-4c3d-aabf-223410f07b97-image.png

    ; ==========================================================
    ; BAS Keep Browser Visible — bind by PID, multi-monitor ready
    ; AHK v1.1.37.02 — держит окно "Браузер" раскрытым
    ; ==========================================================
    
    #NoEnv
    #SingleInstance, Force
    SetBatchLines, -1
    SetTitleMatchMode, 2
    SendMode, Input
    CoordMode, Mouse, Window
    CoordMode, Pixel, Window
    DetectHiddenWindows, Off
    
    ; Включаем DPI-awareness (пер-монитор). Если нет Shcore — откатываемся.
    DllCall("Shcore\SetProcessDpiAwareness", "Int", 2, "Int")
    if (ErrorLevel)
        DllCall("SetProcessDPIAware")
    
    ; ------------------- КОНФИГ -------------------
    BasPidStatic := 10696                    ; <-- твой текущий PID BAS
    BasTitleKey  := "instagram_5.2"         ; ASCII-фолбэк, если PID не найден
    
    BasWinClass  := "Qt5QWindowIcon"
    BasExe       := "BrowserAutomationStudio.exe"
    
    BrowserWinClass := "WorkerWindowClass"
    BrowserExe      := "Worker.exe"
    BrowserWinTitle := "Браузер"            ; файл должен быть UTF-8 with BOM
    
    TimerMs      := 700
    
    ; Координаты "Показать браузер" (клиентская область BAS)
    ShowLinkX := 56
    ShowLinkY := 292
    
    ; ---- Мониторы ----
    ; Куда класть окно "Браузер": 0 = не трогать, 1/2/3 = номер монитора
    BrowserOnMonitor := 2
    ; Куда переместить окно BAS: 0 = не трогать, 1/2/3 = номер монитора
    BasOnMonitor := 0
    
    ; Отступы и размер "Браузер" внутри выбранного монитора (рабочая область)
    BrowserMarginX := 40
    BrowserMarginY := 80
    BrowserWidth   := 520
    BrowserHeight  := 900
    ; ----------------- /КОНФИГ --------------------
    
    ; Глобальные
    gBasHwnd := ""
    gBasPid  := 0
    gBrowserHwnd := ""
    gOn := 0
    
    ; --------- ГОРЯЧИЕ КЛАВИШИ ----------
    ; Ctrl+Alt+P — старт/пауза мониторинга
    ^!p::
        gOn := !gOn
        SetTimer, WatchLoop, % (gOn ? TimerMs : "Off")
        TrayTip, BAS Watcher, % (gOn ? "Мониторинг включен" : "Мониторинг выключен"), 1500, 1
    return
    
    ; Ctrl+Alt+Q — выход
    ^!q::ExitApp
    
    ; Ctrl+Alt+C — калибровка координат "Показать браузер" (клиент BAS)
    ^!c::
        GetBasSpec(basSpec)
        if (!WinExist(basSpec))
            return
        WinActivate, %basSpec%
        Sleep, 120
        MouseGetPos, mx, my
        Clipboard := mx "," my
        TrayTip, BAS Watcher, % "Координаты (отн. BAS): " mx "," my " скопированы", 1500, 1
    return
    
    ; Ctrl+Alt+B — привязать к активному окну BAS (если PID сменился)
    ^!b::
        WinGetClass, c, A
        WinGet, pname, ProcessName, A
        if (c = BasWinClass && pname = BasExe) {
            gBasHwnd := WinExist("A")
            WinGet, gBasPid, PID, ahk_id %gBasHwnd%
            BasPidStatic := gBasPid
            gBrowserHwnd := ""
            WinGetTitle, t, ahk_id %gBasHwnd%
            TrayTip, BAS Watcher, % "Привязан к BAS PID " gBasPid " | " t, 2000, 1
            if (BasOnMonitor)
                MoveWindowToMonitor(gBasHwnd, BasOnMonitor)
        } else {
            TrayTip, BAS Watcher, "Активное окно не BAS", 1500, 1
        }
    return
    
    ; Ctrl+Alt+I — показать статус
    ^!i::
        WinGetTitle, t, ahk_id %gBasHwnd%
        MsgBox, 64, BAS Watcher
        , % "BAS PID: " gBasPid " (static=" BasPidStatic ")\nBAS HWND: " gBasHwnd "`nTitle: " t "`nBrowser HWND: " gBrowserHwnd "`nМониторинг: " (gOn ? "ON" : "OFF")
    return
    
    ; --------- АВТОСТАРТ ----------
    Initialize()
    if (BasOnMonitor && IsWindowValid(gBasHwnd))
        MoveWindowToMonitor(gBasHwnd, BasOnMonitor)
    gOn := 1
    SetTimer, WatchLoop, %TimerMs%
    TrayTip, BAS Watcher, "Мониторинг включен (автостарт)", 1500, 1
    return
    
    ; ================= ФУНКЦИИ =================
    
    Initialize() {
        global BasPidStatic, BasTitleKey, BasWinClass, BasExe, gBasHwnd, gBasPid
        if (BasPidStatic > 0) {
            spec := "ahk_pid " . BasPidStatic . " ahk_class " . BasWinClass . " ahk_exe " . BasExe
            if (WinExist(spec)) {
                gBasHwnd := WinExist(spec)
                gBasPid  := BasPidStatic
                return
            }
        }
        spec2 := BasTitleKey . " ahk_class " . BasWinClass . " ahk_exe " . BasExe
        if (WinExist(spec2)) {
            gBasHwnd := WinExist(spec2)
            WinGet, gBasPid, PID, ahk_id %gBasHwnd%
        }
    }
    
    GetBasSpec(ByRef out) {
        global gBasHwnd, BasPidStatic, BasWinClass, BasExe, BasTitleKey
        if (IsWindowValid(gBasHwnd)) {
            out := "ahk_id " . gBasHwnd
            return
        }
        if (BasPidStatic > 0) {
            out := "ahk_pid " . BasPidStatic . " ahk_class " . BasWinClass . " ahk_exe " . BasExe
        } else {
            out := BasTitleKey . " ahk_class " . BasWinClass . " ahk_exe " . BasExe
        }
    }
    
    GetParentPid(pid) {
        wmi := ComObjGet("winmgmts:")
        for p in wmi.ExecQuery("SELECT ParentProcessId FROM Win32_Process WHERE ProcessId=" pid)
            return p.ParentProcessId + 0
        return 0
    }
    
    IsWindowValid(hwnd) {
        if (!hwnd)
            return false
        WinGet, out, ID, ahk_id %hwnd%
        return (out = hwnd)
    }
    
    ; Рабочая область монитора N (без панели задач)
    GetMonitorWorkArea(idx, ByRef l, ByRef t, ByRef r, ByRef b) {
        SysGet, c, MonitorCount
        if (idx < 1 || idx > c) {
            l := t := r := b := ""
            return false
        }
        SysGet, Mon, MonitorWorkArea, %idx%
        l := MonLeft, t := MonTop, r := MonRight, b := MonBottom
        return true
    }
    
    ; Переместить окно в рабочую область монитора N
    MoveWindowToMonitor(hwnd, idx) {
        global BrowserMarginX, BrowserMarginY, BrowserWidth, BrowserHeight
        if (!IsWindowValid(hwnd))
            return
        if (!GetMonitorWorkArea(idx, l, t, r, b))
            return
        x := l + BrowserMarginX
        y := t + BrowserMarginY
        w := BrowserWidth
        h := BrowserHeight
        WinMove, ahk_id %hwnd%, , %x%, %y%, %w%, %h%
    }
    
    FindBrowserForThisBas() {
        global gBasPid, BrowserWinClass, BrowserExe, BrowserWinTitle
        if (!gBasPid)
            return ""
        ; 1) По классу+exe и ParentPID
        WinGet, list, List, ahk_class %BrowserWinClass% ahk_exe %BrowserExe%
        Loop, %list%
        {
            thisH := list%A_Index%
            WinGet, thisPid, PID, ahk_id %thisH%
            ppid := GetParentPid(thisPid)
            if (ppid = gBasPid)
                return thisH
        }
        ; 2) Фолбэк — по заголовку "Браузер"
        WinGet, list2, List, %BrowserWinTitle%
        Loop, %list2%
        {
            thisH := list2%A_Index%
            WinGet, thisPid, PID, ahk_id %thisH%
            ppid := GetParentPid(thisPid)
            if (ppid = gBasPid)
                return thisH
        }
        return ""
    }
    
    ClickShowInBas() {
        global ShowLinkX, ShowLinkY
        GetBasSpec(basSpec)
        if (!WinExist(basSpec))
            return
        WinGet, bstate, MinMax, %basSpec%
        if (bstate = -1)
            WinRestore, %basSpec%
        WinActivate, %basSpec%
        Sleep, 120
        ControlClick, x%ShowLinkX% y%ShowLinkY%, %basSpec%, , , NA
    }
    
    TendBrowser(hwnd) {
        global AlwaysOnTopOn, BrowserOnMonitor
        if (!hwnd)
            return
        WinGet, st, MinMax, ahk_id %hwnd%
        if (st = -1)
            WinRestore, ahk_id %hwnd%
        if (AlwaysOnTopOn)
            WinSet, AlwaysOnTop, On, ahk_id %hwnd%
        if (BrowserOnMonitor)
            MoveWindowToMonitor(hwnd, BrowserOnMonitor)
    }
    
    ; ================= ОСНОВНОЙ ЦИКЛ =================
    WatchLoop:
    {
        global gBasHwnd, gBasPid, gBrowserHwnd, BasOnMonitor
    
        GetBasSpec(basSpec)
        if (!WinExist(basSpec)) {
            Initialize()
            return
        }
        if (!IsWindowValid(gBasHwnd))
            gBasHwnd := WinExist(basSpec)
    
        if (!gBasPid) {
            WinGet, gBasPid, PID, ahk_id %gBasHwnd%
            if (!gBasPid)
                return
        }
    
        if (BasOnMonitor && IsWindowValid(gBasHwnd))
            MoveWindowToMonitor(gBasHwnd, BasOnMonitor)
    
        if (IsWindowValid(gBrowserHwnd)) {
            TendBrowser(gBrowserHwnd)
            return
        }
    
        gBrowserHwnd := FindBrowserForThisBas()
        if (gBrowserHwnd) {
            TendBrowser(gBrowserHwnd)
            return
        }
    
        ClickShowInBas()
    
        Loop, 5
        {
            Sleep, 300
            gBrowserHwnd := FindBrowserForThisBas()
            if (gBrowserHwnd) {
                TendBrowser(gBrowserHwnd)
                break
            }
        }
    }
    return