В этой статье мы бы хотели рассказать о нашей новой платформе Job Freelance Scanner, которая находится в свободном доступе. В поисках нового проекта порой приходится мониторить фриланс площадки на наличие подходящего предложения. Это порождает ряд проблем: поиск по разным сайтам, вбивание в поиске нужных ключевых слов, отсеивание дубликатов — все это отнимает время. Плюс, надо помнить читал ли ты это предложение. Вот было бы удобно мониторить это одним инструментом, при этом в онлайн режиме.

Наша компания занимается разработкой интеграционных решений и регулярно нуждается в поиске предложений в этой области. Таким образом, сформировалась задача: разработать платформу для мониторинга предложений о работе с крупных площадок. Платформа должна отслеживать предложения, содержащие некоторые ключевые слова, и публиковать их в 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)


  1. drevil
    16.12.2016 16:30

    какая периодичность опроса площадок?


    1. leadexsystems
      16.12.2016 16:31

      раз в минуту


  1. antonecma
    16.12.2016 18:44

    А у upwork какой-то особенный доступ к их api?


    1. leadexsystems
      16.12.2016 20:42

      У upwork есть API на архитектуре REST + библиотеки для удобного доступа к ним на разных языках (java, ruby, python, и пр) — ссылка на Reference


      1. antonecma
        18.12.2016 16:38

        А доступ к api (ключ) предоставляется после написания заявки, мне вот они не дали доступ. Хотелось бы узнать, что им надо написать для гарантированного предоставления ключа.


        1. leadexsystems
          18.12.2016 17:10

          Нам с первого раза тоже не дали, т.к. мы не учли простые обязательные условия, например — не должно быть слова Upwork в названии приложения. Но после мы отказа написали вопрос в саппорт и нам дали пояснения. Не сдавайтесь.


  1. TecHMeaT
    16.12.2016 19:02
    +1

    Если искать только по ключевым словам, то можно утонуть в потоке проектов. На том же UpWork фильтр с большим количеством параметров, да и тех не хватает для отсеивания хлама. Так что RSS из поиска всё же будет поудобнее.


  1. drevil
    17.12.2016 22:58

    А есть в планах телеграмм?


    1. leadexsystems
      18.12.2016 10:37

      В ближайших планах нет, но проект opensource так что всегда можно лично поучаствовать в разработке


    1. igor_suhorukov
      18.12.2016 12:06

      Попробуйте добавить в camel телеграмм компонент.


  1. tony1az
    18.12.2016 08:14

    что нужно указать в строке Webhook?


    1. leadexsystems
      18.12.2016 08:17

      Нужно указать Webhook канала Slack, в который должны падать сообщения (подробнее тут)


      1. tony1az
        18.12.2016 13:43

        спасибо, большое


  1. Deka87
    18.12.2016 10:32
    +1

    Иногда достаточно просто подписаться на RSS ленту того же Upwork почти с мгновенным уведомлением.


  1. 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


  1. andrewgrow
    26.12.2016 17:58

    А есть какие-либо планы насчёт починить не работающий Upwork?