Twilio и Python друзья навек - 2
Продолжим наш экскурс в Twilio Programmable Chat
В прошлой статье мы рассмотрели некоторые аспекты работы с чат-сервисом от Twilio.
Создание Service внутри которого существуют и общаются все его пользователи легко автоматизировать. А мы двинемся дальше.
Не полагаясь на сознательность своих будущих пользователей мы озаботились тем, чтобы создать внутри каждого Сервиса определённую инфраструктуру.
Для каждой компании в её сервисе мы создаём общий для всех канал. Назовём его "common". Помимо этого мы, создав пользователей, добавим каждого пользователя в этот канал. Это будет точка общения всех пользователей, возможность написать сразу всем. Что не отменяет (если мы не запретим) возможности создавать свои собственные каналы и приглашать туда других сотрудников компании-клиента.
Credentials
Для создания Сервиса нам нужны глобальные, наши, sid и token. Про них я уже писал. А вот для дальнейших манипуляций внутри Сервиса нам всегда нужен будет его собственный, канала, sid. Он имеет вид ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
.
Поэтому есть необходимость дополнить код функции create_twilio_service
из предыдущей статьи. Добавим вызов save_important_info
. Куда вы будете сохранять эту информацию для последующего использования - вам решать. Я сохраняю в БД, поскольку мой проект - на DRF.
Примечание редактора. Немного об этом фреймворке вы можете почитать в этом материале
# дополняем пример из прошлой статьи, поэтому здесь - только изменения
def save_important_info(*args, **kwargs):
# берём из kwargs нужный параметр и сохраняем
# в любимое место. Возвращаемое значение - по вкусу.
return True
def create_twilio_service(name):
account, token = get_twilio_credentials()
client = Client(account, token)
service = client.chat.services.create(
friendly_name=name
)
save_important_info(
service_sid=service.sid
)
service.update(reachability_enabled=True)
Если в предыдущей версии twilio-python
(v.5) все функции возвращали ответ в виде словаря, то теперь это объект. Для меня это создало небольшие трудности при переходе на v.6 из-за того, что я сохранял полученный словарь целиком в JSON-поле БД для дальнейшего анализа. В нашем же примере мы просто берём и сохраняем то, что нам точно будет нужно: service.sid
.
Channel
Теперь можно приступить собственно к созданию канала. Это достаточно просто. Не будем повторять то, что написали раньше, а добавим новое:
def get_saved_info(company):
# откуда-то вытаскиваем
return {"service_sid": sid}
def create_twilio_channel(company):
account, token = get_twilio_credentials()
client = Client(account, token)
service = client.chat.services(
get_saved_info(company)['service_sid']
).fetch()
unique_name = "Org:{}:{}".format('common', company.id)
channel = service.channels.create(
friendly_name='common',
unique_name=unique_name
)
В функции create_twilio_channel
всё достаточно прозрачно: получили учётные данные, извлекли из недр своего хранилища sid
сервиса той компании-клиента, которую передаём в параметрах, получили сам сервис (.fetch()
).
Затем создаём канал.
Помимо friendly_name
и unique_name
можно передать тип канала (type
- public
или private
. По умолчанию public
), в параметре created_by
можно передать пользователя, от имени которого создаётся канал (по умолчанию это system
).
Так же есть параметр attributes
- не валидируемый (в смысле содержания, а не формы) JSON. Это "точка гибкости", если так можно выразится. Тут вы можете создавать дополнительные параметры по своему усмотрению. Параметр attributes
присутствует почти во всех сущностях Programmable Chat и хорошо подходит для того, чтобы хранить ссылки на аватарку, topic (тему канала), проставлять какие-то дополнительные метки и всё, что вам ещё потребуется.
Имена
Отдельно хочу остановиться на именах. С friendly_name
мы уже сталкивались. Это отображаемое имя и с этим всё ясно. А вот unique_name
- важная часть создаваемой инфраструктуры.
Уникальное имя - это второй по важности параметр для идентификации сущностей после sid
. Именно по нему происходит связывание User
и Member
, но об этом в следующих статьях.
В своём проекте я создаю unique_name
по определённым правилам. Для канала common
это сочетание строки Org
(канал не личный, а общий для компании), названия канала и id
компании.
Вы можете придумать любую свою схему, подразумевающую уникальность.
Вот, к примеру список сервисов:
http://dl4.joxi.net/drive/2017/11/06/0000/2742/64182/82/7abc355789.png
Зайдя в сервис переходим к каналам:
И, вот, некоторые каналы:
http://dl4.joxi.net/drive/2017/11/06/0000/2742/64182/82/07709de9ad.png
Я выделил колонку, в которой отображается авторство. Видно, что канал friendly_name: jj
создан не системой, а пользователем с уникальным именем Dsp:5:6
Правильно спланированные уникальные имена позволяют легче ориентироваться в том, что видно в Dashboard и в том, как взаимодействуют разные части сервиса.
Далее
Ну а далее мы рассмотрим создание пользователя и включение его в канал.
За сим пока откланиваюсь
Ваш @guest007