Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
vp-webdev
6 лет назад

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

0
168.976 GOLOS
На Golos с August 2017
Комментарии (1)
Сортировать по:
Сначала старые