Наша компания занимается разработкой интеграционных решений и регулярно нуждается в поиске предложений в этой области. Таким образом, сформировалась задача: разработать платформу для мониторинга предложений о работе с крупных площадок. Платформа должна отслеживать предложения, содержащие некоторые ключевые слова, и публиковать их в slack канале.
После реализации приложения и локального запуска мы решили опубликовать его для сообщества, предоставить свободный доступ для использования, а также опубликовать исходники. В итоге, мы представляем платформу Job Freelance Scanner.
Возможности
Job Freelance Scanner — платформа для мониторинга предложений с крупных глобальных площадок по поиску работы, разработанная компанией Leadex Systems. Эта платформа позволяет получать предложения единым потоком в канал связи (Slack) от таких площадок как:
Сообщение о новом предложении о работе поступают в кратчайшие сроки после публикации, что позволяет осуществлять мониторинг свежих предложений и откликаться на них одним из первых. Пример сообщения с предложением о работе в канале slack:
Настройка
Для начала использования платформы необходимо:
- пройти по ссылке jobfreelancescanner.com;
- авторизоваться через аккаунт Google или LinkedIn;
- ввести поисковые запросы (ключевые слова), по которым будет осуществляться мониторинг предложений о работе с соответствующего сайта;
- на соседней вкладке изменить настройки slack нотификации;
- готово. В указанный канал slack начинают падать предложения.
Архитектура
Для решения поставленной задачи была разработана следующая архитектура: через определенный промежуток времени ищутся по ключевым словам предложения о работе с нужных площадок с помощью их внутреннего API. Отсеиваются уже опубликованные и рассылаются подписанным клиентам.
Легенда:
Как видно из схемы, проект состоит из нескольких независимых модулей. Для общения между модулями приложения используется Apache ActiveMQ в качестве брокера сообщений и MongoDB для хранения настроек клиентов. Для интеграции модулей нашего решения используется Apache Camel.
Пример интеграции Slack и ActiveMQ с помощью Apache Camel
Рассмотрим подробней модуль, который конвертирует предложения о работе в сообщение для Slack и отправляет их с помощью интеграции slack компонента от Apache Camel. В основе этого компонента лежит роут описанный на Java DSL.
from("activemq:queue://" + activemqQueue +
"?username=" + activemqUser +
"&password=" + activemqPass +
"&disableReplyTo=true")
.process(jsonToPojoProcessor)
.process(aggregateJobProcessor)
.split(body())
.process(jobToSlackMessageProcessor)
.to("direct:slackOutput");
from("direct:slackOutput")
.recipientList(simple("slack:#${header.uri}"));
Роут — это описание маршрута передачи сообщений. Характеристиками такого роута являются начальная точка, обозначенная токеном from (в нашем случае это компонент для ActiveMQ) и конечная точка, обозначенная токеном to (компонент для Slack). Apache Camel предоставляет различные компоненты для интеграции (смотри полный список тут camel.apache.org/components).
Настройка компонента activemq задается с помощью URI строки. В нашем случае эта строка составляется при помощи вставки параметров, заданных через файл настроек. Рассмотрим пример полученной URI строки.
from("activemq:queue://slackNotify?username=admin&password=admin")
Это описание входной точки с помощью сгенерированной строки URI. Где activemq — название компонента, а queue — тип канала сообщений, который может быть или очередью (queue), или темой (topic). Далее идёт название канала — slackNotify. Последняя часть URI — параметры конечной точки: username/password — логин и пароль пользователя.
Затем идут несколько конвертеров и сплиттер:
- jsonToPojoProcessor — преобразование входного сообщения JSON формата во внутреннюю модель данных Notification (модель содержит список предложений о работе и настройки для slack). Для конвертации используется библиотека Google Gson, позволяющая конвертировать JSON в Java объект и наоборот.
- aggregateJobProcessor — конвертирование из модели данных Notification в массив предложений о работе. Также записываются настройки канала slack в заголовок.
- split(body()) — разделяет входной массив предложений о работе в самостоятельные потоки.
- jobToSlackMessageProcessor — конвертирует предложение о работе в сообщение для slack канала.
Для интеграции со Slack также используется компонент от Apache Camel. Но возникает проблема: настройки слэк канала нам заранее неизвестны. Узнать их мы можем только из входящего сообщения. Конвертер aggregateJobProcessor формирует часть URI строки с настройками канала и записывает ее в заголовок для того, чтобы затем можно было создать динамический маршрут (Dynamic Router)
from("direct:slackOutput")
.recipientList(simple("slack:#${header.uri}"));
Особенность этого маршрута заключается в том, что в нем динамически выбирается конечная точка, а конкретно компонент slack с настройками канала в который будут отправляться сообщения. Для построения маршрута используются данные из самого сообщения (его заголовка), которые достаются с помощью SEL (Simple Expression Language) и выполняются с помощью функции simple(). Шаблон EIP — The Recipient List (Список получателей) позволяет создавать динамические конечные точки.
Заключение
Пример интеграции продемонстрировал простоту и удобство использования Apache Camel. Мы надеемся, что платформа Job Freelance Scanner будет для кого-то полезной. Также в будущем мы планируем развивать нашу платформу, например добавить Email нотификацию и улучшить UI.
Ссылки:
> Ссылка для использования: jobfreelancescanner.com/
> Ссылка на github: github.com/leadex/job-monitor
Комментарии (16)
antonecma
16.12.2016 18:44А у upwork какой-то особенный доступ к их api?
leadexsystems
16.12.2016 20:42У upwork есть API на архитектуре REST + библиотеки для удобного доступа к ним на разных языках (java, ruby, python, и пр) — ссылка на Reference
antonecma
18.12.2016 16:38А доступ к api (ключ) предоставляется после написания заявки, мне вот они не дали доступ. Хотелось бы узнать, что им надо написать для гарантированного предоставления ключа.
leadexsystems
18.12.2016 17:10Нам с первого раза тоже не дали, т.к. мы не учли простые обязательные условия, например — не должно быть слова Upwork в названии приложения. Но после мы отказа написали вопрос в саппорт и нам дали пояснения. Не сдавайтесь.
TecHMeaT
16.12.2016 19:02+1Если искать только по ключевым словам, то можно утонуть в потоке проектов. На том же UpWork фильтр с большим количеством параметров, да и тех не хватает для отсеивания хлама. Так что RSS из поиска всё же будет поудобнее.
drevil
17.12.2016 22:58А есть в планах телеграмм?
leadexsystems
18.12.2016 10:37В ближайших планах нет, но проект opensource так что всегда можно лично поучаствовать в разработке
tony1az
18.12.2016 08:14что нужно указать в строке Webhook?
leadexsystems
18.12.2016 08:17Нужно указать Webhook канала Slack, в который должны падать сообщения (подробнее тут)
Deka87
18.12.2016 10:32+1Иногда достаточно просто подписаться на RSS ленту того же Upwork почти с мгновенным уведомлением.
andrewgrow
20.12.2016 09:22Разработчикам большое спасибо! очень удобно
Для тех, кто, как я, не сразу понял, что такое вебхук, который нужен для работы, подсказка:
1. Авторизируетесь в Slack под админской учёткой.
2. Идёте на страницу https://api.slack.com/incoming-webhooks
3. В строчке Start by setting up an incoming webhook integration in your Slack team to try these features out нажимаете на ссылку.
4. Из строки Webhook URL копируете адрес вида https://hooks.slack.com/services/ВАШ_ТОКЕН
5. Вставляете на сайте сканера ...com/#/manage -на вкладке Notifications -в поле Web hook
drevil
какая периодичность опроса площадок?
leadexsystems
раз в минуту