Создать список WEB-ссылок / запустить их в браузере

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Ну в общем действительно, процесс пошел :)

Форматы Оперы, Orca и хамелеона совсем простые, вечером набросаю парсеры. C JSON надо смотреть, вроде была готовая библиотека парсинга.

Единственное что не понял:
MVV писал(а):Но юзер может использовать и не сеанс по умолчанию, тогда имя файла может быть не autosave.win.
Что подразумевается под "не сеанс по умолчанию"?
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Loopback писал(а):Единственное что не понял:
MVV писал(а):Но юзер может использовать и не сеанс по умолчанию, тогда имя файла может быть не autosave.win.
Что подразумевается под "не сеанс по умолчанию"?
М.б. MVV о профиле? Тогда autosave.win будет располагаться не в папке по умолчанию.
Но autosave.win всегда будет автосохранением текущей сессии, не важно как сессия названа.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Это хорошо, если при любом сеансе копия последнего будет в autosave.win - я не проверял это.

И как-нибудь надо путь к профилям передавать наверное скриптам.
Samwatas
Сообщения: 95
Зарегистрирован: Сб сен 12, 2009 20:26

Сообщение Samwatas »

Немного инфы по смежной тематике - http://en.wikipedia.org/wiki/Comparison ... chronizers
Если бы ТС ограничился только файрфоксом, то дополнение Firefox Sync
могло бы полностью решить все проблемы
Free browser add-on that lets you stay in sync with your Firefox. Access your history, passwords, bookmarks and even open tabs across all your devices.
Иначе имеет смысл остановиться на xmarks
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

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

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

Сохранение (создает файлик urllist.txt):

Код: Выделить всё

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 в дефолтном браузере:

Код: Выделить всё

$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, он у меня включен, но - см. выше.
Последний раз редактировалось Loopback Вт ноя 30, 2010 11:57, всего редактировалось 6 раз.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Loopback
С Orca и Iron результат нулевой. Для Orca я даже вышеописанные файлы найти не могу. С Оперой работает.
Но запуск производится с открытием каталога в проводнике, где лежит скрипт.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

У вас вообще при закрытии Орки сохраняются вкладки? Если нет, включите. Имя файла reopen.dat далеко не случайное - т.е. меняться вряд ли будет.
Flasher писал(а):Но запуск производится с открытием каталога в проводнике, где лежит скрипт.
Видимо, одна из строк пуста или содержит лишь точку - в этом случае вызов функции запуска может открыть текущую папку.

Кстати, я бы запускал не просто ссылки, а нужный браузер со ссылкой в параметре.
А вот с K-Melion что-то у меня не сложилось - не сохраняет он у меня вкладки, предлагает только закрыть.
Плагины я вообще не смотрел, а только зашел в настройки - и нашел возможность открывать последние вкладки при запуске.

И на 7 винде надо проверить, где папка профиля хранится. А то некоторые в C:\Users\<Юзер>\AppData\Local, а некоторые - в C:\Users\<Юзер>\AppData\Roaming. У Оперы кажется по умолчанию вообще профиль на 2 части разбит - в одном месте настройки, в другом - история и прочий хлам, или типа того.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

MVV писал(а):У вас вообще при закрытии Орки сохраняются вкладки?
Ты имеешь в виду, появляются ли предыдущие вкладки с перезапуском? Да.
MVV писал(а):Видимо, одна из строк пуста
Да, почему-то добавляется пустая строка.
MVV писал(а):Кстати, я бы запускал не просто ссылки, а нужный браузер со ссылкой в параметре.
Было бы неплохо, хоть в техзадании я и говорил о дефолтном.
MVV писал(а):И на 7 винде надо проверить, где папка профиля хранится.
Ну, Loopback изначально предупредил, что пути нужно изменить на правильные, я с этого, собственно, и начал.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Значит так, посмотрел куда в Orca записываются текущие ссылки:
"%APPDATA%\Orca Profiles\.default\2230202.opg"
"%APPDATA%\Orca Profiles\.default\mozdata\UserData\Cache\_CACHE_001_"
"%APPDATA%\Orca Profiles\.default\mozdata\UserData\places.sqlite"

Т.е. как можно заметить файл opg в имени имеет рандомные семизначные числа. Но после изменения имени в скрипте ничего в лучшую сторону не изменилось.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Flasher
Запуск пустых строк поправил.

Запуск в нужном браузере - нужно просто поменять команду ShellExecute(...) на Run("path\to\browser\browser.exe " & $aURL[$i]) - если браузер просто принимает ссылки как параметр.
MVV писал(а):Имя файла reopen.dat далеко не случайное - т.е. меняться вряд ли будет.
Мдя, программеры этого браузера оригиналы. В общем, если закрывать крестиком - то да, выдается запрос, и вкладки сохраняются в reopen.dat, а если закрыть его двойным кликом по иконке системного меню или Alt+F4 - то сохраняется без запроса в файл со случайным именем и расширением opg. Вот так.
MVV писал(а):Плагины я вообще не смотрел, а только зашел в настройки - и нашел возможность открывать последние вкладки при запуске.
Всё понятно, скачал какую-то бету 1.6.0, в ней ничего в файл не сохраняется. В 1.5.4 работает - вроде, но как-то невразумительно. Имхо, вообще какой-то невнятный браузер.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Loopback писал(а):Запуск в нужном браузере - нужно просто поменять команду ShellExecute(...) на Run("path\to\browser\browser.exe " & $aURL[$i]) - если браузер просто принимает ссылки как параметр.
Понял. Спасибо.
Loopback писал(а):В общем, если закрывать крестиком - то да, выдается запрос, и вкладки сохраняются в reopen.dat,
Если галка предварительно не была снята.
Loopback писал(а):Имхо, вообще какой-то невнятный браузер.
Над ним работает малочисленная команда разработчиков-энтузиастов, раскиданных по всей Европе. Да, есть недостатки(и все они описаны), но достоинств, ИМХО, значительно больше.
Кстати, тестировать желательно с этой сборкой.

Также есть такой негативный момент: если Опера закрыта, то ссылки всё равно сохраняются.

Так что с сохранением делать будем?
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Flasher писал(а): Да, есть недостатки(и все они описаны), но достоинств, ИМХО, значительно больше.
Охотно верю, но первое впечатление - над интуитивностью интерфейса им бы стоило поработать. Для меня совсем было неочевидно, что если программа спрашивает "Закрыть все вкладки?" - это еще не конец, и при определенных настройках они будут открываться при следующем запуске. Но даже при сделанных настройках вопрос о закрытии все равно зачем-то задается.
Впрочем, это уже лирика. Главное что файл я все-таки получил :)
Flasher писал(а):Также есть такой негативный момент: если Опера закрыта, то ссылки всё равно сохраняются.
Естественно, файл-то существует. Это будет и с остальными браузерами.
Flasher писал(а):Так что с сохранением делать будем?
В смысле?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Loopback писал(а):Главное что файл я все-таки получил :)
Ещё бы его распарсить. :)
Loopback писал(а):Естественно, файл-то существует. Это будет и с остальными браузерами.
Хм. Ну тогда это не удовлетворяет ТЗ. Ты же можешь проверять текущие процессы и задать условия выполнения функций?
Loopback писал(а):В смысле?
Ну пишу же, что в двух браузерах не работает.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Flasher писал(а):Ещё бы его распарсить.
Распарсим.
Flasher писал(а):Хм. Ну тогда это не удовлетворяет ТЗ. Ты же можешь проверять текущие процессы и задать условия выполнения функций?
Ну можно проверять наличие окна браузера или его процесса. Имеет смысл, только если запущено по одной копии каждого браузера.

И еще надо думать, как быть с путями. Если браузер установлен по-умолчанию, тут еще как-то можно попробовать найти нужные файлы, с портабельными версиями это не прокатит.
Flasher писал(а):Ну пишу же, что в двух браузерах не работает.
У меня работает, иначе бы не выкладывал. Высылай свои файлы (чтобы в них хотя бы три-четыре вкладки было), завтра проверю.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Loopback писал(а):Ну можно проверять наличие окна браузера или его процесса. Имеет смысл, только если запущено по одной копии каждого браузера.
Насчёт копий не волнуйся, по несколько мне запускать не требуется. А K-Meleon так вообще всегда под одним процессом работает, две копии даже из разных источников запустить не удастся.
Loopback писал(а):Если браузер установлен по-умолчанию, тут еще как-то можно попробовать найти нужные файлы, с портабельными версиями это не прокатит.
Не понял мысль. Браузер по умолчанию может быть только один. И какая разница к каким файлам прописывать пути? Почему не прокатит?
Loopback писал(а):Мдя, программеры этого браузера оригиналы. В общем, если закрывать крестиком - то да, выдается запрос, и вкладки сохраняются в reopen.dat, а если закрыть его двойным кликом по иконке системного меню или Alt+F4 - то сохраняется без запроса в файл со случайным именем и расширением opg. Вот так.
Я тут отловил другой алгоритм. reopen.dat - это временный файл, который живёт до первого открытия браузера, соответственно парсить его можно только когда Орка зактрыт. С opg ровно наоборот. Он записывает текущие ссылки в открытом браузере. Аналогичное поведение и с файлами Current Tabs/Session в профайле Iron. Только они не удаляются, а очищаются при открытии. Т.е. получается, что со всеми браузерами имеет смысл работать, только когда они закрыты. Посему добавляем в сценарий закрытие всех браузеров перед парсингом.

Но пока так и не удалось вытащить ссылки из Орки и Айрона с учётом вышеописанного. Даже пути прописал полные для точности:

Код: Выделить всё

$aResults[1] = _ParseTabList_Orca("*.opg") ; "c:\Users\Flasher\AppData\Roaming\Orca Profiles\.default\reopen.dat"
$aResults[2] = _ParseTabList_Iron("Last Tabs") ; "c:\Users\Flasher\AppData\Local\Chromium\User Data\Default\Last Tabs"
Ответить