среда, 6 июня 2018 г.

Mono под Linux'ом. Жизнь без WebBrowser.


Недавно понадобилось писать небольшие приложения под Linux. Естественно, первое, что я предпринял в этом направлении - начал изучать, какие возможности предоставляет Mono и особенно WinForms. Причины вполне понятны: хорошо знакомая технология, язык, среда разработки со всеми ее наворотами. Естественно использовать все это для решения задач было весьма заманчиво. Начал пробовать что там есть, да как оно устроено и вот наткнулся на то, что с веббраузером там дело обстоит совсем нехорошо. В документации написано, что все должно работать почти как в "винде", с учетом того, что браузерный движок другой, но на деле ничего не работало. Изучил разные варианты, например проекты Awesomium и GeckoFX сулят кроссплатформенность, но ничего из этого я тоже запустить не смог (видимо это очень сложно и не каждому дано).
Конечно, казалось бы, не такой уж он и важный этот WebBrowser, но бывают задачи, для решения которых без него обойтись - довольно сложно. В частности к таким задачам можно отнести получение ключа доступа к API по протоколу oAuth 2.0.
Поскольку прямого решения данной задачи я так и не нашел, то решил соорудить "костыль из мозиллы". Идея состоит в следующем:
1. Создается вспомогательное приложение на платформе Mozilla, в котором будет наличествовать форма с браузером и, при необходимости, дополнительные элементы интерфейса.
2. Основное приложение запускает это вспомогательное приложение, передавая ему аргументы (в примере это будет адрес для получения ключа доступа и порт для взаимодействия приложений).
3. Перед запуском приложения на некоторый порт (тот, который передается приложению как аргумент) вешается прослушка с помощью System.Net.HttpListener.
4. После прохождения процедуры получения ключа, адрес, содержащий ключ, передается на вышеупомянутый порт локалхоста, который уже прослушивается основным приложением.

Пример во вложении - WinForms-приложение для получения ключа доступа к API социальной сети ВКонтакте. На основной форме надо указать ID клиента (можно посмотреть в настройках приложения vk) и номер порта через который будет осуществляться взаимодействие приложений. А так же можно выбрать сервисы, доступ к которым надо получить с помощью этого ключа.

Вспомогательное приложение может быть запущено либо с помощью xulrunner либо с помощью установленного FireFox и для запуска требуется его адрес. У меня адрес указан просто "firefox", а для последних версий Windows путь определяется из ветки реестра HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Mozilla\Mozilla Firefox. Возможно в некоторых системах эту логику надо будет слегка подправить, работу проверил на Windows 10 (64 bit) и на Raspbian.
Ссылки на документацию вконтактика для понимания того, что делается в приложении:
Implicit Flow для получения ключа доступа пользователя | Разработчикам
Права доступа приложения | Разработчикам
Вложения

Комментариев нет :

Отправить комментарий