DeskChan: Давайте подружим браузер с DC!
31.05.2017


Один из частых предлагаемых use case'ов DC — это взаимодействие с браузером. Могут ли плагины определять, на какой странице ты находишься, что читаешь или смотришь? Может ли виртуальная тянка понять, что ты смотришь порно, и начать возмущаться или, наоборот, угорать вместе с тобой над мемасиками и смешными картинками? Если коротко: да. Но есть свои нюансы.

Браузер — это закрытая среда со своей системой безопасности. И мы не собираемся его хакать. Единственный законный способ взаимодействия сторонних программ с ним — это расширения. В браузер добавляется специальное расширение, которое может взаимодействовать с ним, какими-то страницами или всем сразу. Как же подружить расширение с DeskChan, как внешней программой? Ответ банален: клиент-серверная архитектура (DC — сервер, расширение — клиент). Для этого браузеры поддерживают стандарт специальных веб-сокетов. Они несколько сложнее обычных сокетов, что приводит к некоторым проблемам, но об этом позже.

Итак, в архиве лежит плагин server, который использует стандартные библиотеки Java, чтобы поднять локальный сервер и слушать порт 6867 (в случае неудачи в качестве запасного он пытается подключиться к 10099) [напиши в комментариях, если догадался, что это за цифры, не глядя на комментарий в коде!]. В качестве сообщения он ожидает JSON-строку, состоящую из объекта с полями msgTag и data (см. документацию по API). Все корректные сообщения он передаёт в систему сообщений. Соответственно, можно посылать из браузерного расширения в DC сообщения с любым тегом, который потом слушать плагином на стороне программы.

В папке плагина test_server есть файл test.py. Это простой скрипт, который можно выполнить с помощью интерпретатора Python и проверить работоспособность серверного плагина с обычными сокетами. Всё, что он делает — это выводит «Hello, world!» с помощью персонажа.

Теперь насчёт веб-сокетов. Они несколько сложнее, потому что следуют чёткой структуре запроса и начинают общение по протоколу HTTP. Всё это на себя берёт плагин-сервер. Куда более важный момент, что для сайтов с защищённым зашифрованным соединением (а их сейчас всё больше и больше) расширения не могут открывать небезопасные сокеты. По крайней мере, в Mozilla Firefox это так. В Chrome на данный момент это разрешается, но велика вероятность, что тоже прикроют. И вот эту проблему я пока не решил, так как надо получать официальный белый сертификат, разбираться в его установке и дистрибуции с плагином и т. д. и т. п.

В папке с тем же test_server есть файл webextension.crx, который является как раз расширением для браузера. По вышеописанной причине, работать он будет только под Google Chrome и, скорее всего, другими браузерами на движке WebKit (например, Opera, «Яндекс.Браузер», Safari). Что он делает? Он смотрит, не зашли ли Вы на страницу к себе или кому-то другому в социальной сети «ВКонтакте» и посылает имя этого человека в DC. Со стороны программы должен работать плагин (plugin.groovy; вообще, просто скиньте папку плагина в plugins и после установки расширения можете удалить всё, кроме этого файла), который обработает эти данные и выведет определённый текст.

Ссылки на скачивание: