MozRepl

Jun 04, 2015 22:55


Итак, если ваш стиль работы подразумевает (почти) постоянно запущенный браузер, рано или поздно вам захочется что-нибудь в нём автоматизировать. Для многих вещей это можно сделать разными addon'ами, но нет в мире совершенства - если вам нужно передать в настройки браузера информацию "извне" вы можете не найти подходящего решения. Тут-то и приходит желание получить какой-нибудь интерфейс "удалённого" (в смысле IPC) управления браузером.

Сейчас я рассмотрю только один вариант такой автоматизации - расширение MozRepl для Firefox и родственных браузеров.
Способы использования
  1. Передать полный скрипт при подключении.
  2. Вставить в mozrepl определение сколь угодно сложной функции и вызывать при подключении её.
Примеры использования
FoxyProxy

Предположим, вы используете FoxyProxy и у вас есть одно или несколько настроек прокси, зависящих от внешних условий.

Например:
  • работа программ создающих тоннели (ssh/tor/...),
  • определённая среда выполнения (под виртуальной машиной),
  • определённое сетевое окружение (на работе за прокси).

Соответственно, вы пишете скрипт который как-то получает событие. Это может быть периодически запускаемая проверка доступности или обработчик какого-нибудь события (например WMI).

Допустим, реакцией на это событие вы хотите отключить или подключить настройку прокси в браузере. Тогда можно воспользоваться следующим примером. Этот скрипт меняет статус заданного в качестве переменной соединения:

#!/bin/bash python=python2 moz_profile="$(cygpath -u $APPDATA)/Mozilla/Firefox/Profiles/"*.default mozrepl_port=4242 mozfp_name=Tor mozfp_enable=true check_only=false [[ $1 == -d ]] && mozfp_enable=false [[ $1 == -g ]] && check_only=true function die() { if [[ $# -gt 1 ]] ; then echo "tor_switch.sh: die: $*" >&2 fi exit 1 } if ! $check_only ; then flock -w 5 "$moz_profile/parent.lock" -c " $python -c 'from xml.dom import minidom;import sys;sys.stderr.write(\"Changing foxyproxy.xml...\\n\");doc=minidom.parse(\"$moz_profile/foxyproxy.xml\");[elem.setAttribute(\"enabled\",\"$mozfp_enable\") for elem in doc.getElementsByTagName(\"proxy\") if elem.getAttribute(\"name\")==\"$mozfp_name\"];doc.writexml(open(\"$moz_profile/foxyproxy.xml\",\"w\"),encoding=\"UTF-8\")' "||( echo Using mozrepl >&2 cat >/dev/tcp/127.0.0.1/$mozrepl_port < Components.classes["@leahscape.org/foxyproxy/proxyconfigs;1"].getService().getAll().forEach(function(cfg){if(cfg.name=="$mozfp_name")cfg.enabled=$mozfp_enable;}); EOD ) sleep 1s fi $python -c "from xml.dom import minidom;import sys;doc=minidom.parse('$moz_profile/foxyproxy.xml');l=[elem.getAttribute('enabled') for elem in doc.getElementsByTagName('proxy') if elem.getAttribute('name')=='$mozfp_name'];sys.exit(l[0].lower()!='true')" el=$? echo "tor_switch.sh: foxyproxy.xml:$mozfp_name:$el" >&2 exit $el Close Current Tab

Представим себе гипотетическую ситуацию, что вы открыли несколько вкладок на прочтение, а потом уехали куда-нибудь, где к домашнему компьютеру у вас доступ настолько медленный, что реально работать только в терминале. Тогда вы смотрите текущую вкладку, открываете её в локальном браузере, читаете и закрываете и локально и на удалённом компе. И так, пока не кончатся вкладки на прочтение.

Этот пример использует вспомогательную утилиту mozsessiontool.py:

#!/bin/bash python=python2 moz_profile="$(cygpath -u $APPDATA)/Mozilla/Firefox/Profiles/"*.default mozrepl_port=4242 check_only=false [[ $1 == -g ]] && check_only=true function die() { if [[ $# -gt 1 ]] ; then echo "tclose.sh: die: $*" >&2 fi exit 1 } if $check_only ; then $python mozsessiontool.py $moz_profile/sessionstore-backups/recovery.js else flock -w 5 "$moz_profile/parent.lock" -c " $python mozsessiontool.py --tclose $moz_profile/sessionstore-backups/recovery.js "||( echo Using mozrepl >&2 cat >/dev/tcp/127.0.0.1/$mozrepl_port < content.window.close(); EOD ) fi Советы
  • Для защиты от попыток внешнего управления, а так же конфликта портов разных профилей/пользователей, советую изменить порт по умолчанию (4242) на какой-нибудь другой (разный для разных машин, пользователей и профилей). Однако для наглядности, во всех скриптах-примерах я использую именно порт по умолчанию - для запуска измените его.
  • Чтобы была возможность использовать такого рода автоматические скрипты, после изменения порта необходимо настроить авто-старт mozrepl (Menu->Tools->MozRepl->Activate on startup).
  • Изначально скрипты примеров предназначены для запуска под Cygwin bash на той же машине, где установлен и (возможно) запущен Firefox для Windows. Однако, их легко переписать на любой другой язык.
  • Имеет смысл, прежде чем пытаться управлять браузером через mozrepl, проверять, запущен ли браузер и если нет - делать что-нибудь другое, например непосредственно редактировать файлы настроек в директории профиля.
Ссылки

lesson

Previous post Next post
Up