Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Создать список WEB-ссылок / запустить их в браузере 
Author Message
Loopback



PostPosted: Fri Nov 26, 2010 21:57    Post subject: Reply with quote

Ну вот, что получилось (пока в черновом варианте):

Пути к файлам, разумеется, нужно заменить своими.

Сохранение (создает файлик 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
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group