Genera nuevos temas, publicaciones y MP mediante IFTTT

¿Quieres usar IFTTT para crear nuevos temas, publicaciones y mensajes privados? ¡Empecemos!

Mediante el uso de Maker Webhooks del servicio IFTTT, podemos realizar llamadas a la API de Discourse. Para ello, primero debemos generar claves API. Puedes crear claves API desde el panel de administración en /admin/api/keys.

También podemos generar claves API específicas para cada usuario a través de las páginas de administración de usuarios.

Ahora crea un nuevo applet en IFTTT y luego selecciona el servicio de activación que prefieras. En este ejemplo, estoy utilizando el servicio de Google Calendar.

\u003cimg src="//assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/3/4/341b41d93de97b271496b99dcc53d21df4089ac4.png" width="591" height="409"\u003e

Luego, selecciono el activador Cualquier evento nuevo agregado.

\u003cimg src="//assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/a/9/a92552c97474e03de602f8f5b134e4d3929bc76b.png" width="690" height="330"\u003e

Para conectar tu activador con Discourse, elige Maker Webhooks como servicio de acción y Realizar una solicitud web como acción.

\u003cimg src="//assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/c/9/c9522a31c798594cadafc8f3962b0eb4cccc6a13.png" width="681" height="500"\u003e

Ahora rellena los campos de acción como se muestra a continuación.

  • URL (requerido): https://discourse.example.com/posts.json

  • Método (requerido): POST

  • Tipo de contenido: application/json

  • Encabezados adicionales:

Api-Key: [TU_CLAVE_API]
Api-Username: [USUARIO_API]

\u003e :warning: Importante: Las credenciales API deben enviarse como encabezados HTTP (Api-Key y Api-Username), no como parámetros de consulta en la URL. Discourse no acepta la autenticación mediante clave API a través de parámetros de consulta en solicitudes POST. El servicio Maker Webhooks de IFTTT admite encabezados personalizados: utiliza el campo Encabezados adicionales para agregarlos.

  • Cuerpo:
{
 "title": "{{Título}}",
 "raw": "{{Descripción}}\\n\\nLugar: {{Lugar}}\\nEn: {{Inicio}} - {{Fin}}",
 "category": 4,
 "created_at": "{{FechaCreación}}"
}

\u003cimg src="//assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/7/7/77365735ed9f95d460f2de4c16bcb13dbfda9ea0.png" width="194" height="500"\u003e

En el texto del cuerpo verás muchos campos con corchetes dobles {{ }}. Estos campos (fuentes de contenido) variarán según los activadores de cada servicio. Selecciónalos desde el botón Ingrediente que aparece abajo.

Puedes editar los campos title y raw en el cuerpo JSON según necesites, incluyendo texto adicional. Encuentra el ID de categoría en la URL /site.json de tu sitio y colócalo en el campo de categoría. Ahora haz clic en el botón Crear acción para crear el applet. Después de crear el applet, puede tardar un poco en estar activo.

¡Listo :sunglasses:! Ahora se creará un nuevo tema cada vez que se agregue un nuevo evento en tu Google Calendar :calendar_spiral:.


Para crear una respuesta a un tema existente en lugar de uno nuevo, el cuerpo debe modificarse como se muestra a continuación (usando topic_id en lugar de category):

{
 "title": "{{Título}}",
 "raw": "{{Descripción}}\\n\\nLugar: {{Lugar}}\\nEn: {{Inicio}} - {{Fin}}",
 "topic_id": 4,
 "created_at": "{{FechaCreación}}"
}

Para crear un nuevo mensaje privado:

{
 "title": "{{Título}}",
 "raw": "{{Descripción}}\\n\\nLugar: {{Lugar}}\\nEn: {{Inicio}} - {{Fin}}",
 "target_usernames": "discourse1,discourse2",
 "archetype": "private_message",
 "created_at": "{{FechaCreación}}"
}

Con este mismo método, puedes realizar solicitudes a la API de Discourse mediante cualquier otro servicio de acción de IFTTT.

22 Me gusta

Me pregunto si esta opción ya no es gratuita y solo está disponible como premium para desarrolladores.

1 me gusta

Según la documentación de la API de Discourse, el Api_username y el Api_key deben enviarse en las cabeceras de la solicitud HTTP. Enviarlos como parámetros GET no funcionará.

Lo intenté y falló. Por lo tanto, no pude usar IFTTT tal como se indicaba aquí…

Sin embargo, terminé escribiendo un sencillo script PHP personalizado que actúa como un gancho de retransmisión, permitiendo que los datos se envíen a Discourse con la configuración adecuada.

Código
<?php
header('Content-Type: application/json');

// Asegurarse de que sea una solicitud POST.
if (strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0) {
    echo json_encode(array("error" => '¡El método de solicitud debe ser POST!'));
}

// Asegurarse de que el tipo de contenido de la solicitud POST esté establecido en application/json.
$contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"]) : '';
if (strcasecmp($contentType, 'application/json') != 0) {
    echo json_encode(array("error" => 'El tipo de contenido debe ser: application/json'));
}

// Recibir los datos POST crudos.
$content = trim(file_get_contents("php://input"));

// Intentar decodificar los datos POST crudos entrantes desde JSON.
$payload = json_decode($content, true);

// Si json_decode falla, el JSON no es válido.
if (!is_array($payload)) {
    echo json_encode(array("error" => '¡El contenido recibido contiene JSON no válido!'));
    die();
}

if (empty($payload['discourse_endpoint'])) {
    echo json_encode(array("error" => '¡El endpoint de Discourse debe proporcionarse en el cuerpo JSON!'));
    die();
}

if (empty($payload['api_key'])) {
    echo json_encode(array("error" => '¡La clave API de Discourse debe proporcionarse en el cuerpo JSON!'));
    die();
}

if (empty($payload['api_username'])) {
    echo json_encode(array("error" => '¡El usuario de la API de Discourse debe proporcionarse en el cuerpo JSON!'));
    die();
}

$discourse_endpoint = $payload['discourse_endpoint'];
$api_key = $payload['api_key'];
$api_user = $payload['api_username'];

unset($payload['discourse_endpoint']);
unset($payload['api_key']);
unset($payload['api_username']);

$data_string = json_encode($payload);

$ch = curl_init($discourse_endpoint);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    "Api-key: $api_key",
    "Api-username: $api_user",
    'Content-Length: ' . strlen($data_string)
));
$result = curl_exec($ch);

echo $result;
?>

Puedes leer más sobre esto aquí: Generate new topics, posts and PM via Discourse Relay API Script - php - CTC Community Forum

2 Me gusta

Estoy en la misma situación intentando configurar un applet de IFTTT para publicar elementos marcados con una etiqueta específica en Pinboard (tengo otros applets publicando en Mastodon donde puedo pasar un token como elemento de encabezado en lugar de parámetros GET).

Mis mediocres habilidades de PHP ven perfectamente cómo funciona tu código, mi pregunta, al ser menos conocedor del servidor Discourse, es ¿dónde puedo colocar el script? ¿Necesita estar en el mismo servidor para evitar problemas de CORS?

¿O debería estar buscando alguna otra plataforma intermedia de integración que no sea IFTTT?

Solo necesita estar alojado en un servidor que pueda aceptar la solicitud de IFTTT y pueda comunicarse con tu instancia de Discourse a través de las funciones curl. Simplemente inicia el mismo tipo de solicitud que haría la interfaz web de Discourse. :slight_smile:

1 me gusta

Gracias. Parece que tengo acceso a Zapier, que tiene mejores integraciones.