Biblioteca de clientes do Pacote de Chat de Comunicação do Azure para Python – versão 1.2.0
Esse pacote contém um SDK do Python para Serviços de Comunicação do Azure para Chat. Leia mais sobre Serviços de Comunicação do Azure aqui
Código-fonte | Pacote (Pypi) | Pacote (Conda) | Documentação | de referência da APIDocumentação do produto
Aviso de isenção de responsabilidade
O suporte a pacotes python do SDK do Azure para Python 2.7 terminou em 01 de janeiro de 2022. Para obter mais informações e tirar dúvidas, consulte https://github.com/Azure/azure-sdk-for-python/issues/20691
Introdução
Pré-requisitos
- É necessário ter o Python 3.7 ou posterior para usar esse pacote.
- Um recurso dos Serviços de Comunicação implantado. Você pode usar o Portal do Azure ou o Azure PowerShell para configurá-lo.
Instalar o pacote
Instale o SDK de Chat do Serviço de Comunicação do Azure.
pip install --pre azure-communication-chat
Tokens de acesso do usuário
Os tokens de acesso do usuário permitem que você crie aplicativos cliente que se autenticam diretamente nos Serviços de Comunicação do Azure. Você pode gerar esses tokens com o módulo azure.communication.identity e usá-los para inicializar os SDKs dos Serviços de Comunicação. Exemplo de uso de azure.communication.identity:
pip install azure-communication-identity
from azure.communication.identity import CommunicationIdentityClient
identity_client = CommunicationIdentityClient.from_connection_string("<connection string of your Communication service>")
user = identity_client.create_user()
tokenresponse = identity_client.get_token(user, scopes=["chat"])
token = tokenresponse.token
O user
criado acima será usado posteriormente, pois esse usuário deve ser adicionado como participante de um novo thread de chat ao criá-lo com esse token. Isso ocorre porque o iniciador da solicitação de criação deve estar na lista dos participantes do thread de chat.
Criar o cliente de chat
Isso permitirá que você crie, obtenha, liste ou exclua threads de chat.
from azure.communication.chat import ChatClient, CommunicationTokenCredential
# Your unique Azure Communication service endpoint
endpoint = "https://<RESOURCE_NAME>.communcationservices.azure.com"
chat_client = ChatClient(endpoint, CommunicationTokenCredential(token))
Criar cliente de thread de chat
O ChatThreadClient permitirá que você execute operações específicas a um thread de chat, como enviar mensagem, receber mensagem, atualizar o tópico do thread de chat, adicionar participantes ao thread de chat etc.
Você pode obtê-lo criando um novo thread de chat usando ChatClient:
create_chat_thread_result = chat_client.create_chat_thread(topic)
chat_thread_client = chat_client.get_chat_thread_client(create_chat_thread_result.chat_thread.id)
Além disso, o cliente também pode direcionar para que a solicitação seja repetível; ou seja, se o cliente fizer a solicitação várias vezes com o mesmo Idempotency-Token e retornar uma resposta apropriada sem que o servidor execute a solicitação várias vezes. O valor do Idempotency-Token é uma cadeia de caracteres opaca que representa um identificador gerado pelo cliente, globalmente exclusivo para todos os tempos, para a solicitação.
create_chat_thread_result = chat_client.create_chat_thread(
topic,
thread_participants=thread_participants,
idempotency_token=idempotency_token
)
chat_thread_client = chat_client.get_chat_thread_client(create_chat_thread_result.chat_thread.id)
Como alternativa, se você tiver criado um thread de chat antes e tiver seu thread_id, poderá criá-lo por:
chat_thread_client = chat_client.get_chat_thread_client(thread_id) # thread_id is the id of an existing chat thread
Principais conceitos
Uma conversa de chat é representada por um thread de chat. Cada usuário no thread é chamado de participante do thread. Os participantes do thread podem conversar entre si em particular em um chat 1:1 ou se amontoar em um chat em grupo 1:N. Os usuários também recebem atualizações quase em tempo real para quando outras pessoas estão digitando e quando leem as mensagens.
Depois de inicializar uma ChatClient
classe, você poderá fazer as seguintes operações de chat:
Criar, obter, atualizar e excluir threads
Executar operações CRD(Create-Read-Delete) em threads
create_chat_thread(topic, **kwargs)
list_chat_threads(**kwargs)
delete_chat_thread(thread_id, **kwargs)
Depois de inicializar uma ChatThreadClient
classe, você poderá fazer as seguintes operações de chat:
Atualizar thread
Executar operação de atualização no tópico do thread
update_topic(topic, **kwargs)
Obter propriedades de thread de chat
get_properties(**kwargs)
Enviar, obter, atualizar e excluir mensagens
Executar operações CRUD(Create-Read-Update-Delete) em mensagens
send_message(content, **kwargs)
get_message(message_id, **kwargs)
list_messages(**kwargs)
update_message(message_id, content, **kwargs)
delete_message(message_id, **kwargs)
Obter, adicionar e remover participantes
Executar operações CRD(Create-Read-Delete) em participantes do thread
list_participants(**kwargs)
add_participants(thread_participants, **kwargs)
remove_participant(participant_identifier, **kwargs)
Enviar uma notificação de digitação
Notificar o serviço de notificação de digitação
send_typing_notification(**kwargs)
Enviar e obter recibo de leitura
Notifique o serviço de que uma mensagem é lida e obter uma lista de mensagens de leitura.
send_read_receipt(message_id, **kwargs)
list_read_receipts(**kwargs)
Exemplos
As seções a seguir fornecem vários snippets de código que abrangem algumas das tarefas mais comuns, incluindo:
Operações de thread
Criar um thread
Use o método create_chat_thread
para criar uma conversa de chat.
- Use
topic
, obrigatório, para fornecer um tópico de thread; - Use
thread_participants
, opcional, para fornecer uma lista aChatParticipant
ser adicionada ao thread;user
, obrigatório, é oCommunicationUserIdentifier
que você criou por CommunicationIdentityClient.create_user() de Tokens de Acesso do Usuário
display_name
, opcional, é o nome de exibição do participante do thread.share_history_time
, opcional, é o horário no qual o histórico do chat é compartilhado com o participante.
- Use
idempotency_token
, opcional, para especificar o identificador exclusivo para a solicitação.
CreateChatThreadResult
é o resultado retornado pela criação de um thread; você pode usá-lo para buscar o id
do thread de chat que foi criado. Esse id
pode ser usado para buscar um objeto ChatThreadClient
usando o método get_chat_thread_client
. ChatThreadClient
pode ser usado para executar outras operações de chat para esse thread de chat.
# Without idempotency_token and thread_participants
topic = "test topic"
create_chat_thread_result = chat_client.create_chat_thread(topic)
chat_thread_client = chat_client.get_chat_thread_client(create_chat_thread_result.chat_thread.id)
# With idempotency_token and thread_participants
from azure.communication.identity import CommunicationIdentityClient
from azure.communication.chat import ChatParticipant, ChatClient, CommunicationTokenCredential
import uuid
from datetime import datetime
# create an user
identity_client = CommunicationIdentityClient.from_connection_string('<connection_string>')
user = identity_client.create_user()
# user access tokens
tokenresponse = identity_client.get_token(user, scopes=["chat"])
token = tokenresponse.token
## OR pass existing user
# from azure.communication.chat import CommunicationUserIdentifier
# user_id = 'some_user_id'
# user = CommunicationUserIdentifier(user_id)
# create the chat_client
endpoint = "https://<RESOURCE_NAME>.communcationservices.azure.com"
chat_client = ChatClient(endpoint, CommunicationTokenCredential(token))
# modify function to implement customer logic
def get_unique_identifier_for_request(**kwargs):
res = uuid.uuid4()
return res
topic = "test topic"
thread_participants = [ChatParticipant(
identifier=user,
display_name='name',
share_history_time=datetime.utcnow()
)]
# obtains idempotency_token using some customer logic
idempotency_token = get_unique_identifier_for_request()
create_chat_thread_result = chat_client.create_chat_thread(
topic,
thread_participants=thread_participants,
idempotency_token=idempotency_token)
thread_id = create_chat_thread_result.chat_thread.id
# fetch ChatThreadClient
chat_thread_client = chat_client.get_chat_thread_client(create_chat_thread_result.chat_thread.id)
# Additionally, you can also check if all participants were successfully added or not
# and subsequently retry adding the failed participants again
def decide_to_retry(error, **kwargs):
"""
Insert some custom logic to decide if retry is applicable based on error
"""
return True
retry = [thread_participant for thread_participant, error in create_chat_thread_result.errors if decide_to_retry(error)]
if retry:
chat_thread_client.add_participants(retry)
Obter um thread
O método get_properties
recupera um ChatThreadProperties
do serviço; thread_id
é a ID exclusiva do thread.
chat_thread_properties = chat_thread_client.get_properties()
Listar threads de chat
O método Use list_chat_threads
recupera a lista de threads de chat criados
- Use
results_per_page
, opcional, o número máximo de mensagens a serem retornadas por página. - Use
start_time
, opcional, a hora de início em que a consulta de intervalo.
Um iterador de [ChatThreadItem]
é a resposta retornada pela listagem de threads
from azure.communication.chat import ChatClient, CommunicationTokenCredential
from datetime import datetime, timedelta
token = "<token>"
endpoint = "https://<RESOURCE_NAME>.communcationservices.azure.com"
chat_client = ChatClient(endpoint, CommunicationTokenCredential(token))
start_time = datetime.utcnow() - timedelta(days=2)
chat_threads = chat_client.list_chat_threads(results_per_page=5, start_time=start_time)
for chat_thread_item_page in chat_threads.by_page():
for chat_thread_item in chat_thread_item_page:
print("thread id:", chat_thread_item.id)
Atualizar um tópico de thread
Use update_topic
o método para atualizar as propriedades de um thread. topic
é usado para descrever a alteração do tópico de thread
- Use
topic
para dar ao thread um novo tópico;
topic = "new topic"
chat_thread_client.update_topic(topic=topic)
chat_thread = chat_thread_client.get_properties(thread_id)
assert chat_thread.topic == topic
Excluir um thread
Use delete_chat_thread
o método para excluir um thread; thread_id
é a ID exclusiva do thread.
- Use
thread_id
, que é obrigatório, para especificar a ID exclusiva do thread.
chat_client.delete_chat_thread(thread_id=thread_id)
Operações de mensagem
Enviar uma mensagem
Use send_message
o método para enviar uma mensagem para um thread identificado por thread_id
.
- Use
content
, obrigatório, para fornecer o conteúdo da mensagem de chat. - Use
chat_message_type
, opcional, para fornecer o tipo de mensagem de chat. Os valores possíveis incluem:ChatMessageType.TEXT
,ChatMessageType.HTML
,'text'
,'html'
; se não for especificado,ChatMessageType.TEXT
será definido - Use
sender_display_name
,opcional, para especificar o nome de exibição do remetente, se não for especificado, o nome vazio será definido
SendChatMessageResult
é a resposta retornada do envio de uma mensagem; ela contém uma ID, que é a ID exclusiva da mensagem.
from azure.communication.chat import ChatMessageType
topic = "test topic"
create_chat_thread_result = chat_client.create_chat_thread(topic)
thread_id = create_chat_thread_result.chat_thread.id
chat_thread_client = chat_client.get_chat_thread_client(create_chat_thread_result.chat_thread.id)
content='hello world'
sender_display_name='sender name'
chat_message_type = ChatMessageType.TEXT
# without specifying sender_display_name and chat_message_type
send_message_result = chat_thread_client.send_message(content)
send_message_result_id = send_message_result.id
print("Message sent: id: ", send_message_result_id)
# specifying sender_display_name and chat_message_type
send_message_result_w_type = chat_thread_client.send_message(
content,
sender_display_name=sender_display_name,
chat_message_type=chat_message_type # equivalent to chat_message_type = 'text'
)
send_message_result_w_type_id = send_message_result_w_type.id
print("Message sent: id: ", send_message_result_w_type_id)
Obter uma mensagem
O método Use get_message
recupera uma mensagem do serviço; message_id
é a ID exclusiva da mensagem.
- Use
message_id
,required, para especificar a ID de mensagem de uma mensagemChatMessage
existente é a resposta retornada da obtenção de uma mensagem, ela contém uma ID, que é a ID exclusiva da mensagem e outros campos, consulte azure.communication.chat.ChatMessage
chat_message = chat_thread_client.get_message(message_id=send_message_result_id)
print("get_chat_message succeeded, message id:", chat_message.id, "content: ", chat_message.content)
Listar mensagens
O método Use list_messages
recupera mensagens do serviço.
- Use
results_per_page
, opcional, o número máximo de mensagens a serem retornadas por página. - Use
start_time
, opcional, a hora de início em que a consulta de intervalo.
Um iterador de [ChatMessage]
é a resposta retornada pela listagem de mensagens
from datetime import datetime, timedelta
start_time = datetime.utcnow() - timedelta(days=1)
chat_messages = chat_thread_client.list_messages(results_per_page=1, start_time=start_time)
for chat_message_page in chat_messages.by_page():
for chat_message in chat_message_page:
print("ChatMessage: Id=", chat_message.id, "; Content=", chat_message.content.message)
Atualizar uma mensagem
Use update_message
para atualizar uma mensagem identificada por threadId e messageId.
- Use
message_id
, que é obrigatório e é a ID exclusiva da mensagem. - Use
content
, que é opcional e é o conteúdo da mensagem a ser atualizado; se não for especificado, será atribuído como vazio
content = "updated message content"
chat_thread_client.update_message(send_message_result_id, content=content)
chat_message = chat_thread_client.get_message(message_id=send_message_result_id)
assert chat_message.content.message == content
Excluir uma mensagem
Use delete_message
para excluir uma mensagem.
- Use
message_id
, obrigatório, é a ID exclusiva da mensagem.
chat_thread_client.delete_message(message_id=send_message_result_id)
Operações do participante do thread
Listar participantes do thread
Use list_participants
para recuperar os participantes do thread de chat.
- Use
results_per_page
, opcional, o número máximo de participantes a serem retornados por página. - Use
skip
, opcional, para ignorar participantes até uma posição especificada em resposta.
Um iterador de [ChatParticipant]
é a resposta retornada pela listagem de participantes
chat_participants = chat_thread_client.list_participants(results_per_page=5, skip=5)
for chat_participant_page in chat_participants.by_page():
for chat_participant in chat_participant_page:
print("ChatParticipant: ", chat_participant)
Adicionar participantes do thread
Use o add_participants
método para adicionar participantes de thread ao thread.
- Use
thread_participants
, obrigatório, para listar oChatParticipant
a ser adicionado ao thread;user
, obrigatório, é oCommunicationUserIdentifier
que você criou por CommunicationIdentityClient.create_user() de Tokens de Acesso do Usuário
display_name
, opcional, é o nome de exibição do participante do thread.share_history_time
, opcional, é o horário no qual o histórico do chat é compartilhado com o participante.
Um list(tuple(ChatParticipant, ChatError))
é retornado. Quando o participante é adicionado com êxito, uma lista vazia é esperada. No caso de um erro encontrado ao adicionar o participante, a lista é populada com os participantes com falha, em conjunto com o erro que foi encontrado.
from azure.communication.identity import CommunicationIdentityClient
from azure.communication.chat import ChatParticipant
from datetime import datetime
# create 2 users
identity_client = CommunicationIdentityClient.from_connection_string('<connection_string>')
new_users = [identity_client.create_user() for i in range(2)]
# # conversely, you can also add an existing user to a chat thread; provided the user_id is known
# from azure.communication.chat import CommunicationUserIdentifier
#
# user_id = 'some user id'
# user_display_name = "Wilma Flinstone"
# new_user = CommunicationUserIdentifier(user_id)
# participant = ChatParticipant(
# identifier=new_user,
# display_name=user_display_name,
# share_history_time=datetime.utcnow())
participants = []
for _user in new_users:
chat_participant = ChatParticipant(
identifier=_user,
display_name='Fred Flinstone',
share_history_time=datetime.utcnow()
)
participants.append(chat_participant)
response = chat_thread_client.add_participants(thread_participants=participants)
def decide_to_retry(error, **kwargs):
"""
Insert some custom logic to decide if retry is applicable based on error
"""
return True
# verify if all users has been successfully added or not
# in case of partial failures, you can retry to add all the failed participants
retry = [p for p, e in response if decide_to_retry(e)]
if retry:
chat_thread_client.add_participants(retry)
Remover participante do thread
Use o método remove_participant
para remover o participante da conversa identificada por threadId.
identifier
é o CommunicationUserIdentifier
que você criou por CommunicationIdentityClient.create_user() de azure-communication-identity
e foi adicionado a esse thread de chat.
- Use
identifier
para especificar oCommunicationUserIdentifier
que você criou
chat_thread_client.remove_participant(identifier=new_user)
# # conversely you can also do the following; provided the user_id is known
# from azure.communication.chat import CommunicationUserIdentifier
#
# user_id = 'some user id'
# chat_thread_client.remove_participant(identifier=CommunicationUserIdentifier(new_user))
Operações de eventos
Enviar uma notificação de digitação
Use send_typing_notification
o método para postar um evento de notificação de digitação em um thread, em nome de um usuário.
chat_thread_client.send_typing_notification()
Enviar confirmação de leitura
Use send_read_receipt
o método para postar um evento de confirmação de leitura em um thread, em nome de um usuário.
- Use
message_id
para especificar a ID da mensagem cujo recibo de leitura deve ser enviado
content='hello world'
send_message_result = chat_thread_client.send_message(content)
send_message_result_id = send_message_result.id
chat_thread_client.send_read_receipt(message_id=send_message_result_id)
Listar confirmações de leitura
O método Use list_read_receipts
recupera recibos de leitura para um thread.
- Use
results_per_page
, opcional, o número máximo de recibos de leitura a serem retornados por página. - Use
skip
,opcional, para ignorar recibos de leitura até uma posição especificada em resposta.
Um iterador de [ChatMessageReadReceipt]
é a resposta retornada pela listagem dos recibos de leitura
read_receipts = chat_thread_client.list_read_receipts(results_per_page=5, skip=5)
for read_receipt_page in read_receipts.by_page():
for read_receipt in read_receipt_page:
print(read_receipt)
print(read_receipt.sender)
print(read_receipt.chat_message_id)
print(read_receipt.read_on)
Exemplo de código
Estes são exemplos de código que mostram operações de cenário comuns com a biblioteca de clientes do Chat de Comunicação do Azure.
As versões assíncronas dos exemplos (os arquivos de exemplo do Python acrescentados com _async
) mostram operações assíncronas.
Antes de executar o código de exemplo, consulte Pré-requisitos
para criar um recurso e, em seguida, definir algumas Variáveis de Ambiente
set AZURE_COMMUNICATION_SERVICE_ENDPOINT="https://<RESOURCE_NAME>.communcationservices.azure.com"
set COMMUNICATION_SAMPLES_CONNECTION_STRING="<connection string of your Communication service>"
pip install azure-communication-identity
python samples\chat_client_sample.py
python samples\chat_client_sample_async.py
python samples\chat_thread_client_sample.py
python samples\chat_thread_client_sample_async.py
Solução de problemas
Está com problemas? Esta seção deve conter detalhes sobre o que fazer lá.
Próximas etapas
Mais código de exemplo deve ir aqui, juntamente com links para os testes de exemplo apropriados.
Participante
Se você encontrar bugs ou tiver sugestões, registre um problema na seção Problemas do projeto.
Azure SDK for Python