Los enlaces de contexto son botones de la barra lateral de una conversación que abren URL externas con los datos del contacto y de la conversación ya incluidos. Los agentes pueden usarlos para ir a un CRM, un sistema de facturación o un panel interno sin copiar y pegar identificadores.
Variables de la plantilla de URL
Estos marcadores se sustituyen por los datos del contacto actual cuando un agente hace clic en el enlace.
{{email}}- correo electrónico del contacto{{phone}}- número de teléfono del contacto{{phone_country_code}}- código de país del teléfono del contacto{{external_user_id}}- ID de usuario externo del contacto{{contact_id}}- ID interno del contacto en libredesk{{first_name}}- nombre del contacto{{last_name}}- apellido del contacto{{conversation_uuid}}- UUID de la conversación actual{{token}}- token cifrado que contiene todos los campos y requiere un secreto compartido
Todos los valores, salvo {{contact_id}} y {{conversation_uuid}}, se codifican automáticamente para usarlos en una URL.
Ejemplos
Búsqueda sencilla por correo electrónico:
https://crm.example.com/contacts?email={{email}}Varios parámetros:
https://billing.example.com/customer?ext_id={{external_user_id}}&email={{email}}Panel interno con el contexto de la conversación:
https://dashboard.internal/lookup?contact={{contact_id}}&conv={{conversation_uuid}}Token cifrado:
https://api.example.com/auth/libredesk?token={{token}}El token cifrado
Cuando usas {{token}}, libredesk genera un token cifrado con AES-256-GCM y de duración limitada. Contiene todos los campos anteriores, además de agent_id, agent_email, iat y exp. El sistema receptor lo descifra con el secreto compartido, por lo que esos datos no quedan expuestos en la URL.
import base64, json, time
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
def decrypt_context_token(token, secret):
raw = base64.b64decode(token)
nonce = raw[:12]
ciphertext = raw[12:]
aesgcm = AESGCM(secret.encode('utf-8'))
plaintext = aesgcm.decrypt(nonce, ciphertext, None)
return json.loads(plaintext)
secret = "your-32-character-shared-secret!" # exactly 32 characters
payload = decrypt_context_token(token_from_url, secret)
if payload["exp"] < time.time():
raise ValueError("Token has expired")
print(payload["email"], payload["conversation_uuid"])