Gerar novos tópicos, posts e PMs via IFTTT

Deseja usar o IFTTT para criar novos tópicos, posts e mensagens privadas? Vamos começar!

Usando os Webhooks do Maker do serviço IFTTT, podemos fazer chamadas à API do Discourse. Para isso, precisamos gerar chaves de API primeiro. Você pode criar chaves de API no painel de administração em /admin/api/keys.

Também é possível gerar chaves de API específicas para cada usuário através das páginas de administração de usuários.

Agora, crie um novo applet no IFTTT e escolha o serviço de gatilho de sua preferência. Neste exemplo, estou usando o serviço Google Calendar.

Em seguida, estou escolhendo o gatilho Qualquer novo evento adicionado.

Para conectar seu gatilho ao Discourse, escolha Maker Webhooks como serviço de ação e a ação Fazer uma solicitação web.

Agora, preencha os campos de ação conforme abaixo.

  • URL (obrigatório): https://discourse.exemplo.com/posts.json
  • Método (obrigatório): POST
  • Tipo de Conteúdo: application/json
  • Cabeçalhos Adicionais:
Api-Key: [SUA_CHAVE_DE_API]
Api-Username: [USUARIO_API]

:warning: Importante: As credenciais de API devem ser enviadas como cabeçalhos HTTP (Api-Key e Api-Username), e não como parâmetros de consulta na URL. O Discourse não aceita autenticação por chave de API via parâmetros de consulta em solicitações POST. O serviço Maker Webhooks do IFTTT suporta cabeçalhos personalizados — use o campo Cabeçalhos Adicionais para adicioná-los.

  • Corpo:
{
 "title": "{{Título}}",
 "raw": "{{Descrição}}\n\nLocal: {{Onde}}\nEm: {{Início}} - {{Fim}}",
 "category": 4,
 "created_at": "{{CriadoEm}}"
}

No texto do corpo, você verá vários campos entre chaves duplas {{ }}. Esses campos (fontes de conteúdo) variarão conforme os gatilhos de cada serviço. Escolha-os usando o botão Ingrediente abaixo.

Você pode editar os campos title e raw no corpo JSON conforme necessário, incluindo textos ao redor. Encontre o ID da categoria no URL /site.json do seu site e insira-o no campo category. Agora, clique no botão Criar ação para finalizar o applet. Após a criação, pode levar algum tempo até que ele fique ativo.

Pronto :sunglasses:. Agora, um novo tópico será criado sempre que um novo evento for adicionado ao seu Google Calendar :calendar_spiral:.


Para criar uma resposta em um tópico existente, em vez de criar um novo tópico, o corpo da mensagem deve ser alterado conforme abaixo (use topic_id no lugar de category):

{
 "title": "{{Título}}",
 "raw": "{{Descrição}}\n\nLocal: {{Onde}}\nEm: {{Início}} - {{Fim}}",
 "topic_id": 4,
 "created_at": "{{CriadoEm}}"
}

Para criar uma nova mensagem privada:

{
 "title": "{{Título}}",
 "raw": "{{Descrição}}\n\nLocal: {{Onde}}\nEm: {{Início}} - {{Fim}}",
 "target_usernames": "discourse1,discourse2",
 "archetype": "private_message",
 "created_at": "{{CriadoEm}}"
}

Usando o mesmo método, você pode fazer solicitações à API do Discourse com qualquer outro serviço de ação do IFTTT.

22 curtidas

I wonder if this option is no longer free and only available as a premium for developers ?

1 curtida

Based on the Discourse API documentation, the Api_username and Api_key must be sent over HTTP request headers. Sending them as a GET params won’t work.

I tried and it failed. Therefore, I had wasn’t able to use IFTTT as it was instructed here…

However, I ended up writing a simple custom PHP script that acts as a relay hook that will allow data to be sent to discourse with the proper configuration.

Code
<?php
header('Content-Type: application/json');

//Make sure that it is a POST request.
if (strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0) {
    echo json_encode(array("error" => 'Request method must be POST!'));
}

//Make sure that the content type of the POST request has been set to application/json
$contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"]) : '';
if (strcasecmp($contentType, 'application/json') != 0) {
    echo json_encode(array("error" => 'Content type must be: application/json'));
}

//Receive the RAW post data.
$content = trim(file_get_contents("php://input"));

//Attempt to decode the incoming RAW post data from JSON.
$payload = json_decode($content, true);

//If json_decode failed, the JSON is invalid.
if (!is_array($payload)) {
    echo json_encode(array("error" => 'Received content contained invalid JSON!'));
    die();
}

if (empty($payload['discourse_endpoint'])) {
    echo json_encode(array("error" => 'Discourse endpoint must be provided in the json body!'));
    die();
}

if (empty($payload['api_key'])) {
    echo json_encode(array("error" => 'Discourse API Key must be provided in the json body!'));
    die();
}

if (empty($payload['api_username'])) {
    echo json_encode(array("error" => 'Discourse API User must be provided in the json body!'));
    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;

?>

You can read more about it here: Generate new topics, posts and PM via Discourse Relay API Script - discourse - Jamaican Developers Community Forum

2 curtidas

Estou na mesma situação, tentando configurar um applet IFTTT para postar itens marcados com uma determinada tag no Pinboard (tenho outros applets postando no Mastodon onde consigo passar um token como item de cabeçalho em vez de parâmetros GET).

Minhas medíocres habilidades em PHP entendem perfeitamente como seu código funciona, minha pergunta, por ter menos conhecimento do servidor Discourse, é onde posso colocar o script? Ele precisa estar no mesmo servidor para evitar problemas de CORS?

Ou devo procurar alguma outra plataforma intermediária de integração do que o IFTTT?

Ele só precisa ser hospedado em um servidor que possa aceitar a solicitação do IFTTT e possa se comunicar com sua instância do Discourse através das funções curl. Ele apenas inicia o mesmo tipo de solicitação que a interface web do Discourse faria. :slight_smile:

1 curtida

Obrigado. Parece que tenho acesso ao Zapier, que tem melhores integrações.