Freshdesk
Ноутбуки, используемые в примере:
В данной статье рассматривается пример получения данных с портала поддержки клиентов Freshdesk https://freshdesk.com. Пример не является шаблонным: в каждом случае задачи разнятся, и работать с данными придется по-другому.
Вот особенности данного кейса:
Количество получаемых данных небольшое - порядка 400 строк, поэтому все выгруженные и обработанные данные сохраняются в XLSX файл, а не в CSV или SQL базу данных.
Будут использоваться два ноутбука: первый для данных заявок, второй для данных контактов и агентов. На выходе будет два Excel файла для загрузки в платформу.
Здесь не рассматривается:
Данные будут забираться с Freshdesk вручную. Для регулярной автоматический выгрузки необходимо настроить планировщик Chronicle.
Для дальнейшей загрузки в платформу можно воспользоваться стандартными средствами в платформе: “создание загрузчика” и “планы загрузки”. Всё описано в разделе документации (ссылка для версии 2.17):
https://docs.visiology.su/wiki/pages/createpage.action?spaceKey=v17&title=%D0%97%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B8%20%D1%84%D0%BE%D1%80%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B%20%D0%B2%20%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9%20%D0%B1%D0%B0%D0%B7%D0%B5%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20ViQubeПодробности работы подключенных Python библиотек. Это необходимо изучать отдельно.
Сначала необходимо внимательно ознакомиться с описанием работы библиотеки python для Freshdesk:https://github.com/sjkingo/python-freshdesk, а также с API Freshdesk https://developers.freshdesk.com/api.
Теперь можно приступать к работе в JupyterLab.
Создаем новый ноутбук для заявок, например, с именем Tickets.
Первым блоком подключаем все необходимые нам для работы Python библиотеки:
import petl as etl from freshdesk.api import API from datetime import dateВторым блоком подключаемся к Freshdesk, используя адрес своего портала и токен. Адрес портала нужно обязательно указывать с доменом freshdesk.com.
a = API('yourname.freshdesk.com', 'gj34pg98hyatoken')Получаем заявки c 1 января 2015 года, кроме удаленных и помеченных как спам. Параметр filter_name необходим для получения всех заявок. Если его не указать, придут только открытые заявки, назначенные агенту, чей токен указан в подключении.
tickets = a.tickets.list_tickets(updated_since='2015-01-01', filter_name=None)Кладем все данные в список, где каждый элемент - это словарь. Это нужно для создания таблицы petl в следующем шаге. В некоторых местах данные сразу преобразовываются к нужном виду, например, для tags данные в виде списка преобразуются в строку и разделяются пробелами.
tickets_array = [] for t in tickets: tickets_array.append({'id': t.id, 'subject':t.subject, #'company_id': t.company_id, 'created_at': t.created_at.date(), 'due_by': t.due_by, # в отличие от created_at это просто строка. Ну и так сойдет. 'fr_due_by': t.fr_due_by, # Снова строка, ну ок 'priority': t.priority, 'requester_id': t.requester_id, 'responder_id': t.responder_id, 'status': t.status, 'type': t.type, 'source': a.tickets.get_ticket(t.id)._source, 'tags': ' '.join(t.tags), 'description_text': a.tickets.get_ticket(t.id).description_text, })Создаем таблицу petl с указанными столбцами и наполняем ее данными о заявках.
table1 = etl.fromdicts(tickets_array, header=['id','subject', 'due_by', 'fr_due_by', 'priority', 'requester_id', 'responder_id', 'status', 'type', 'source', 'tags', 'description_text', 'created_at' ])Вручную расшифровываем кастомные статусы тикетов. Они уникальны для каждого портала Freshdesk. В данном случае их всего четыре. У вас их может не быть вовсе.
table2 = etl.convert(table1, 'status', {'status_8': 'В ожидании третьей стороны', 'status_9': 'Тестирование', 'status_10': 'В разработке', 'status_11': 'Запланирована удаленная сессия', })Выгружаем в Excel.
etl.toxlsx(table2, 'tickets.xlsx')
Создаем новый ноутбук для заявок, например, с именем Contacts. Импортируем библиотеки.
import petl as etl from freshdesk.api import APIВторым блоком подключаемся к Freshdesk, используя адрес своего портала и токен. Адрес портала нужно обязательно указывать с доменом freshdesk.com.
a = API('yourname.freshdesk.com', 'gj34pg98hyatoken')Записываем в две переменные информацию о контактах и агентах.
contacts = a.contacts.list_contacts() agents = a.agents.list_agents()В рамках данного примера мы хотим на выходе сформировать одну общую таблицу контактов, где будут и обычные контакты (клиенты), и агенты. Причем, чтобы отличать обычных контактов от агентов, мы добавим дополнительный столбец isAgent. Также, чтобы отличать штатного агента от временного добавим столбец isOccasional.
Создаем переменную, куда будем помещать все данные в виде списка.contacts_array = []Сначала помещаем всю информацию об обычных контактах в нашу переменную. Здесь же мы вычисляем название компании company_name по адресу электронной почты контакта.
Для столбца isAgent конечно же ставим False, так как мы сейчас работаем с обычными контактами. Для столбца isOccasional ставим None, так как обычный контакт не может быть ни штатным, ни временным агентом.for c in contacts: contacts_array.append({'id': c.id, 'name': c.name, 'email': c.email, 'company_name': c.email.split("@")[1].split(".")[0].capitalize(), 'isAgent': False, # это кастомное поле, во фрешдеске его нет 'isOccasional': None, # Только для агентов })Добавляем в ту же переменную информацию об агентах.
for a in agents: contacts_array.append({'id': a.id, 'name': a.contact['name'], 'email': a.contact['email'], 'company_name': None, # у агентов нет компании 'isAgent': True, # это кастомное поле, во фрешдеске его нет 'isOccasional': a.occasional, })Формируем таблицу petl на основе единой информации о контактах и агентах в contacts_array.
table = etl.fromdicts(contacts_array, header=['id','name', 'email', 'company_name', 'isAgent', 'isOccasional'])Экспортируем в Excel.
etl.toxlsx(table, 'contacts.xlsx')
Полученные файлы можно брать и загружать в платформу через стандартный загрузчик. На этом работа в ViXtract завершена.