Что нового

[Сеть, интернет] Opera History - управление сессиями браузера.

erlik

Продвинутый
Сообщения
317
Репутация
84
AutoIt: 3.3.8.1
Версия: 1.2 от 07.01.2014

Категория: Автоматизация, Интернет
Описание:
OperaHistory - инструмент для управления сессиями браузера Opera.
Лично меня встроенный в Оперу механизм управления сессиями не устроил, поэтому решил сделать по своему.

Итак, что программа умеет:
1. Может сохранить пользовательскую сессию в любой момент времени как из окна самой программы, так и по горячим клавишам или из меню трея.
2. Может пересохранить сессии сохраненные непосредственно в Опере в свой файл сессий.
3. Может удалить любую ненужную сессию сохраненную как программой так и браузером.
4. Может загрузить любую выбранную сессию.
5. Может отобразить вашу историю 'хождений' по инету.
6. Сохранить конфигурационный файлы браузера Opera.

При старте программа сворачивается в трей и ждет ваших указаний.
Ctrl+F1 - отобразить окно программы. (или двойное нажатие Shift - если будет мешать, то можно отключить)
Ctrl+F2 - сохранить сессию с именем по умолчанию.
Ctrl+F3 - сохранить сессию с пользовательским названием.

Двойной клик LMouseButton на строке с url - открывает ссылку в Oper'е .
Клик по любому заголовку - снимает или устанавливает чекбоксы.

Нажатие на крестик (закрыть окно) сворачивает программу в трей. Выход из программы - по кнопке, хоткею Ctrl+Alt+E, либо из меню трея.

Вкладка 'Последняя сессия' отображает содержимое файла autosave.win в котором Опера сохраняет последнюю использованную сессию - то есть она же и есть текущая сессия. Опера обновляет файл практически сразу же как вы что-либо откроете, но иногда может это сделать и не сразу.

Программа по умолчанию апдейтит содержимое своих списков (но не всех) на каждую активизацию из трея.

Файл: исходник+exe

Снимок:


История версий:
1.0 - первая версия
1.1 - вторая версия
+добавлены настройки и прочие мелочи
1.2 - третья версия
+мелкие исправления

Источник: autoit-script.ru
Автор(ы):
Erlik (aka Garry Galler)

Благодарности: CreatoR за библиотеку Opera.au3 и AZJIO за _HotKeyString_To_AutoitCode.au3

PS: Opera Presto, к сожалению, больше не поддерживается разработчиками, поэтому эта программа последняя дань уважаемому мной браузеру версии 12.16 (билд 1860), которым продолжаю пользоваться до сих пор... Opera Next - продукт спорный, и пока желания перейти на него не вызвал.
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
erlik сказал(а):
В коде вы найдете немало 'велосипедов', которые есть в UDF - просто не хотел сильно раздувать размер программы (которая к тому же должно висеть в памяти), включая в нее сторонние библиотеки
Если использовать обфускатор с правильными командами, то он включит в компиляцию только те функции, которые используются, а не весь UDF. Этот автоматизм позволяет избавится от проблем выковыривания функций и констант из UDF ради компактности. А ключ /om автоматически переименовывает все переменные на сгенерированные, начиная с $a и по алфавиту, то есть наикомпактнейше.
Код:
#AutoIt3Wrapper_Run_Obfuscator=y
#Obfuscator_Parameters=/sf /sv /om /cs=0 /cn=0
#AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_Obfuscated.au3"


Можно зарегистрировать WM_GETMINMAXINFO, в справке есть описание и пример.

Есть ли возможность сохранить сессию в файл? У меня Opera плохо работает, я подозреваю некорректное обновление. Хочу переустановить с полным удалением. Чтобы восстановить сессию посмотрел в меню есть импорт/экспорт, но делает это внутри своей инсталяции, поэтому после удаления всё потеряю. Хотелось бы иметь файл сессии, чтобы импортировать после установки. Открыто 30 вкладок, можно было бы скопировать ссылки и открыть, но лень. В "Mozilla Firefox" это есть бэкап настроек.


Добавлено:
Сообщение автоматически объединено:

erlik [?]
Да, вот еще: контекстное меню Tree на данный момент работает стандартно (то есть не очень корректно) - перед тем как его вызывать правой кнопкой мыши, нужно выделить элемент левой кнопкой мыши - иначе выделенным будет считаться предыдущий элемент и действие будет применено именно к нему
_GUICtrlTreeView_HitTestItem вернёт то что под курсором, если что посмотри в Registry Manager
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
Переазалил архив - внес недостающие строчки в недоделанный код лимита сохраняемых сессий.
------------------------------------------
AZJIO
Обфускатором ни разу не пользовался - надо будет попробовать.
Насчет
Код:
_GUICtrlTreeView_HitTestItem
это я в курсе - уже использовал, но просто не хотел включать в данный скрипт лишние UDF.
---------------------------------------------------------
Сессия (через мою программу) в отдельный файл и сохраняется - в папке скрипта. Потом можно ее открыть в опере через мою программу. А сама опера сохраняет последнюю сессию в файле 'профиль\opera\opera\sessions\autosave.win, а сохраненные сессии - под именем 'профиль\opera\opera\sessions\opera.win'. Можешь их просто скопировать. Сами файлы - обычные текстовики.
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
erlik
Горячие клавиши можно сохранять в текстовом виде в INI

Код:
; ============================================================================================
; Имя функции ...: _HotKeyString_To_AutoitCode
; Описание ........: Преобразует текстовый формат записи горячей клавиши в формат функции HotKeySet в Autoit3
; Синтаксис.......: _HotKeyString_To_AutoitCode ( $sKey )
; Параметры:
;				$sKey - текстовый формат записи горячей клавиши, например "Ctrl + s"
; Возвращаемое значение: Успешно - Возвращает строку в формате функции HotKeySet в Autoit3, например "^s"
;				Неудачно - пустая строка, @error:
;						|1 - передана пустая строка
;						|2 - с модификатороми используется более чем одна клавиша
;						|3 - один и тот же модификатор используется более чем один раз
; Автор ..........: AZJIO
; Примечания ..: Преобразует строку типа "Ctrl + a" в вид "^a", последнее является стандартным обозначением модификаторов в Autoit. Это предназначено для чтения горячих клавиш из ini-файла, в котором они записаны в привычном формате. Проверка ошибок позволяет выявить правильность записи горячей клавиши.
; ============================================================================================
Func _HotKeyString_To_AutoitCode($sKey)
	Local $ch, $k
	If $sKey = '' Then Return SetError(1, 0, '')
	$sKey = '{' & StringRegExpReplace(StringStripWS($sKey, 8), '(?<!\+)\+', '}{') & '}' ; удаляем пробелы, используем "+" как разделитель
	If StringRight($sKey, 3) = '}{}' Then $sKey = StringTrimRight($sKey, 2) ; если заканчивается разделителем справа, вместо клавиши
	If StringLeft($sKey, 3) = '{}{' Then $sKey = StringTrimLeft($sKey, 2) ; если заканчивается разделителем слева, вместо клавиши
	$sKey = StringRegExpReplace($sKey, '\{([^!+^#{}])\}', '\1') ; если не метасимволы то убираем обрамляющие фигурные скобки
	
	; Создаёт строку модификаторов
	Local $sMod = ''
	$aMod = StringRegExp($sKey, '(\{(?:Alt|Shift|Ctrl|Win)\})', 3) ; извлекает модификаторы
	If Not @error Then
		For $i = 0 To UBound($aMod) - 1
			$sMod &= $aMod[$i]
		Next
		$sMod = StringReplace($sMod, '{Alt}', '!')
		If @extended > 1 Then Return SetError(3, 0, '')
		$sMod = StringReplace($sMod, '{Shift}', '+')
		If @extended > 1 Then Return SetError(3, 0, '')
		$sMod = StringReplace($sMod, '{Ctrl}', '^')
		If @extended > 1 Then Return SetError(3, 0, '')
		$sMod = StringReplace($sMod, '{Win}', '#')
		If @extended > 1 Then Return SetError(3, 0, '')
	EndIf
	; проверка наличие только одной клавиши в сочетании с модификаторами
	$sKey = StringRegExpReplace($sKey, '\{Alt\}|\{Shift\}|\{Ctrl\}|\{Win\}', '') ; удаляем модификаторы
	$ch = StringRegExpReplace($sKey, '\{.*?\}', '') ; подсчитываем элементы обрамлённые фигурными скобками
	$k = @extended
	$k += StringLen($ch) ; добавляем количество символов без фигурных скобок
	If $k <> 1 Then Return SetError(2, 0, '') ; возвращает пустую строку при ошибке
	Return $sMod & $sKey
EndFunc   ;==>_HotKeyString_To_AutoitCode

А зачем регистрировать клавиши глобально? Не лучше ли использовать GUISetAccelerators? Тогда будут работать только когда окно активно и не конфликтовать с другими программами.

При выборе в дереве TreeView создание пунктов в ListView сопровождается мерцанием. Можно использовать _GUICtrlListView_BeginUpdate и _GUICtrlListView_EndUpdate, чтобы приостановить перерисовку.

Если кнопки имеют идентификаторы хранящиеся в массиве, то зачем в SetActionsSaveLoad идентификация выполняется по тексту?

Универсальные независимые функции, например _WinAPI_LoadKeyboardLayoutEx можно вынести в отдельный файл и подключить его с помощью #include, так намного проще юзать скрипт.
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
AZJIO
Вместо
Код:
_GUICtrlListView_BeginUpdate и _GUICtrlListView_EndUpdate
я использовал во вкладке История
Код:
_SendMessage($hLV_History,0x000B) и _SendMessage($hLV_History, 0x000B, 1).

Это их аналоги - однако мерцание так и осталось.
--------------------------------------------------
А зачем регистрировать клавиши глобально? Не лучше ли использовать GUISetAccelerators?
А оно у меня не заработало. Я решил, что акселераторы не пашут для скрытых окон(а мне нужно было именно, чтобы хоткеи работали и для скрытого окна). Разве нет?
--------------------------------------------------------------------------------
Если кнопки имеют идентификаторы хранящиеся в массиве, то зачем в SetActionsSaveLoad идентификация выполняется по тексту?
Так у меня кнопок - кол-во ограниченное (4 штуки), а действий на них повешено больше - поэтому кнопки динамически (в зависимости от открытой вкладки Tab ) меняют свой текст и работают уже для другого действия.
-----------------------------------------------------------------------------------
_HotKeyString_To_AutoitCode - хороший код, возможно применю. Спасибо.
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
erlik
FileReadLine не рекомендуется использовать с номером строки. В таком случае чтение файла начинается каждый раз от начала файла. Лучше сделать 4 холостых вызова если требуется пропустить 4 строки, потому что чтение будет по указателю в файле от текущей позиции.

однако мерцание так и осталось.
а если предположить что эти строки не работают?
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
AZJIO
а если предположить что эти строки не работают?
Предположить, конечно можно. НО это действительно тоже самое - сам сравни с кодом из UDF. Завтра так и быть попробую использовать чистый вызов этих методов из UDF. Сейчас уже лень пробовать.

FileReadLine не рекомендуется использовать с номером строки
Это понятно. Просто иного способа прочитать файл блоками по 4 строки я не нашел. А так как блоки нефиксированного размера читать побайтово никак.
Насчет четырех холостых вызовов не понял - там же нужно читать именно по 4 строки и получать значение каждой считанной строки.
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
а мне нужно было именно, чтобы хоткеи работали и для скрытого окна). Разве нет?
Хозяин барин конечно, но если все программы будут каждую кнопку регистрировать глобально, то вряд ли останется чего либо вообще свободного. К примеру можно вызвать окно потом горячую клавишу сохранения. Другое дело если программа работает со сторонними окнами, когда невозможно по другому, например переводчик по горячей клавише захватывает текст с активного приложения - тут ни как не избавиться.

Вместо _Encoding_CyrillicTo1251 попробуй _WinAPI_MultiByteToWideChar, она быстрее. Проще открыть файл, перекодировать его весь одним проходом, потом отправить в массив и обрабатывать не построчно а по индексам массива.
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
AZJIO
К примеру можно вызвать окно потом горячую клавишу сохранения
Можно, но мне хотелось, чтобы действий было как можно меньше - в этом как бы главная суть автоматизации. Но, не спорю - глобально ты прав.

Код:
_WinAPI_MultiByteToWideChar
не катит - вообще текст не отображается. Неправильно вызвал - текст отображается, но неправильно.
Я перепробовал кучу функций для декодирования - и приемлимый результат дала только
Код:
_Encoding_CyrillicTo1251
- потому что она декодирует только тогда когда это требуется, иначе - возвращает исходный текст. Со всеми прочими функциями был полный разброд - один русский текст декодировался нормально, другой - нет. Опера сохраняет свои данные в какой то странной кодировке - я так и не понял ее сути.
---------------------------------------------
Проще открыть файл, перекодировать его весь одним проходом, потом отправить в массив и обрабатывать не построчно а по индексам массива
Вот это попробую.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Не находит файл сеансов.
Может всё таки стоит воспользоваться готовыми библиотеками? :whistle:
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
CreatoR
Я бы с удовольствием :smile: В Opera.au3 я первым делом и заглянул. Но не нашел в ней ни _OperaGetSession, ни _OperaGetHistory. Пришлось писать самому. А еще не помешали бы _OperaGetPlugins, OperaGetDownloads, OperaGetHistorySearch, OperaGetCach, OperaGetBookmarks (то есть получение именно массивов данных, а не директорий расположения). (Ну про _OperaGetPasswords - промолчу ;)) Без этих функций - ну это только мое ИМХО - твоя UDF не совсем полнофункциональна.(это, впрочем, нисколько не умаляет полезности прочих включенных в нее функций, но, как сам видишь, при попытке использовать ее для реального приложения - их оказалось недостаточно). А только из-за _OperaGetProfileDir я не стал ее включать в скрипт (что ж - добавить никогда не поздно :smile:). Тем более, что полагал, что расположение профиля у всех стандартное. Да и в проге предусмотрена возможность указать свой путь до профиля в ini файле.
А у тебя по какому пути располагается папка сессий 'opera\opera\sessions' ?


Добавлено:
Сообщение автоматически объединено:


Кстати - в функции _OperaGetDir (из Opera.au3) опечатка в определении пути
HKEY_CLASSES_ROOT\Application\Opera.exe\shell\open\command - такого раздела не существует(по крайней мере в XP), но есть раздел Applications.
--------------------------------------------------------------------------------
В общем добавлю попозже более точное определение пути до профиля оперы.
И еще - код, где проверяется лимит сохраненных сессий пока все таки не доделан. Поэтому, если вы собираетесь сохранять более 100 сессий - установите этот лимит (параметр MaxCountSession ) в большеее число, либо в -1 (бесконечно), иначе после 100 сессий там не все правильно будет работать.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
erlik [?]
не нашел в ней ни _OperaGetSession, ни _OperaGetHistory
Я имел в виду что эту библиотеку можно использовать чтобы корректно определить путь к папке профиля, и уже оттуда получить файл сеансов.

не помешали бы _OperaGetPlugins
Есть _OperaGetPluginsDir.

Не сложно написать:
Код:
Func _OperaGetDownloadsDir($sOpDir = -1)
	If $sOpDir = -1 Then $sOpDir = _OperaGetDir()
	If Not __Opera_PathIsOperaDir($sOpDir) Then Return SetError(1, 0, "")
	
	Local $sOpProfileDir1 = _OperaGetProfileDir($sOpDir, @AppDataDir)
	If @error Then Return SetError(1, 0, "")
	
	Local $sOpProfileDir2 = _OperaGetProfileDir($sOpDir, __Opera_GetLocalSettingsPath())
	
	Local $sOperaPrefs_FileName = __Opera_GetOperaPrefsFileName($sOpDir, 0)
	Local $sOpDownloadsDir = IniRead($sOpProfileDir1 & "\" & $sOperaPrefs_FileName, "User Prefs", "Download Directory", "")
	
	__Opera_Correct_Opera_Path($sOpDownloadsDir, $sOpDir, $sOpProfileDir1, $sOpProfileDir2)
	
	If Not __Opera_PathIsFolder($sOpDownloadsDir) Then $sOpDownloadsDir = _PathFull($sOpDownloadsDir, $sOpDir)
	If Not __Opera_PathIsFolder($sOpDownloadsDir) Then Return SetError(2, 0, "")
	
	Return $sOpDownloadsDir
EndFunc


Есть _OperaGetCacheDir.

Есть _OperaGetBookmarksFile.

получение именно массивов данных, а не директорий расположения
Это уже забота пользователя, что далее делать с файлами.

при попытке использовать ее для реального приложения - их оказалось недостаточно
Ну, ещё наверное зависит от того как использовать, и насколько знания позволяют это делать.

у тебя по какому пути располагается папка сессий 'opera\opera\sessions' ?
У меня стоят около 10-ти разных версии оперы, часть из них установлены как портабельные, часть как многопользовательские, пути везде разные, а с библиотекой их не сложно вычислить.

в функции _OperaGetDir (из Opera.au3) опечатка в определении пути
HKEY_CLASSES_ROOT\Application\Opera.exe\shell\open\command - такого раздела не существует
У тебя какая версия библиотеки?
Последняя это 1.06, там нет такого.
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
erlik
Я обновил _HotKeyString_To_AutoitCode и добавил её в справку CustomUDFs.chm, теперь там больше проверок на ошибки.

Переустановил Opera, глюки остались.
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
CreatoR
_OperaGetProfileDir() я уже добавил. Насчет доп. функций я все таки имел ввиду НЕ получение директории расположения, а готового массива распарсенных данных (закладок, url'ов истории поиска, загрузок,сохраненных данных кэша - файл+тип контента_время модификации+размер) для дальнейших пользовательских манипуляций - вставки в GUI, запись в файл и т.д. Просто их наличие было бы весьма удобно.

... А библиотека у меня получается не сама последняя - 1.4. Хотя качал вроде отсюда.

ещё наверное зависит от того как использовать, и насколько знания позволяют это делать
Вот здесь спорить не будем. Знаний у меня хватает - а когда не хватает, я просто иду в магазин за новыми. И так всю жизнь.
-----------------------------------------------------------------------------------------
AZJIO
Окей. Собираюсьэту функцию включить в скрипт. Да вот еще - спасибо за подсказку с обфускатором - даже со включенной либой от CreatoR'а размер получился всего 300 кб. :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
erlik [?]
их наличие было бы весьма удобно
А также добавило бы кучу проблем не совместимости с разными версиями браузеров.
К тому же по своей сути, библиотека (любая) не должна уметь получать все подробности, она должна предоставлять функции для упрощения выполнения рутинных задач.
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
Перезалил архив. Версия осталась та же.
Для определения пути до профиля пользователя теперь используются функции из UDF Opera.au3.
Исправил поведение контекстного меню TreeView на нормальное.
Добавил _HotKeyString_To_AutoitCode для более простого назначения горячих клавиш в ini-файле.
Подправил разные мелочи. Пока все. Дополнительные плюшки буду добавлять позже.
-----------------------------------------------------------------------
... Эх, только выложил, а CreatoR оказывается либу обновил до 1.7. :scratch:
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
Вот незадача. Оказывается на Windows 7 файл текущей сессии называется не autosave.win, а autopera.win. (Смотреть справка->О программе - пути:Сохранённый сеанс:smile:. По, крайней мере, на версии 12.10. У кого-нить еще так же? Поэтому программа его не видит. Будем исправлять.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
erlik [?]
на Windows 7 файл текущей сессии называется не autosave.win, а autopera.win
Нет такого.
Этот файл может называться хоть вася.win, его пользователь может задать из настроек opera:config.
Используй функцию _OperaGetSessionFiles из новой версии библиотеки, там первый элемент возвращаемого массива это используемый файл автосохранения сеанса.
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
Обновил программу (ну да полгода спустя, но просто не до форума было)... Жаль только браузера, для которого ее писал больше нет.
 
Верх