Привет, Хабр! Сегодня разберёмся, как ускорить работу с клиентами в популярной 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" содержит параметры, специфичные для каждого запроса, в нашем случае — идентификатор клиента, который мы получили вместе с вебхуком.
Возвращается на 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. Берём заявку в работу и вскоре получаем уведомление на тот номер телефона, который ввели.
Взять в работу!
Выводы
CRM-система Envybox и сервис SMS-рассылок МТС Exolve можно интегрировать без высоких затрат, но с большим приростом продуктивности. Простая настройка через Flask и деплой на render.com делают решение доступным для любого бизнеса. Взять за основу интеграции можно наши наработки.
Сервис интеграции Envybox и МТС Exolve доступен в открытом репозитории на GitHub.
Подписывайтесь на наш Хаб, следите за новыми гайдами и получайте приз
Каждый понедельник мы случайным образом выбираем победителей среди новых подписчиков нашего Хабр-канала и дарим крутые призы от МТС Exolve: стильные рюкзаки, лонгсливы и мощные беспроводные зарядки. Победители прошлых розыгрышей и правила.