项目背景:针对迁移全景图片到新的网站,又丢失了原图的情况,开发了这个脚本程序,依托全景下载大师自动下载全景图片并合成全景图。这个脚本的作用是减少了手动的操作,可以放置到云电脑自动运行。
下载全景软件前需要先导出所有需要下载的全景图片的表格,表格必须包含项目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 }
需要的软件
- 极速全景下载大师 https://www.cnblogs.com/reachteam/p/12511061.html
- autoHotkey https://www.autohotkey.com
- SciTE4AutoHotkey https://www.autohotkey.com/scite4ahk/
- shareX https://getsharex.com/
- tesseract github.com
- 八爪鱼