Создание многоканальной службы поддержки с помощью TaskRouter

Автор: | 02.08.2026

Мы живем в эпоху, когда существует больше способов, чем когда-либо, для связи бизнеса с клиентами. Как разработчики, у нас есть возможность создавать приложения, которые помогают облегчить эти взаимодействия. Однако если вы уже создавали службу поддержки, то знаете, что написание кода для управления доступностью агентов и интеграции нескольких каналов связи может быть сложной задачей. Компания Twilio разработала TaskRouter, чтобы упростить создание подобной функциональности в ваших приложениях.

В этой статье мы покажем, как использовать Twilio TaskRouter для создания приложения службы поддержки, которое изначально позволяет клиентам связываться с вами по телефону. Мы пройдем через процесс улучшения этого приложения для масштабирования на нескольких агентов, а затем добавим SMS как второй канал связи, направляя каждого клиента к наиболее подходящему агенту.

Прежде чем начать писать код, обязательно ознакомьтесь с сопутствующим репозиторием на GitHub, где каждый шаг уже реализован и помечен тегами. Вы также можете развернуть наш пример службы поддержки с помощью кнопки Heroku Deploy ниже.

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

— Python для написания и выполнения кода приложения, который также доступен на GitHub

— Аккаунт Twilio и хотя бы один активный номер телефона Twilio

— Приложение Flask, генерирующее ответ с помощью библиотеки Twilio Python версии 3.7.0 или выше

— Ngrok для создания защищенного туннеля к работающему серверу приложения Flask

Зарегистрируйтесь в Twilio, и мы начнем писать код.

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

Лучшей практикой при работе с Python является изоляция зависимостей каждого приложения от других проектов с помощью virtualenv. Установка virtualenv зависит от вашей операционной системы, поэтому вот руководства для пользователей Windows, Mac OS X и Ubuntu Linux.

Создайте новый virtualenv, чтобы отделить зависимости Python вашего приложения от других проектов, с помощью следующей команды. Virtualenv создаст для вас директорию с изолированным интерпретатором Python, свободным от посторонних библиотек и зависимостей.

virtualenv supportdesk

Обязательно активируйте virtualenv перед установкой зависимостей.

source supportdesk/bin/activate

Зависимости, которые нам нужны для этого проекта, — это библиотека Twilio и Flask. Чтобы установить их, выполните следующую команду pip в командной строке. Если вам нужно установить pip, вот несколько более конкретных руководств по установке для Windows, Mac OS X и Linux.

pip install twilio flask

Теперь ваша среда готова для выполнения кода Python, который зависит от Flask и библиотеки Twilio, так что давайте напишем код. Также доступен помеченный репозиторий GitHub с этим кодом на случай, если вы не хотите вводить его вручную. Начнем с создания нового файла с именем app.py. В верхней части нашего нового файла добавьте следующие импорты.

В приведенном выше коде мы получаем os для работы с переменными окружения, библиотеку Flask для нашего веб-приложения и библиотеку Twilio для TwiML, которую мы будем использовать для ответа на входящие HTTP POST-запросы Twilio.

После кода импорта добавьте три новые строки для получения необходимых переменных окружения. Две из трех переменных, которые нам нужны, — это Twilio Account SID и Auth Token, которые можно найти в личном кабинете. Третья переменная окружения — это номер агента поддержки. В этой статье вы можете играть роль агента поддержки при создании приложения. Как агент поддержки, вам нужно будет указать свой номер мобильного телефона для переменной SUPPORT_AGENT_NUMBER в формате «+12025551234».

Далее мы создаем приложение Flask и добавляем простой маршрут для «/», чтобы убедиться, что приложение работает правильно.

Наконец, добавим основную функцию, чтобы приложение запускалось на порту, указанном в переменной окружения, или по умолчанию на порту 5000.

Сохраните файл и запустите приложение Flask с помощью следующей команды.

python app.py

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

* Running on http://127.0.0.1:5000/

Теперь мы можем подтвердить, что наше простое приложение Flask работает, перейдя по адресу http://127.0.0.1:5000 в веб-браузере. Если приложение работает успешно, вы должны увидеть простое сообщение об успехе: «Служба поддержки запущена и работает!».

Однако мы еще не добавили функциональность службы поддержки. Давайте напишем код для этого сейчас. Остановите сервер Flask с помощью CTRL-C и снова откройте файл app.py.

Изначально наша служба поддержки будет крайне простой. Мы добавим один маршрут (/call), к которому Twilio будет отправлять POST-запросы при входящем звонке. Каждый раз, когда кто-то звонит на наш номер, мы будем перенаправлять его звонок (с помощью глагола ) к единственному агенту — Эндеру. Помните, что вы будете играть роль Эндера, поэтому убедитесь, что вы указали свой номер телефона в переменной окружения SUPPORT_AGENT_NUMBER, чтобы ваш телефон звонил при каждом обращении в службу поддержки. В этой функции мы используем библиотеку Twilio Python для генерации нашего TwiML.

Напишите функцию /call, как показано ниже, между нашим предыдущим кодом в app.py. Если вы не хотите писать весь код вручную, тег tutorial-step-2 в нашем репозитории Git содержит весь код до этого момента, включая эту новую функцию /call.

Для того чтобы Twilio мог получить доступ к нашему приложению и важному маршруту /call, оно должно быть доступно публично. Для целей разработки мы можем запускать app.py локально и использовать такой инструмент, как Ngrok, для туннелирования нашего localhost в интернет.

Причина, по которой туннель localhost необходим, заключается в том, что ваша рабочая машина, скорее всего, находится за роутером, который не позволяет прямые входящие соединения к вашему приложению Flask. Мы можем обойти эту проблему с помощью сервиса туннелирования localhost, одним из которых является Ngrok. Зарегистрируйтесь в Ngrok, загрузите приложение туннеля Ngrok и установите его на вашей рабочей машине.

Запустите Ngrok на порту 5000, где работает наше приложение Flask, с помощью следующей команды. См. этот пост о настройке Ngrok, если вы работаете в Windows. В Linux и Mac OS X Ngrok можно запустить с помощью следующей команды, находясь в директории, где расположен Ngrok.

./ngrok 5000

Ngrok загрузит экран, похожий на следующий скриншот. Запомните уникальный URL переадресации https, так как он понадобится нам через минуту для настройки URL обработки входящих сообщений вашего номера Twilio.

Приложение Flask, работающее на порту 5000, теперь может быть доступно через URL переадресации, настроенный Ngrok.

Теперь мы готовы настроить номер Twilio. Вернитесь на веб-страницу Twilio и нажмите кнопку «Настроить номер» для купленного вами номера. Появится страница конфигурации с параметрами по умолчанию для голоса и сообщений, которая будет выглядеть следующим образом.

Теперь, когда приложение работает правильно, мы можем взять URL Ngrok плюс маршрут /call и вставить его в поле URL запроса Twilio, как показано на следующем скриншоте:

Позвоните на ваш номер Twilio, и вы заметите, что звонит наш единственный агент службы поддержки, Эндер (который, кстати, использует ваш мобильный телефон). Ух ты, мне жаль Эндера. Он будет перегружен почти сразу. Мало того, что ему приходится обрабатывать каждый входящий звонок, он должен отвечать на них в тот самый момент, когда они поступают. Поскольку Эндер не может контролировать, когда звонки поступают к нему, он не может даже отойти на обед, не прерываясь. Он, вероятно, даже не может спать!

Нам следует улучшить наше приложение, чтобы дать Эндеру передышку. Возможно, даже пришло время нанять более одного агента. В оставшейся части этой статьи мы покажем, как обновить вашу службу поддержки с помощью TaskRouter, чтобы сделать жизнь лучше как для Эндера, так и для ваших клиентов.

Эндер действительно голоден, он не мог взять перерыв на обед уже несколько дней. Не волнуйся, Эндер — как только мы реализуем TaskRouter, у нас появится возможность знать, когда ты или другие агенты доступны, и передавать задачи только тем, кто свободен. Если в нашей службе поддержки несколько агентов, TaskRouter может направить каждую задачу к наиболее подходящему человеку или процессу. Но прежде чем забегать вперед, давайте пройдемся по настройке TaskRouter.

Чтобы получить доступ к функциональности TaskRouter, выберите «TaskRouter» в выпадающем списке, как показано в верхнем левом углу личного кабинета Twilio.

Выбор TaskRouter приведет нас на страницу «Начало работы» с базовыми инструкциями по настройке приложения. Функциональность для настройки нашего приложения TaskRouter находится в разделе «Управление» в верхнем меню.

Начнем настройку нашего приложения TaskRouter с создания «Рабочей области». Рабочая область — это корень приложения TaskRouter. Она служит контейнером для всех остальных элементов TaskRouter. Мы можем назвать нашу рабочую область: «Моя отличная служба поддержки». Обязательно выберите «Первым пришел — первым обслужен» в качестве шаблона. Это настраивает стандартный рабочий процесс, которым мы сможем воспользоваться через несколько минут.

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

Далее нажмите на вкладку «Работники», чтобы создать запись для нашего первого агента службы поддержки — Эндера.

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

Нажмите кнопку «Создать работника». Когда страница загрузится, заполните информацию об Эндере. Дружественное имя, конечно же, должно быть «Эндер», статус активности установите на «Бездействует», а атрибуты — следующим JSON. Обязательно замените номер телефона на свой мобильный, если хотите, чтобы звонки поступали к вам для тестирования.

{«training»:[«voice»], «phone_number»:»+12025551234″}

Этот JSON сообщает TaskRouter о навыках и атрибутах нашего работника. Ваш экран должен выглядеть следующим образом, и тогда можно нажимать кнопку «Сохранить».

Теперь, когда у нас есть работники, создадим новую очередь задач. Я думаю, вы можете догадаться, что делают очереди задач… они ставят наши задачи в очередь на основе приоритета и сопоставляют их с работниками, имеющими соответствующие атрибуты. Давайте создадим новую очередь задач под названием «Техническая поддержка по телефону». Здесь нужно установить несколько параметров. Опции резервирования и назначения активности позволяют указать TaskRouter, в какое состояние должен перейти работник при резервировании и назначении. Опция целевых работников — это SQL-подобный запрос, который позволяет назначать задачи в этой очереди только работникам с определенными атрибутами. Для этой очереди задач мы хотим назначать задачи только работникам, обученным обрабатывать голосовые задачи:

Следующая часть нашего приложения TaskRouter — это рабочий процесс. Рабочие процессы анализируют задачи по мере их поступления и обеспечивают их назначение в соответствующие очереди задач. Мы обновим «Default Fifo Workflow», перейдя на вкладку рабочих процессов и выбрав рабочий процесс, созданный как часть нашей рабочей области.

На экране конфигурации рабочего процесса установите URL обратного вызова назначения на [наш-ngrok-url-переадресации]/assign. Мы еще не написали маршрут /assign, но не волнуйтесь, мы сделаем это в следующем разделе этой статьи:

Есть только две части нашего приложения TaskRouter, которые мы еще не рассмотрели — задачи и активности. Задачи — это уникальные действия, которые должны выполнить наши агенты, в нашем случае это будут телефонные звонки и SMS-сообщения. Мы будем создавать задачи программно по мере поступления звонков или SMS-сообщений в наше приложение.

Активности представляют состояние работника. По умолчанию TaskRouter создает четыре стандартные активности: Офлайн, Бездействует, Занят и Зарезервирован. Этого нам будет достаточно для нашей службы поддержки. Если Эндер решит пойти на обед, мы можем убедиться, что его статус — Офлайн, чтобы он не получал звонки.

Отличные новости! Мы только что наняли второго агента службы поддержки, Петру. Если у вас нет второго телефона для тестирования, вы можете быстро развернуть новый экземпляр Twilio Client из этого репозитория GitHub. Давайте добавим Петру как нового работника в наше приложение TaskRouter. Установите атрибуты Петры в виде аналогичной строки JSON, как у Эндера, но с другим номером телефона.

{«training»:[«voice»], «phone_number»:»+12025556789″}

Теперь мы готовы обновить нашу службу поддержки до версии 2.0. Мы обновим наше приложение Flask, чтобы оно не просто звонило Эндеру при каждом входящем звонке, а позволяло TaskRouter интеллектуально направлять этот звонок либо Эндеру, либо Петре в зависимости от того, кто доступен. Я могу только представить, как рад Эндер.

Чтобы запустить версию 2.0, нам нужно обновить код в файле app.py, начав с нескольких дополнительных импортов.

Нашему файлу app.py теперь нужна новая переменная окружения для SID рабочей области и SID рабочего процесса для нашего приложения TaskRouter. Мы также можем заменить переменную окружения SUPPORT_AGENT_NUMBER на новую SUPPORT_DESK_NUMBER, которая будет основным номером для входящих звонков в службу поддержки вместо использования номера телефона Эндера. SUPPORT_DESK_NUMBER будет номером Twilio, который мы используем для нашей службы поддержки:

Нам также нужно внести изменения в наш маршрут /call. Вместо использования глагола мы теперь будем использовать глагол . Это позволит нам передать звонок в рабочий процесс TaskRouter для размещения звонка в соответствующей очереди задач.

Предыдущий код будет обрабатывать передачу нашего звонка в наш рабочий процесс. Помните, когда мы создавали наш рабочий процесс, мы установили URL обратного вызова назначения на маршрут /assign? Давайте создадим этот маршрут, чтобы наш рабочий процесс функционировал правильно:

Каждый раз, когда работник доступен для одной из наших задач, Twilio отправляет POST-запрос на URL обратного вызова назначения. POST-запрос будет включать данные о назначении, включая атрибуты работника, которые мы определили для этого работника. Мы извлечем номер телефона работника, чтобы знать, кому звонить.

Мы отвечаем на POST-запрос от Twilio и подтверждаем назначение, передавая обратно некоторые инструкции JSON о том, что делать с этой задачей дальше. В данном случае мы используем специальную инструкцию dequeue, которая обработает звонок на номер to и соединит с нашим агентом.

Теперь мы можем протестировать наш новый рабочий процесс приложения. Давайте позвоним на наш номер и посмотрим, что произойдет. Вы заметите, что новая задача была добавлена в наши задачи:

Статус одного из наших работников также изменился. Петра теперь обрабатывает голосовой звонок!

По мере найма новых работников TaskRouter будет автоматически обеспечивать поступление звонков к соответствующему агенту (на основе навыков и доступности) в нужное время. Кстати, о работниках, кто-нибудь видел Эндера? Он уже целую вечность на обеденном перерыве!

Бизнес процветает в нашей отличной службе поддержки! Мы только что наняли еще одного агента! Познакомьтесь с Бином. Бину 19 лет, он в курсе всех модных словечек, которые используют современные подростки, и очень быстро набирает текст. Бин также может обрабатывать телефонные звонки, поэтому давайте создадим нового работника TaskRouter для Бина и дадим ему оба атрибута обучения: «sms» и «voice» с помощью следующего JSON.

{«training»:[«voice», «sms»], «phone_number»:»+14155554567″}

Наличие у Бина обучения по «sms» не означает, что он автоматически будет получать задачи по SMS. Нам все еще нужно создать новую очередь задач для входящих сообщений и настроить наш рабочий процесс для маршрутизации этих сообщений:

Нам также нужно обновить наш рабочий процесс, чтобы включить новую очередь задач. Откройте наш «Default Fifo Workflow», прокрутите вниз до конфигурации маршрутизации и нажмите «Добавить фильтр». Нам нужны два фильтра: один под названием «Входящие SMS» и другой под названием «Входящие звонки». Входящие SMS будут иметь более высокий приоритет, чем входящие звонки, чтобы Бин сначала назначался на SMS и получал звонки только в том случае, если нет входящих SMS для обработки в данный момент.

Приоритет установлен на 1 для входящих SMS и 0 для входящих звонков. Приоритет должен быть либо нулем, либо положительным целым числом. Более высокие числа указывают на более высокий приоритет.

Для обработки текстовых сообщений нам нужно добавить еще один маршрут в наше приложение Flask для обработки входящих сообщений, назовем его /message:

Давайте убедимся, что наш номер службы поддержки настроен для входящих сообщений, скопировав URL переадресации Ngrok плюс /message в поле URL запроса сообщений.

Сейчас мы просто отвечаем на входящее сообщение, но нам нужно добавить код, который создает задачу при поступлении этого сообщения. Для голосовых звонков мы добавляли задачи с помощью TwiML. Для SMS давайте добавим задачи с помощью REST API TaskRouter через библиотеку Python. Сначала нам нужно импортировать TwilioTaskRouterClient, новый клиент для работы с TaskRouter.

Теперь мы можем использовать наш TaskRouterClient для программного создания новой задачи. Мы хотим убедиться, что наша задача имеет все необходимые атрибуты, чтобы Бин мог ее обработать. Эти атрибуты — номер телефона (чтобы он знал, с кем связаться) и текст сообщения (чтобы он знал, о чем спрашивает человек):

Нам нужно обновить наш маршрут /assign, чтобы наш рабочий процесс правильно поддерживал SMS. Мы посмотрим на атрибут обучения, который установили при создании наших задач, чтобы понять, является ли это SMS-сообщением. Если да, мы будем использовать Twilio для пересылки вопроса любому агенту, назначенному на задачу:

Когда работник поддерживает клиентов по телефону, мы знаем, что он снова доступен после окончания звонка. Для SMS нам нужен механизм, чтобы Бин (или любой другой агент) мог сообщить нам, что он завершил задачу. Если бы мы действовали по самому простому сценарию, агент мог бы обновлять свой статус непосредственно в панели управления TaskRouter, но это не наш стиль в нашей отличной службе поддержки. Давайте добавим код в наш конечный пункт /message, который обнаруживает, когда один из наших работников отправляет слово «ГОТОВО» и закрывает задачи за нас:

Попробуйте еще раз позвонить или отправить текстовое сообщение на номер вашей службы поддержки и посмотрите все в действии.

За один день многое изменилось в нашей службе поддержки. Сегодня утром Эндер выглядел так. Но посмотрите на всех наших агентов сейчас. Стол Бина завален пустыми пакетами из-под Doritos, так как он с энтузиазмом отвечает на эти новые модные текстовые сообщения от клиентов. Петра и Эндер обмениваются «пятеркой», так как Эндер наконец-то вернулся с обеда. И самое главное, наши клиенты довольны. С помощью TaskRouter мы создали интеллектуальное приложение, которое позволяет нам сегментировать входящие обращения клиентов и соединять клиентов с нужным агентом в нужное время.

Что дальше? Вы можете добавить любой входящий канал, через который ваши клиенты хотят с вами общаться, используя созданный сегодня шаблон: Email, Facebook, Google Forms, Slack, HipChat. Как вы собираетесь использовать TaskRouter, чтобы сделать ваш код и бизнес более эффективными? Дайте нам знать в комментариях или напишите нам в Twitter (@mattmakai или @rickyrobinett).