Generar nuevos temas, publicaciones y mensajes privados con IFTTT

¿Quieres usar IFTTT para crear nuevos temas, publicaciones y mensajes personales? ¡Comencemos!

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

También podemos generar claves de 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 elige tu servicio desencadenante favorito. En este ejemplo, estoy utilizando el servicio Google Calendar.

Luego, elijo el desencadenante Cualquier evento nuevo agregado.

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

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]

:warning: Importante: Las credenciales de la API deben enviarse como encabezados HTTP (Api-Key y Api-Username), no como parámetros de consulta en la URL. Discourse no acepta autenticación mediante clave de 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": "{{Title}}",
 "raw": "{{Description}}\n\nLugar: {{Where}}\nEn: {{Starts}} - {{Ends}}",
 "category": 4,
 "created_at": "{{CreatedAt}}"
}

En el texto del cuerpo puedes ver muchos campos con corchetes dobles {{ }}. Esos campos (fuentes de contenido) variarán según los desencadenantes 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 tus necesidades, rodeándolos con texto adicional. Busca el ID de categoría en la URL /site.json de tu sitio y colócalo en el campo category. 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 un nuevo tema, el texto del cuerpo debe modificarse como se muestra a continuación (usando topic_id en lugar de category):

{
 "title": "{{Title}}",
 "raw": "{{Description}}\n\nLugar: {{Where}}\nEn: {{Starts}} - {{Ends}}",
 "topic_id": 4,
 "created_at": "{{CreatedAt}}"
}

Para crear un nuevo mensaje personal:

{
 "title": "{{Title}}",
 "raw": "{{Description}}\n\nLugar: {{Where}}\nEn: {{Starts}} - {{Ends}}",
 "target_usernames": "discourse1,discourse2",
 "archetype": "private_message",
 "created_at": "{{CreatedAt}}"
}

Con este mismo método, puedes realizar solicitudes a la API de Discourse utilizando 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.