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