Итак, если ваш стиль работы подразумевает (почти) постоянно
запущенный браузер, рано или поздно вам захочется что-нибудь в нём
автоматизировать. Для многих вещей это можно сделать разными
addon'ами, но нет в мире совершенства - если вам нужно передать в
настройки браузера информацию "извне" вы можете не найти
подходящего решения. Тут-то и приходит желание получить
какой-нибудь интерфейс "удалённого" (в смысле IPC) управления
браузером.
Сейчас я рассмотрю только один вариант такой автоматизации -
расширение MozRepl для Firefox и родственных браузеров.
Способы использования
- Передать полный скрипт при подключении.
- Вставить в 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, проверять, запущен ли браузер и если нет - делать
что-нибудь другое, например непосредственно редактировать файлы
настроек в директории профиля.
Ссылки