isoBot - Botmaker
Integração do isoCRM com o chatbot da Botmaker
Webhook
URL para o qual o webhook irá enviar as mensagens: https://[host]/isocrmisobot/conversationalflowsiso2chatbot.asocialmediawebhooknew.aspx
Parâmetros
Parâmetro: ISOCHATBOT
Detalhe: CONVERSATIONALFLOW
Valor: ConversationalFlowsISO2
Detalhe: ENCERRAMENTO_CHAT
Valor: Intensão de encerramento de chat. "Encerramento da conversa".
Parâmetro: ISOMOTORPESQUISA
Detalhe: ACAO_ENCERRAR_NPS
Valor: Nome da ação criada na botmaker, conforme print anexado. Ex.: "Encerrar nps"
Usuário de acesso e sessão
Para efetuar as requisições nas api's do isoCRM é necessário criar um usuário para que tenha sessão de acesso.
O usuário deverá ser criado com um login específico e um código de sessão gerado manualmente, pois o mesmo deverá ser configurado na plataforma da Botmaker.
Usuário para acesso: ISOCHATBOT
A sessão deverá ser gerada manualmente com caracteres aleatórios com no máximo 32 caracteres.
Após gerar o código de sessão, é necessário cadastrá-lo em um parâmetro, desta forma:
Parâmetro: ISOTOKEN
Detalhe: ISOCHATBOT (Login do usuário do isoChatBot)
Valor: XXXXXXXXXXXXXXX (Código da sessão gerada menualmente)
Após é necessário configurar o código da sessão na plataforma da Botmaker como uma constante.
Logado na plataforma da Botmaker, acessar o menu:
Bots - Variáveis e Constantes - Aba Constantes - New constant
Adicionar uma constante da seguinte forma:
id: apiKey
Nome: apiKey
Tipo: string
Valor: Código da sessão gerada manualmente
Direcionamento para atendimento humano por "setor"
Para o direcionamento ao atendimento humano por setor, existem duas formas; Classificação chat pré-definida e classificação dinâmica.
Classificação chat pré-definida
Para essa forma de direcionamento é necessário construir o fluxo da seguinte forma:
Definir quais são os "setores", conforme as classificações previamente cadastradas e configuradas no isoCRM, obter os códigos de cada classificação cadastrar para relacionar com a opção do menu de atendimento e adicionar as ações conforme a seguir:
Botão opção do menu.
Definir mensagem para informar a transferência para o atendimento.
Definir variável com o código da classificação chat referente à opção do menu.
Ação de código para vincular a classificação ao chat. api_isoRegistraClassificacaoChat.
Ação Mute chatbot. Ação para interromper o chatbot.
Classificação chat dinâmica
Para esse tipo de direcionamento o isobot irá listar todas as classificações chat disponíveis para atendimento humano:
Para habilitar uma classificação chat para atendimento humano e ficar disponível no menu, exstem duas formas:
Campo "mostrar sala" no cadastro da classificação chat.
Desta forma a api que lista as classificações chat irá verificar esse campo e gerar a opção de menu.
2. Parâmetro ISOCHATBOT_ATENDIMENTO.
É necessário cadastrar os detalhes e valores conforme a descrição da classificação chat e seu código.
Exemplo:
Detalhe: Atendimento
Valor: Código da classificação chat referente ao atendimento.
Detalhe: Suporte
Valor: Código da classificação chat referente ao suporte.
Detalhe: Comercial
Valor: Código da classificação chat referente ao comercial.
Detalhamento do fluxo
Opção do menu para atendimento
Ação de código para listar as classificações chat disponíveis. Usando a api: api_isoClassificacaoChat.
Entrada de usuário por formulário. Aqui onde será listado o menu de opções com as classificações chat.
Ação de código para vincular a classificação ao chat. api_isoRegistraClassificacaoChat.
Ação Mute chatbot. Ação para interromper o chatbot.
Fluxo - chatbot
- Mutar o bot
- Rotarnar bot
Fluxo necessário para o caso quando o atendimento humano não esteja disponível. Após retornar a mensagem de indisponibilidade, deverá retornar opções para o usuário ir para algum bloco do fluxo ou encerrar.
Sugestão de fluxo:
Linguagem natural: Retornar bot
Ação: Unmute chatbot
Menu: Ajudo em algo mais?
Botão: Sim
Ação ir para um bloco: Fluxo: Principal / Bloco: Menu inicial
Botão: Não
Ação ir para um bloco: Fluxo: Encerramento da conversa / Bloco: Encerramento da conversa
- Encerrar pesquisa NPS
api - Consulta pedido
Ações de código na Botmaker: api_isoPedido
api do isoCRM para consulta de pedidos: https://[host]/isocrmisoapi/rest/WSISOInt_ISOPvBuscaPedido
Variáveis de entrada:
clienteCPF;
pedidoCod;
Variáveis de saída:
pedidoSit; Situação do pedido.
pedidoTotal; Valor total do pedido.
pedidoItens; Relação dos itens do pedido com código e descrição do produto, quantidade e valor unitário.
msgErro; Mensagem de erro.
Código fonte da ação de código api_isoPedido do tipo Usuário;
//@constant('Use external service URI')
const URI = 'https://sandbox.isocrm.com.br/isocrmisoapi/rest/WSISOInt_ISOPvBuscaPedido';
//@constant('Use http method (POST, GET, PUT...)')
const METHOD = 'POST';
//@constant('Authentication key. Only if the service requires')
const AUTHENTICATION = JSON.parse(context.userData.constants)[`apiKey`];
//@constant('Variable where the response will be stored')
const BM_RESULT_VAR_NAME = 'response_variable'
const IS_TEST = user.get('botmakerEnvironment') === 'DEVELOPMENT';
const CUSTOMER_ID = context.userData._id_;
const OUTPUTS = {
log: (text) => { IS_TEST ? result.text(text) : bmconsole.log(text); },
};
const postData = {
sessao: JSON.parse(context.userData.constants)[`apiKey`],
CPFCNPJStr: user.get('clienteCPF'),
ISOPvPed_Codigo: user.get('pedidoCod')
};
const callServiceApiRest = () => {
return rp({
method: METHOD,
uri: URI,
json: true,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
"Authorization": AUTHENTICATION,
},
body: postData,
});
}
const main = async() => {
const response = await callServiceApiRest();
user.set('pedidoSit', response.Pedido[`Status`]);
user.set('pedidoTotal', response.Pedido[`ValorTotal`]);
user.set('msgErro', response.msgerro);
let text ='';
for (let i = 0; i < response.Pedido[`itens`].length; i++) {
text += response.Pedido[`itens`][i][`Produto`] + ` - ` + response.Pedido[`itens`][i][`Descricao`] + ` Qtd: ` + response.Pedido[`itens`][i][`Quantidade`] + ` Vlr: ` + response.Pedido[`itens`][i][`Valor`] + `\n`;
}
user.set('pedidoItens', text);
};
main()
.catch((err) => {
// Code on error
const errorMessage = `[Integration with api rest] : Error - ${CUSTOMER_ID} - ${err.message}`;
user.set('ca_error', errorMessage);
OUTPUTS.log(errorMessage);
})
.finally(result.done);
api - Consulta atendimento
Ações de código na Botmaker: api_isoSAC
api do isoCRM para consulta de atendimentos: https://[host]/isocrmisoapi/rest/WSISOInt_ISOSABuscaAtendimento
Variáveis de entrada:
clienteCPF;
atendimentoCod;
Variáveis de saída:
atendimentoSit; Situação do atendimento.
atendimentoDsc; Descrição do atendimento.
atendimentoSolucao; Descrição da solução do atendimento.
msgErro; Mensagem de erro.
Código fonte da ação de código api_isoSAC do tipo Usuário;
//@constant('Use external service URI')
const URI = 'https://sandbox.isocrm.com.br/isocrmisoapi/rest/WSISOInt_ISOSABuscaAtendimento';
//@constant('Use http method (POST, GET, PUT...)')
const METHOD = 'POST';
//@constant('Authentication key. Only if the service requires')
const AUTHENTICATION = user.get('isosessao'); //JSON.parse(context.userData.constants)[`apiKey`];
//@constant('Variable where the response will be stored')
const BM_RESULT_VAR_NAME = 'response_variable';
const IS_TEST = user.get('botmakerEnvironment') === 'DEVELOPMENT';
const CUSTOMER_ID = context.userData._id_;
const OUTPUTS = {
log: (text) => { IS_TEST ? result.text(text) : bmconsole.log(text); },
};
const postData = {
sessao: JSON.parse(context.userData.constants)[`apiKey`],
CPFCNPJStr: user.get('clienteCPF'),
ISOSAAte_Codigo: user.get('atendimentoCod')
};
const callServiceApiRest = () => {
return rp({
method: METHOD,
uri: URI,
json: true,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
"Authorization": AUTHENTICATION,
'token':AUTHENTICATION
},
body: postData,
});
};
const main = async() => {
const response = await callServiceApiRest();
user.set('atendimentoSit', response.Atendimento[`Status`]);
user.set('atendimentoDsc', response.Atendimento[`Descricao`]);
user.set('atendimentoSolucao', response.Atendimento[`Solucao`]);
user.set('msgErro', response.msgerro);
};
main()
.catch((err) => {
// Code on error
const errorMessage = `[Integration with api rest] : Error - ${CUSTOMER_ID} - ${err.message}`;
user.set('ca_error', errorMessage);
OUTPUTS.log(errorMessage);
})
.finally(result.done);
api - Lista classificação chat
Ações de código na Botmaker: api_isoClassificacaoChat
api do isoCRM para consulta de atendimentos: https://[host]/isocrmisoapi/rest/WSR_ISOClassificacaoChat_isoBot
Necessário sessão para a requisição.
Constante utilizada:
apiKey;
Variáveis utilizadas:
retornoClassChat;
classChatJSON
Código fonte da ação de código api_isoClassificacaoChat do tipo Usuário;
//@constant('Use external service URI')
const URI = 'https://sandbox.isocrm.com.br/isocrmisoapi/rest/WSR_ISOClassificacaoChat_isoBot';
//@constant('Use http method (POST, GET, PUT...)')
const METHOD = 'POST';
//@constant('Authentication key. Only if the service requires')
const AUTHENTICATION = '';
//@constant('Variable where the response will be stored')
const BM_RESULT_VAR_NAME = 'response_variable';
const IS_TEST = user.get('botmakerEnvironment') === 'DEVELOPMENT';
const CUSTOMER_ID = context.userData._id_;
const postData = {
sessao: JSON.parse(context.userData.constants)[`apiKey`]
};
const OUTPUTS = {
log: (text) => { IS_TEST ? result.text(text) : bmconsole.log(text); },
};
const callServiceApiRest = () => {
return rp({
method: METHOD,
uri: URI,
json: true,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
},
body: postData
});
};
const main = async() => {
const response = await callServiceApiRest();
let text ='';
let myJSONList = [];
let myJSONListCod = [];
let opcoesAtendimento =[];
let opcoesAtendimentoCod =[];
user.set('retornoClassChat', JSON.stringify(response.retorno));
for (let i = 0; i < response.retorno.length; i++) {
opcoesAtendimento[i] = response.retorno[i][`Classificacao`];
}
opcoesAtendimento[response.retorno.length] = 'Voltar';
myJSONList = opcoesAtendimento.map((classificacao, index) => { return { id: index, name: classificacao }; });
user.set('classChatJSON', JSON.stringify(myJSONList));
result.done();
};
main()
.catch((err) => {
// Code on error
const errorMessage = `[Integration with api rest] : Error - ${CUSTOMER_ID} - ${err.message}`;
user.set('ca_error', errorMessage);
OUTPUTS.log(errorMessage);
})
.finally(result.done);
api - Registra classificação chat
Ações de código na Botmaker: api_isoRegistraClassificacaoChat
api do isoCRM para consulta de atendimentos: https://[host]/isocrmisobot/rest/WSR_ISOClassificacaoChatBot
Necessário sessão para a requisição.
Código fonte da ação de código api_isoRegistraClassificacaoChatdo tipo Usuário;
Constante utilizada:
apiKey;
Variáveis utilizadas:
codClassificacao;
retornoClassChat;
classificacaochat;
//@constant('Use external service URI')
const URI =
'https://sandbox.isocrm.com.br/isocrmisobot/rest/WSR_ISOClassificacaoChatBot';
//@constant('Use http method (POST, GET, PUT...)')
const METHOD = 'POST';
//@constant('Authentication key. Only if the service requires')
const AUTHENTICATION = '';
//@constant('Variable where the response will be stored')
const BM_RESULT_VAR_NAME = 'response_variable';
const IS_TEST = user.get('botmakerEnvironment') === 'DEVELOPMENT';
const CUSTOMER_ID = context.userData._id_;
const OUTPUTS = {
log: (text) => {
IS_TEST ? result.text(text) : bmconsole.log(text);
},
};
const callServiceApiRest = (classificacaochatbot) => {
const postData = {
sessao: JSON.parse(context.userData.constants)[`apiKey`],
classificacaochat: classificacaochatbot,
};
return rp({
method: METHOD,
uri: URI,
json: true,
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
},
body: postData,
});
};
const main = async () => {
let codClassificacao = 0;
if (user.get('codClassificacao') > 0) {
codClassificacao = user.get('codClassificacao');
} else {
const retorno = JSON.parse(user.get('retornoClassChat'));
let classificacao = JSON.parse(user.get('classificacaoChat'))[`name`];
for (let i = 0; i < retorno.length; i++) {
if (classificacao == retorno[i][`Classificacao`]) {
codClassificacao = retorno[i][`ClassificacaoCod`];
}
}
}
const classificacaochatbot = [
{
UserDevice: context.userData.PLATFORM_CONTACT_ID,
codClassificacao: codClassificacao,
channelId: context.userData.CHAT_CHANNEL_ID,
customerId: context.userData._id_,
},
];
user.set('classificacaochat', JSON.stringify(classificacaochatbot));
const response = await callServiceApiRest(classificacaochatbot);
result.done();
};
main()
.catch((err) => {
// Code on error
const errorMessage = `[Integration with api rest] : Error - ${CUSTOMER_ID} - ${err.message}`;
user.set('ca_error', errorMessage);
OUTPUTS.log(errorMessage);
})
.finally(result.done);