Привет, Хабр! Сегодня разберёмся, как ускорить работу с клиентами в популярной CRM-системе Envybox в связке с API-платформой для отправки SMS. Envybox позволяет отправлять сторонним сервисам сообщения и предоставлять информацию по запросу.

Например, клиент оставляет заявку — менеджер быстро получает сообщение и принимает её в работу — клиент об этом будет тут же извещён.

В этой статье рассмотрим, как использовать интеграцию Envybox и МТС Exolve

Подготовка CRM

Допустим, мы хотим получать уведомления о поступающих заявках от клиентов. Envybox можно интегрировать со сторонними сервисами и сайтами, где потенциальные покупатели оставляют запросы на обратную связь.

Сбор заявок из разных источников в разделе «Входящие»
Сбор заявок из разных источников в разделе «Входящие»

Если не сидеть 24/7 в личном кабинете, то такое событие легко пропустить, а реагировать нужно быстро! Поэтому важно получать SMS сразу после создания запроса. И вот мы просмотрели заявку и принимаем её в работу.

Таким образом менеджер берёт заявку в работу
Таким образом менеджер берёт заявку в работу

В дальнейшем мы сможем, например, назначить звонок, если клиент просит связаться с ним в определённое время. Но уведомить человека о том, что его запрос принят, лучше сразу — и удобнее автоматически, при помощи сервиса МТС Exolve. Ниже пример реализации такой системы.

В разделе «Настройки» (панель слева) -> «Интеграция» (разделы в левой колонке) -> Webhook (вкладки сверху) размещаются настройки вебхуков. Здесь можно выбрать события, вызывающие вебхук, и адрес, по которому отправляется запрос. Вводим наши данные и нажимаем на кнопку «Сохранить» внизу справа.

Настройки вебхуков
Настройки вебхуков

Создаём свой сервис

Управлять содержимым отправляемого запроса не получится, поэтому нужно создать сервис, который бы принимал вебхуки от Envybox и отправлял запросы API МТС Exolve. Используем для этого веб-сервер на Flask, установленный в докер-контейнере.

Преимущества этой реализации:

  • Легко разворачивается.

  • Минимальное количество кода, при этом читабельного.

  • Распространённость языка (Python) и технологии.

Файл нашего сервера содержит простой и читаемый код — импорт библиотек и переменных среды, создание Flask app объекта и запуск сервиса:

from flask import Flask, request
import requests
import json
import os

sms_api_key = os.environ['MTS_API_KEY']
crm_api_key = os.environ['CRM_API_KEY']
crm_phone = os.environ['CRM_ACCOUNT_PHONE']
mng_phone = os.environ['MANAGER_PHONE']

app = Flask(__name__)

if __name__ == '__main__':
	app.run(host='0.0.0.0', port=5000)

Переменные среды содержат информацию, которую нельзя выкладывать в открытый доступ: ключи API МТС Exolve и Envybox, а также номер, куда будет отправляться SMS, и тот, от которого будет отправлено.

Вебхуки присылаются по адресу, указанному в строке на вкладке настроек вебхуков в системе Envybox. Соответственно, обрабатывать сообщения должна функция, для которой указан тот же адрес. Эта функция оборачивается в декоратор, где и прописан относительный адрес, по нему принимаются сообщения. Разрешённый метод в нашем случае — POST.

@app.route('/send_SMS', methods=['POST'])
def receive_data():
	CRM_data = request.form.to_dict()
    
	client_name = CRM_data.get('lead[values][main][inputs][name][value]', None)
	client_phone = CRM_data.get('lead[values][main][inputs][phone][value]', None)
	client_id = CRM_data.get('deal[client_id]', None)
    
	enevt_type = CRM_data.get('event', None) or 'unknown event'
	recepient = mng_phone
    
	if enevt_type == 'create_lead' and client_name and client_phone:
    		send_str = f'Заявка от клиента  {client_name}'
	elif enevt_type == 'create_deal' and client_id:
    	send_str = 'Ваша заявка взята в работу'
    	client_phone = take_phone_by_id(client_id)
    		if not client_phone:
        			send_str = 'Сообщение клиенту не отправлено'
    	else:
        		recepient = client_phone
	else:
    	print('Неверный запрос')
    	return 'Bad request', 400
    
	return send_SMS(recepient, send_str)

Функция проверяет как событие, по которому её вызвали, так и наличие необходимой информации: данных клиента либо номера сделки. В каждом запросе есть поле event, содержащее тип события, — остальные поля будут различаться.

Сценарий обработки заявки более простой: при её создании приходит вебхук с событием 'create_lead'. Запрос содержит контактную информацию клиента, и её можно сразу отправлять менеджеру при помощи функции send_SMS.

Для этого мы используем API МТС Exolve. В теле запроса обязательно нужно указать номера — отправителя и получателя — и добавить текст сообщения. Эти данные передаются в JSON-формате. Заголовок должен содержать поле 'Authorization', с ключевым словом 'Bearer ', которое задаёт тип авторизации, и сам ключ, следующий за пробелом.

def send_SMS(recepient: str, send_str: str):
	payload = {'number': crm_phone, 'destination': recepient, 'text': send_str}
	r = requests.post(r'https://api.exolve.ru/messaging/v1/SendSMS', headers={'Authorization': 'Bearer '+sms_api_key}, data=json.dumps(payload))
	print(r.text)
	return r.text, r.status_code

Чтобы отправить сообщение, нужно пройти регистрацию на платформе МТС Exolve, купить один или несколько номеров. Платформа предлагает протестировать сервис с одним номером и стартовым балансом на пробный период.

Здесь можно добавить номер
Здесь можно добавить номер

Второй сценарий немного сложнее. Когда менеджер берёт заявку в работу, автоматически создаётся сделка. За этим следует отправка вебхука с событием 'create_deal'. В этот раз мы хотим уведомить клиента сообщением, но его номера нет в теле запроса. Зато у нас есть идентификатор клиента, и мы можем запросить номер телефона у Envybox через API.

def take_phone_by_id(client_id):
	request_to_crm = {"request": {
	"client_id": client_id
  	}
	}
	resp = requests.post('https://myfavouritecrm.envycrm.com/openapi/v1/client/getContacts/',
    	params={'api_key': crm_api_key}, json=request_to_crm)
	print((resp.text))
	if not resp.status_code == 200:
    		print('Can''t take client phone from CRM')
    	return None
	ans = json.loads(resp.text)['result']['contacts']
	for c in ans:
    		if c['type_id'] == 1:
        	return c['value']
	return None

В параметрах запроса указывается API-ключ, который можно найти во вкладке API в том же разделе интеграции, по соседству с вебхуками. Поле "request" содержит параметры, специфичные для каждого запроса, в нашем случае — идентификатор клиента, который мы получили вместе с вебхуком.

Получение API CRM Envybox
Получение API CRM Envybox

Возвращается на JSON с массивом однотипных элементов, содержащих записи о контактных данных клиента с запрошенным идентификатором. Каждый элемент — только одна единица контактных данных. Например, электронная почта, телефон. Чтобы получить телефон, находим JSON-запись нужного типа.

{
  "result": {
	"contacts": [
  	{
    	"id": "762",
    	"crm_id": "1",
    	"client_id": "2661",
    	"birthday": null,
    	"primary": "1",
    	"created_at": "2017-10-10 15:19:45",
    	"updated_at": null,
    	"deleted_at": null,
    	"type_id": "4",
    	"value": "test@mail.ru",
    	"addon": "",
    	"element_note": "",
    	"group_id": "2"
  	},
  	{
    	"id": "1940",
    	"crm_id": "1",
    	"client_id": "2661",
    	"birthday": null,
    	"primary": "0",
    	"created_at": "2021-04-22 17:23:13",
    	"updated_at": "2021-04-22 17:23:13",
    	"deleted_at": null,
    	"type_id": "1",
    	"value": "54654654654",
    	"addon": "",
    	"element_note": "",
    	"group_id": "1"
  	}
	]
  },
  "status_code": 200,
  "message": "success"
}

Как вы уже поняли, нашу систему необходимо где-то развернуть. Для обработки небольших объёмов информации можно воспользоваться бесплатными хостингами. Но далеко не везде возможно развернуть веб-приложение, а не статичную html-страницу. Сервис https://render.com/ подходит для разворачивания веб-приложений. На пробном тарифе мы получаем 512 мегабайт оперативной памяти и минимальную единицу вычислительной мощности — для наших целей этого вполне достаточно. Использование докера упрощает процесс. Например, Dockerfile нашего проекта:

# Используем официальный Python-образ из Docker Hub
FROM python:3.10-slim
ENV PYTHONUNBUFFERED=1
# Устанавливаем рабочую директорию внутри контейнера
WORKDIR /app
# Копируем содержимое текущей директории в рабочую директорию контейнера
COPY . /app
# Устанавливаем необходимые зависимости
RUN pip install flask
RUN pip install requests
# Открываем порт 5000 для взаимодействия приложения с внешним миром
EXPOSE 5000
# Задаём переменную окружения для указания основного файла приложения Flask
ENV FLASK_APP=flask_server.py
# Указываем команду для запуска приложения
CMD ["flask", "run", "--host=0.0.0.0", "--port=5000"]

Теперь кодовая база готова полностью. Осталось зарегистрироваться на https://render.com/, отметить пункт «Создать веб-приложение» и заполнить поля. Сервис поддерживает интеграцию с гитхабом, поэтому можно выбрать репозиторий, с которого будет копироваться код.

Выбор репозитория
Выбор репозитория

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

Настройка деплоя
Настройка деплоя

Далее следует важный этап — занесение переменных среды. Ключи API и номера телефонов нельзя выкладывать в сеть — ни в виде констант, ни в dockerfile. Но их можно определить на этапе создания веб-приложения.

Создание переменных окружения
Создание переменных окружения

Деплоить можно как последний коммит, так и указать любой другой. Сервис выделит домен, внизу отобразится вывод в консоль.

Меню деплоя
Меню деплоя
Радостное сообщение, что сервис живой
Радостное сообщение, что сервис живой

Протестируем систему в сборе. При выборе «Входящие» на левой панели нашей CRM попадаем на страницу, где выводятся поступившие запросы. Для теста можно добавить заявку вручную.

Вводим имя и телефон, на который можем принять SMS, нажимаем «Добавить». Наш сервис получает хук, и приходит первое SMS. Берём заявку в работу и вскоре получаем уведомление на тот номер телефона, который ввели.

Взять в работу!

В качестве телефона менеджера и клиента указывался один номер, оба SMS пришли
В качестве телефона менеджера и клиента указывался один номер, оба SMS пришли

Выводы

CRM-система Envybox и сервис SMS-рассылок МТС Exolve можно интегрировать без высоких затрат, но с большим приростом продуктивности. Простая настройка через Flask и деплой на render.com делают решение доступным для любого бизнеса. Взять за основу интеграции можно наши наработки.

Сервис интеграции Envybox и МТС Exolve доступен в открытом репозитории на GitHub.


Подписывайтесь на наш Хаб, следите за новыми гайдами и получайте приз

Каждый понедельник мы случайным образом выбираем победителей среди новых подписчиков нашего Хабр-канала и дарим крутые призы от МТС Exolve: стильные рюкзаки, лонгсливы и мощные беспроводные зарядки. Победители прошлых розыгрышей и правила.

Комментарии (0)