<< Clic para mostrar Tabla de Contenidos >> Ejemplo de Conector Personalizado |
En esta se sección se ilustra un ejemplo a manera de paso a paso donde se crea un conector Personalizado.
En el ejemplo, se publica un nuevo mensaje en Twitter desde un proceso de Bizagi.
Para mayor información sobre esta funcionalidad, consulte los Conectores Personalizados.
Recuerde que típicamente para integrar servicios en la nube, como aquellos proporcionados por Twitter, usted deber contar con una aplicación válida y autorizada a acceder a su cuenta en Twitter. Para mayor información al respecto, revise la sección de creación de aplicación y obtención de credenciales de autorización en el artículo Configurar y Usar el Conector de Twitter.
Para este fin y para poder ilustrar el potencial de este conector, se ilustra a continuación un proceso donde que emula una compañía de media (periódicos) que publica enlaces a sus noticias en su cuenta de Twitter.
Para ello se utiliza este proceso:
El detalle detrás de este proceso, es que cada vez que se crea un caso, se publica el enlace al URL de la noticia y se configura un número predeterminado de ocurrencia para hacerlo (o.e cada 2 horas, un post a Twitter). El caso puede ser cancelado en cualquier momento.
Para configurar el conector desde este proceso, primero se presenta cómo implementar dicho proceso y finalmente, desde dónde configurar el uso del conector.
Basado en el modelo BPMN de arriba, los siguientes detalles de implementación consideran:
1.Utilizar este modelo de datos:
2.Configurar el tiempo de espera de un temporizador en el modelo de proceso.
3.Definir la forma para la tarea donde se registra la noticia (Register News).
4.Definir la forma donde se maneja la información de la noticia:
5.Configurar la lógica dentro de la compuerta (permitiendo una nueva publicación cuando el número de intentos previos no haya superado la cantidad permitida definida a priori):
6.Definir una regla que se ejecute en la tarea de registro (Register news), donde se asigne información inicial del usuario y la fecha:
//Case information
<MediaPublicity.Newsregistrydate> = DateTime.Today;
<MediaPublicity.Newsregistryperformer> = Me.Case.WorkingCredential.UserId;
7.Definir una regla que se ejecute en la tarea de publicación (Publish news through Twitter).
Seleccione un mensaje para Twitter, de una lista de mensajes previamente definidos:
var MessagesEntity = CHelper.GetValueAsCollection(<MediaPublicity.Messagestopublish>);
var MessagesAmount = MessagesEntity.size();
var randNumb = CHelper.Math.Rand(0,MessagesAmount-1);
var MessageToPublish = MessagesEntity.get(randNumb).getXPath("Message");
Me.setXPath("MediaPublicity.Currentmessage",MessageToPublish);
Incrementar el total de número de publicaciones realizadas:
<MediaPublicity.Currentpublication> = <MediaPublicity.Currentpublication>+1;
Para empezar a crear un conector de Twitter, tenga en cuenta que primero se ilustra cómo puede descargar y apoyarse en una librería existente de conexión específica para ese sistema.
1. Ubicando las librerías de Node.js para el conector
Descargue desde www.npmjs.com, las librerías de Node.Js para ser utilizada como base de la conectividad dentro del conector.
Consulte la documentación de las librerías mismas, o incluso su código, para prestar especial atención a cómo se utilizan las librerías, incluyendo la configuración de parámetros de entrada y de salida.
En este ejemplo, se ilustra el uso de la librería llamada twit, creada por ttezel.
Si no se presenta suficiente documentación sobre la estructura de salida y otros parámetros opcionales, siempre puede navegar también por la API de la aplicación.
Para este ejemplo puede revisar:
•Documentación API: https://developer.twitter.com/en/docs/twitter-api/tweets/manage-tweets/introduction
•Repositorio GitHub con los códigos de muestra: https://github.com/twitterdev/Twitter-API-v2-sample-code
2. Creando un conector Personalizado
Acceda al Hub de Integración y cree un nuevo conector con los siguientes pasos:
a.Adicione las librerías descargadas al conector. Para este ejemplo, se agrega la librería twit al conector.
b.Adicione los parámetros de autenticación.
Dado que estos valores de parámetros contendrán información sensible, se debe utilizar la encriptación de campos (field encryption). Esto cambiará la entrada de los valores en Bizagi Studio de un simple campo de texto a un campo de contraseña (haciendo que esté protegido al intentar recuperar los valores almacenados en estos parámetros). |
c.Adicione una acción y configure sus propiedades. Tenga presente que el nombre y la descripción se muestran cuando se se configure el uso del conector desde los procesos.
d.Defina la estructura de los datos de entrada (no necesariamente deben ser todos los campos del API; solamente aquellos que usted detecte sean útiles para su conector).
e.Defina la estructura de los datos de salida (no necesariamente deben ser todos los campos del API; solamente aquellos que usted detecte sean útiles para su conector).
f.Implemente el código donde se especifica el comportamiento de la acción.
En este ejemplo se utiliza el siguiente código (clic para desplegar el código):
var bizagiUtil = require('bz-util'); var REQUIRED = bizagiUtil.REQUIRED; var ERROR = bizagiUtil.error; var RESPONSE = bizagiUtil.getResponse; var TwitterService = REQUIRED('twitter-api-v2'); var got = require('got'); var crypto = require('crypto-js'); var OAuth = require('oauth-1.0a'); var qs = require('querystring');
/** * * @author Bizagi * */ function invoke(globals, actionName, data, authenticationType, LOG, callback) { LOG.debug(['[twitter-connector.', actionName, '] globals: ', globals, '--- data: ', data]);
var error = bizagiUtil.validator.requiredParameters({'message': data.inputs.input.message, 'callback': callback}); if (error) { LOG.error(['[twitter-connector.', actionName, '] Error: ', error]); callback(error); return; } var credentialsConfig = { consumer_key: globals.authdata.consumer_key, consumer_secret: globals.authdata.consumer_secret, //access_token_key: globals.authdata.access_token, //access_token_secret: globals.authdata.access_token_secret }
var data = { "text": "Hello world!" }; var endpointURL = `https://api.twitter.com/2/tweets`; var requestTokenURL = 'https://api.twitter.com/oauth/request_token?oauth_callback=oob&x_auth_access_type=write'; var authorizeURL = new URL('https://api.twitter.com/oauth/authorize'); var accessTokenURL = 'https://api.twitter.com/oauth/access_token'; var oauth = OAuth({ consumer: { key: consumer_key, secret: consumer_secret }, signature_method: 'HMAC-SHA1', hash_function: (baseString, key) => crypto.HmacSHA1(baseString, key); });
async function requestToken() { const authHeader = oauth.toHeader(oauth.authorize({ url: requestTokenURL, method: 'POST' }));
const req = await got.post(requestTokenURL, { headers: { Authorization: authHeader["Authorization"] } }); if (req.body) { return qs.parse(req.body); } else { throw new Error('Cannot get an OAuth request token'); } }
async function accessToken({ oauth_token, oauth_token_secret }, verifier) { const authHeader = oauth.toHeader(oauth.authorize({ url: accessTokenURL, method: 'POST' })); const path = `https://api.twitter.com/oauth/access_token?oauth_verifier=${verifier}&oauth_token=${oauth_token}` const req = await got.post(path, { headers: { Authorization: authHeader["Authorization"] } }); if (req.body) { return qs.parse(req.body); } else { throw new Error('Cannot get an OAuth request token'); } }
async function getRequest({ oauth_token, oauth_token_secret }) {
const token = { key: oauth_token, secret: oauth_token_secret };
const authHeader = oauth.toHeader(oauth.authorize({ url: endpointURL, method: 'POST' }, token));
const req = await got.post(endpointURL, { json: data, responseType: 'json', headers: { Authorization: authHeader["Authorization"], 'user-agent': "v2CreateTweetJS", 'content-type': "application/json", 'accept': "application/json" } }); if (req.body) { var reply = RESPONSE(req.body, null, 200); LOG.info(['[twitter-connector.', actionName, '] Response Success for ... statuses/update, {status:', message, '}']); callback(reply); } else { var error = RESPONSE(null, 'error', error.statusCode, ERROR('TWITTER.ERROR', [error.statusCode, error.code, error.message])); LOG.error(['[twitter-connector.', actionName, '] Error: ', error]); callback(error); } }
(async () => { try { // Get request token const oAuthRequestToken = await requestToken(); // Get authorization authorizeURL.searchParams.append('oauth_token', oAuthRequestToken.oauth_token); console.log('Please go here and authorize:', authorizeURL.href); const pin = await input('Paste the PIN here: '); // Get the access token const oAuthAccessToken = await accessToken(oAuthRequestToken, pin.trim()); // Make the request const response = await getRequest(oAuthAccessToken); console.dir(response, { depth: null }); } catch (e) { console.log(e); process.exit(-1); } process.exit(); })(); //var twService = new TwitterService(credentialsConfig); //var message = data.inputs.input.message;
LOG.info(['[twitter-connector.', actionName, '] invoke... statuses/update, {status: ', message, '}']);
} exports.invoke = invoke; |
g.Guarde el conector.
3. Probando el conector
En esta parte, se realizan una serie de pasos con Bizagi Studio para contar con un proceso que utilice dicho conector.
En este artículo se considera un proceso de ejemplo que ilustra el potencial de este conector puntual. Para este paso, usted debe conocer sobre el uso y opciones básicas de Bizagi Studio, y tenga presente que usted no necesariamente debe utilizar este mismo proceso para probar este conector. |
Una vez que haya creado el conector, su configuración y uso se lleva a cabo desde Bizagi Studio.
Ahora que el proceso está listo para usar el conector, conéctalo al proceso siguiendo estos pasos.
1.Vaya a la Vista de Experto y en los Sistemas Externos abra los Conectores API.
2.Seleccione el nuevo conector que aparece listado producto de esta acción, y dé clic derecho sobre su versión para adicionar una Nueva Configuración de Sistema, o haga clic en la opción de Nueva Configuración de Sistema en el menú superior.
3.Asigne a la configuración un nombre y descripción. Asegúrese también de seleccionar el método de autenticación ("Custom") para configurarlo. Ingrese: API Key, API Secret, Access Token y Access Token Secret, según como pertenezca a su cuenta de Twitter. Estas credenciales serán utilizadas de ahora en adelante al momento de ejecutar la conexión con Twitter.
4.De vuelta a la vista de asistente (wizard view), seleccione el paso 4 (Activity Actions). Adicione una acción de tipo conector para que se ejecute a la salida de la tarea de publicación, asegurándose de seleccionar Connector desde la lista desplegable en la opción On Exit.
5.Seleccione el conector y luego la acción a ejecutarse.
6.Mapee los datos de entrada.
Dado que Currentmessage y URL son dos atributos separados que irán dentro de un mismo parámetro, se deben concatenar. Para su mejor uso, se utiliza un espacio en blanco como constante, entre estos atributos. |
7.Mapee los datos de salida y dé clic en Finalizar.
Lance el Portal de Trabajo de Bizagi para ejecutar y probar el conector para este proceso.
Cree un nuevo caso y registre la URL de la noticia. Seguidamente, adicione mensajes para la publicación.
Dé clic en Siguiente (Next) al finalizar.
En este punto usted notará que un nuevo tweet será publicado con el mensaje y la URL de la noticia.
Last Updated 4/4/2023 3:40:22 PM