Время прочтения: 10 мин.

Qlik Sense является приложением для визуализации, анализа и мониторинга данных. С помощью Qlik Sense можно опубликовать дашборд, в котором необходимую информацию можно представить в виде таблиц и графиков. Интерфейс Qlik Sense (QS) интуитивно понятен — при помощи стандартных элементов управления QS можно выводить различные срезы информации, задавать фильтры, взаимодействовать с диаграммами и таблицами. Однако может возникнуть задача сохранить данные визуального элемента (например, таблицы) QlikSense в Excel. В данной публикации рассмотрим способ получения данных  из Qlik Sense с использованием REST API и Python.

  1. Сохранение данных из стандартного интерфейса Qlik Sense

Для отдельного визуального элемента приложения QS (например, таблицы) можно сохранить данные при помощи стандартных средств:

— строим нужную выборку данных;

— наводим курсор на визуальный элемент, кликаем на всплывающую кнопку с тремя точками:

— в появившемся контекстном меню выбираем «Загрузить как данные»:

Затем новый файл MS Excel с данными выбранной визуализации сохраняется на компьютер (по умолчанию в папку «Загрузки» в профиле пользователя).

В случаях, когда необходимо автоматизировать получение данных из Qlik Sense, можно использовать REST API.

2. REST API и его возможности

REST API – технология, которая позволяет клиентскому приложению получать доступ к данным серверного приложения по определенному URL. Данные внутри Qlik Sense представляют собой иерархическую структуру объектов: приложения, задачи, пользователи, подключения к данным и т. д. Когда пользователь отправляет http-запросы к API, выполняются определенные действия над этими объектами.

Qlik Sense API можно использовать для автоматизации:

  • создания и изменения приложений;
  • выгрузки/загрузки данных
  • получения системной информации о сервере.

Существует несколько видов API Qlik Sense, основные из них:

REST API QS поддерживают 4 классических метода (GET, POST, PUT, DELETE) и множество специфичных свойств и функций для совершения операций с объектами Qlik.

3. Как можно выгрузить данные из приложения Qlik  Sense с помощью REST API?

Для того чтобы получить данные из приложения QS с использованием REST API, нужно решить три задачи:

1) Пройти аутентификацию на сервере Qlik Sense (под УЗ, имеющей доступ к приложению);

2) Получить метаданные объектов Qlik (приложений и визуализаций в них) и найти нужное приложение;

3) Обратиться к приложению, найти нужный объект (таблицу данных или элемент визуализации) и получить из него данные.

Подключиться к API QS можно при помощи любых языков программирования, предоставляющих средства работы с http-запросами. Python предоставляет готовые решения для работы с REST API Qlik Sense. Одни и те же задачи можно реализовать при помощи различных библиотек Python, как мы далее рассмотрим на примерах. Среди специализированных библиотек Python можно порекомендовать: qsAPI (GitHub); pyqlikengine (GitHub); qsense (GitHub). Но также отлично подойдут универсальные библиотеки для работы с http запросами — requests (GitHub), любой клиент для websockets — websocket (PyPI) или websockets(GitHub).

3.1 Аутентификация при подключении к Qlik

Qlik Sense поддерживает 2 способа аутентификации:

Аутентификация по SSL сертификатам:

  • Поддерживается всеми библиотеками;
  • Удобно пользоваться, достаточно хранить сертификаты в доступном для вашего кода расположении;
  • Но для получения файлов сертификатов нужна помощь администратора сервера.

NTLM аутентификация:

  • Позволяет настроить сквозную аутентификацию Windows;
  • Поддерживается не всеми библиотеками Python.

Рекомендуем пользоваться SSL сертификатами (выпустил один раз и «забыл»).

Сертификаты экспортируются через консоль управления сервера QS (QMC, доступна по адресу: https://{url сервера QS}/qmc ).

Далее в меню “CONFIGURE SYSTEM” в левой части экрана нужно войти в пункт Certificates, выбрать операцию экспорта сертификатов (следует внести необходимые для генерации данные —  имя компьютера, пароль для сертификата).  Формат сертификата лучше выбирать платформенно-независимый (PEM), т. к. большинство библиотек работают с ним «из коробки».

Сгенерированные сертификаты будут сохранены в папку на сервере Qlik Sense (скопировать их для вас сможет администратор сервера QS). Файлы сертификатов в формате PEM (root.pem, client.pem – сертификаты сервера и клиента, client.key – файл с ключевой информацией, client_key.pem содержит сертификат клиента и его ключ) нужно сохранить на доступном для вашего кода расположении.

Рассмотрим аутентификацию с использованием библиотеки requests.

1. Определяем путь к сохраненным сертификатам:

2. Также, при аутентификации на сервере QS потребуется задать заголовок http-запроса (словарь):

Заголовок включает реквизиты УЗ пользователя QS (домен/УЗ), указание на формат получаемых данных (json), а также ключ пользовательской сессии Qlik (xrfkey).

3. Ключ xrfkey — строка длиной 16 символов, ее генерирует Qlik. Но ключ также можно задать вручную:

4. Собираем url: присоединяем к конечной точке Qlik (Endpoint) ключ xrfkey, и передаем url в запрос:

Каждый из API имеет свой набор конечных точек, здесь показано получение списка всех приложений QS.

5. Отправляем запрос GET на сервер:

Если получен статус код ответа «200», значит аутентификация прошла успешно. Теперь можно пробовать получать данные из приложения Qlik Sense (об этом – в следующей части статьи).

3.2 Находим приложение и получаем его метаданные

После открытия подключения можно использовать поддерживаемые REST API методы для отправки http-запросов к ресурсам (объектам QS) и получения ответов. Рассмотрим подключение и получение метаданных объектов из репозитория Qlik Sense с помощью библиотеки qsAPI.

1. Импортируем библиотеку и подключаемся к QRS по SSL сертификату, сохраненному на диске:

Для библиотеки qsAPI достаточно одного SSL сертификата (сертификат пользователя). Полученный от сервера ответ (версия ПО QS) говорит о том, что подключение прошло успешно:

2. Применив метод AppGet библиотеки, можно получить JSON-ответ с полным списком приложений на сервере:

Также мы можем получать метаданные приложения конкретного приложения по его имени (например, приложения App Metadata Analyzer), используя метод AppGet:

Теперь мы получили уникальный ID нашего приложения, по которому далее будем искать объекты внутри приложения:

Здесь показано подключение к конечной точке (endpoint) для обращения к приложениям сервера QS: https://{url сервера QS}:4747/qrs/apps . Порт может быть и другим (так, при подключении через библиотеку requests используется порт 4242).

Подключаясь к различным конечным точкам, можно работать с разными типами сущностей в репозитории QS:

https://… /qrs/app – приложения;

https://…/qrs/user – пользователи;

https://…/qrs/stream — стримы, и т. п.

Полная информация о конечных точках доступна в документации на официальном сайте Qlik.

3.3 Узнаем, что «содержится» внутри приложения

Здесь предлагаем рассмотреть использование еще одной библиотеки Python– websocket.

В нее не включены специфичные для QS функции и методы. И при отправке запроса, и при получении ответа библиотека использует формат JSON, что позволяет лучше понимать структуру данных Qlik и особенности обращения к различным его объектам.

1. Импортируем библиотеки:

2. Указываем данные о сертификатах и url (Endpoint) для подключения:

3. Задаем xrf ключ и заголовок для запроса (так же, как показано выше):

4. Далее открываем соединение с сервером Qlik Sense:

После завершения действий с объектами Qlik следует закрывать установленное соединение командой close(), для данного примера:

5. Атрибуты интересующего нас приложения (в том числе его ID) можно получить, передав методу GetAppEntry имя приложения:

и по найденному ID открыть объект Qlik Sense (приложение), используя метод OpenDoc:

6. Все элементы визуализации, используемые в приложениях, также представляют собой объекты Qlik, к которым можно отправлять запросы JSON, получать ответы (тоже в JSON формате), и выполнять с ними действия, предусмотренные методами REST API.

Так, для открытого объекта QS (приложения App Metadata Analyzer) можно получить информацию о всех таблицах, которые оно содержит:

7. Предположим, нас интересует таблица Tables. Мы можем найти таблицу по ее имени (указав его в параметре «qTableName»), и запросить, например, первые 20 строк содержащихся в ней данные (использовав метод GetTableData):

В полученном ответе в переменную re_get_data возвращается содержимое таблицы Tables (в данном случае — информация о всех таблицах приложения и их атрибутах):

Ответ приходит в формате JSON, его можно затем обрабатывать как угодно, например, загрузить в датафрейм pandas и сохранить в «любимом» формате, например, MS Excel.

4. Сохраняем полученные данные в MS Excel

Далее при помощи стандартного функционала библиотеки pandas можно обработать и сохранить полученный JSON с содержимым интересующей нас таблицы в Excel.

Сначала получаем список полей нашей таблицы Tables:

Затем соединим значения из JSON-ответа (re_get_data) с ключами — именами столбцов таблицы (keys), обработаем построчно и сохраним в новый датафрейм rows:

В датафрейме теперь содержится 20 строк из таблицы Tables:

Полученные записи далее можно сохранить в файл формата MS Excel для дальнейшего использования:

Итак, задача решена! Содержимое таблицы с данными в приложении Qlik Sense сохранено в файл в формате *.xlsx. Для этого нам потребовалось сделать несколько шагов, которые были рассмотрены выше:

— пройти аутентификацию на сервере QS;

— найти нужный объект QS (приложение, таблицу и т.п.…);

— отправить http-запрос к объекту;

— получить запрошенные данные в JSON и сохранить их в нужном формате.

Кроме программного получения данных, REST API Qlik Sense поддерживают все 4 основных метода (GET, POST, PUT, DELETE), с помощью которых можно копировать, изменять, удалять объекты  Qlik Sense.

Исчерпывающую справочную информацию по использованию REST API Qlik Sense вы сможете найти на официальном сайте Qlik Sense и разделах разработчиков библиотек Python на GitHub.

В заключение, следует отметить, что аналогичным образом с использованием REST API можно организовать получение данных различных объектов приложений Qlik Sense. Рассмотренный подход может быть полезен, когда требуется периодически выгружать (получать) данные, на которых строится отчет Qlik Sense.