Loopback
|
Posted: Fri Nov 26, 2010 21:57 Post subject: |
|
|
Ну вот, что получилось (пока в черновом варианте):
Пути к файлам, разумеется, нужно заменить своими.
Сохранение (создает файлик urllist.txt):
Code: |
If MsgBox(4 + 32, "Вопрос", "Будут закрыты все открытые браузеры. Продолжать?") = 7 Then Exit
Dim $nBrowserCount = 4
Dim $aResults[$nBrowserCount]
WinClose("[CLASS:OpWindow]")
While WinExists("[CLASS:OpWindow]")
Sleep(500)
Wend
$aResults[0] = _ParseTabList_Opera(@AppDataDir & "\Opera\Opera\sessions\autosave.win")
WinClose("[CLASS:TfrmBrowserMDIMain.Orca.UnicodeClass]")
While WinExists("[CLASS:TfrmBrowserMDIMain.Orca.UnicodeClass]")
Sleep(500)
Wend
$aResults[1] = _ParseTabList_Orca("2491128.opg") ; @AppDataDir & "\Orca Profiles\.default\reopen.dat"
WinClose("[CLASS:Chrome_WidgetWin_0]")
While WinExists("[CLASS:Chrome_WidgetWin_0]")
Sleep(500)
Wend
$aResults[2] = _ParseTabList_Iron(@UserProfileDir & "\Local Settings\Application Data\Chromium\User Data\Default\Current Tabs")
WinClose("[CLASS:KMeleon Browser Window]")
While WinExists("[CLASS:KMeleon Browser Window]")
Sleep(500)
Wend
$aResults[3] = _ParseTabList_KMeleon("prefs.js") ; @AppDataDir & "\K-Meleon\?????????.default\prefs.js
; уберем дубликаты
$sResult = ""
For $i = 0 To $nBrowserCount - 1
$aTemp = $aResults[$i]
For $j = 0 To UBound($aTemp) - 1
If $aTemp[$j] = "" Then ContinueLoop
If StringInStr($sResult, $aTemp[$j] & @CRLF) Then ContinueLoop
$sResult &= $aTemp[$j] & @CRLF
Next
Next
; сохраним URL-ы
$hFile = FileOpen("urllist.txt", 2)
FileWrite($hFile, $sResult)
FileClose($hFile)
Func _ParseTabList_Opera($sFile)
Local $nURLCount, $nCount = IniRead($sFile, "session", "window count", "0")
If $nCount = 0 Then Return ""
Local $aRet[$nCount-1]
For $i = 2 To $nCount
$nURLCount = IniRead($sFile, $i & "history url", "count", "0")
If $nURLCount = 0 Then ContinueLoop
$aRet[$i-2] = IniRead($sFile, $i & "history url", $nURLCount - 1, "")
Next
Return $aRet
EndFunc
Func _ParseTabList_Orca($sFile)
Local $hFile = FileOpen($sFile, 128) ; force UTF-8 reading
Local $aRet = StringRegExp(FileRead($hFile), "(?m)^(http://.+?)\r?$", 3)
FileClose($hFile)
Return $aRet
EndFunc
Func _ParseTabList_Iron($sFile)
Local $hFile = FileOpen($sFile, 16) ; force UTF-8 reading
$bData = FileRead($hFile)
$nProtoPos = StringInStr($bData, "687474703A2F2F")
Local $aTemp[10000] ; должно хватить :)
Local $nCount = 0
$pByte = DllStructCreate("byte[4]")
$pInt = DllStructCreate("uint", DllStructGetPtr($pByte))
While $nProtoPos > 0
DllStructSetData($pByte, 1, BinaryMid($bData, $nProtoPos / 2 - 4, 4))
$nURLSize = DllStructGetData($pInt, 1)
$bData = BinaryMid($bData, $nProtoPos / 2)
$aTemp[$nCount] = BinaryToString(BinaryMid($bData, 1, $nURLSize))
$bData = BinaryMid($bData, $nURLSize)
$nCount += 1
$nProtoPos = StringInStr($bData, "687474703A2F2F")
WEnd
FileClose($hFile)
If $nCount = 0 Then Return ""
ReDim $aTemp[$nCount]
; реализуем список исключений
Local $aRet[$nCount], $nNewCount = 0
Local $aExcList[1] = ["http://google.com"]
For $i = 0 To $nCount - 1
For $j = 0 To UBound($aExcList) - 1
If StringInStr($aTemp[$i], $aExcList[$j]) = 1 Then ContinueLoop(2)
Next
$aRet[$nNewCount] = $aTemp[$i]
$nNewCount += 1
Next
ReDim $aRet[$nNewCount]
Return $aRet
EndFunc
Func _ParseTabList_KMeleon($sFile)
Local $sText = FileRead($sFile)
Local $sURLs = ""
Local $nWindowCount = StringRegExpReplace($sText, '(?s).+kmeleon.plugins.sessions2.Last\sSession.count",\s?(\d+).+', "\1")
For $i = 0 To $nWindowCount - 1
$nTabCount = StringRegExpReplace($sText, '(?s).+kmeleon.plugins.sessions2.Last\sSession.window' & $i & '.count",\s?(\d+).+', "\1")
For $j = 0 To $nTabCount - 1
$sCurTab = StringRegExpReplace($sText, '(?s).+kmeleon.plugins.sessions2.Last\sSession.window' & $i & '.tab' & $j & '",\s?"(.+?)".+', "\1")
$aCurTab = StringSplit($sCurTab, @TAB)
If $aCurTab[0] >= 5 Then $sURLs &= $aCurTab[5] & @LF
Next
Next
Return StringSplit(StringTrimRight($sURLs, 1), @LF, 2)
EndFunc
|
Запуск всего из файлика urllist.txt в дефолтном браузере:
Code: |
$aURL = StringSplit(FileRead("urllist.txt"), @LF)
For $i = 1 To $aURL[0]
If $aURL[$i] <> "" Then ShellExecute($aURL[$i])
Next
|
Парсер Iron-a сделан "в лоб", без разбора структуры, гарантий надежности работы нет, но вроде работает.
Для Orca у меня файла "reopen.dat" не было, зато был некий "2491128.opg". Похоже, его имя генерится случайно.
А вот с K-Melion что-то у меня не сложилось - не сохраняет он у меня вкладки, предлагает только закрыть. Соответственно, нет образца, с которого делать. Просмотр настроек ничего не дал, вроде за это должен отвечать плагин Sessions, он у меня включен, но - см. выше.
Last edited by Loopback on Tue Nov 30, 2010 12:57; edited 6 times in total |
|