自动化操作极速全景下载大师初探

项目背景:针对迁移全景图片到新的网站,又丢失了原图的情况,开发了这个脚本程序,依托全景下载大师自动下载全景图片并合成全景图。这个脚本的作用是减少了手动的操作,可以放置到云电脑自动运行。

下载全景软件前需要先导出所有需要下载的全景图片的表格,表格必须包含项目id和下载链接两列。

然后编写ahk脚本,读取表格的数据,先创建以项目id为名称的文件夹,再把下载链接复制到全景下载大师,推荐开通会员,可以下载高清模式。右键选择高清模式下载,下载的过程中可以通过shareX截取下载软件窗口图片,再通过tesseract ocr识别图片的文本,图片包含完成相关信息的时候就读取下一行表格,这样就实现了自动化处理全景图片下载。

参考脚本

; 1. 启动全景下载大师
Run "D:\App\PanoDownloaderMaster\pdm.exe",,, &pdm_pid
Sleep 5000 ; 休眠5s
WinWaitActive("提示") ;弹窗标题
ControlClick("Button2") ;
Sleep(500)
Loop {
    aTitle := WinGetTitle("A")
    if InStr(aTitle, "专业版")
        break
    Sleep(500)
}
; 等待窗口创建
if WinWait(aTitle, , 3)
{
    ; OutputDebug 'process id debug ' pdm_pid
    ; MsgBox 'process id ' pdm_pid
    active_id := WinGetID(aTitle) ; 窗口id 不要关 否则获取不到
    ; MsgBox 'window id ' active_id
    ; 2. 打开Excel 文件
    excel := ComObject("Excel.Application")
    workbook := excel.Workbooks.Open("D:\work\dy\xxx.xlsx") ; https://learn.microsoft.com/zh-tw/office/vba/api/excel.workbooks.open
    ; 强制关闭受保护视图(如果触发)
    try {
        if (workbook.ProtectedViewWindow.Visible) {
            workbook.ProtectedViewWindow.Visible := false
        }
    }
    sheet := workbook.Sheets(1)
    row := 2
    baseDir := "D:\work\dy\pic"
    ; 3. 循环操作(复用已启动的软件窗口)
    Loop {
        dirName := sheet.Cells(row, 1).Value
        url := sheet.Cells(row, 7).Value
        if (dirName = "" || url = ""){
            break
        }else{
            ; MsgBox 'dirName' dirName
            ; MsgBox 'url' url
            if WinExist(aTitle){
                WinActivate ; 使用由 WinExist 找到的窗口
            }
            else{
                MsgBox "全景下载大师窗口未激活,请手动打开!"
                if WinWaitActive(aTitle, , 3)
                    MsgBox "全景下载大师窗口已激活!"
            }
            WinActivate(aTitle)
            WinWaitActive(aTitle)
            Sleep(200)
            CoordMode("Mouse", "Window") ; 鼠标坐标以窗口为参考
            MouseClick("left", 246, 146) ; 246, 146 是窗口内的相对坐标,用 Window Spy 工具获取
            Sleep(200)
            Send("{VK15}") ; 尝试切换到英文输入法(部分输入法支持)
            Sleep(200)
            Send("^a")      ; 全选
            Sleep(100)
            Send("{Del}")   ; 删除
            Sleep(100)
            A_Clipboard := url
            Sleep(100)
            Send("^v")      ; 粘贴内容
            Sleep(100)
            Send("{Enter}") ; 回车确认
            targetDir := baseDir "\" dirName
            if !DirExist(targetDir)
                DirCreate(targetDir)
            Sleep(10000) ;等 10s 加载
            WinGetPos(,, &winW, &winH, aTitle) ; 获取窗口宽高
            x := winW // 2                  ; 水平居中
            y := winH - 200                 ; 底部往上移200像素
            CoordMode("Mouse", "Window")
            MouseMove(x, y)
            Sleep(1000)
            MouseClick("right")             ; 右键点击
            Sleep(1000)
            Send("{Down}")                  ; 选中第一个选项
            Sleep(1000)
            Send("{Enter}")                 ; 确认
            Sleep(1000)
            WinWaitActive("选择文件夹")
            Sleep(500)
            Send("^a")
            Sleep(100)
            Send("{Del}")
            Sleep(100)
            A_Clipboard := targetDir
            Send("^v")
            Sleep(300)
            Send("{Enter}") ; 确认输入
            Sleep(1000)
            ControlClick("Button1","选择文件夹",,,2) ; 点击选择文件夹按钮
            Sleep(5000)
            WinClose("pic - 文件资源管理器")
            Sleep(3000)
            isWait := 0
            Loop {
                now := FormatTime(, "yyyy-MM")
                imgDir := "C:\Users\huawe\Documents\ShareX\Screenshots\" SubStr(now, 1, 4) "-" SubStr(now, 6, 2)
                FileDelete imgDir "\*.png"
                FileDelete imgDir "\*.jpg"
                FileDelete imgDir "\*.txt"
                Sleep(1000)
                WinActivate(aTitle)
                Sleep(1000)
                RunWait('D:\App\ShareX\ShareX.exe -ActiveWindow',,"Hide")
                Sleep(10000) ; 等待截图保存
                latestFile := ""
                Loop Files , imgDir "\*.jpg"
                    latestFile := imgDir "\" A_LoopFileName
                if latestFile = "" {
                    MsgBox("未找到截图文件!")
                    isWait := 1
                    break
                }else{
                    ; OCR 识别
                    txtFile := RegExReplace(latestFile, "\.(jpg|png)$", "")
                    RunWait('tesseract "' latestFile '" "' txtFile '" -l chi_sim',, "Hide")
                    ocrText := FileRead(txtFile ".txt","UTF-8")
                    MsgBox (ocrText)
                    if InStr(ocrText, "还原出的全景图保存在") {
                        break
                    }else{
                        if InStr(ocrText,"全部处理完成"){
                            break
                        }else{
                            if InStr(ocrText,"空闲"){
                                break
                            }else{
                                Sleep(60000) ;一分钟截图一次
                            }
                        }
                    }
                }
            }
            if(isWait = 1){
                Sleep(1200000)
            }
        }
        ; 后续操作...
        row++
    }
}
else
{
    MsgBox "WinWait timed out."
    ExitApp
}

需要的软件