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

Eu me pergunto se essa opção não é mais gratuita e está disponível apenas como um recurso premium para desenvolvedores?

1 curtida

Com base na documentação da API do Discourse, o Api_username e o Api_key devem ser enviados nos cabeçalhos da requisição HTTP. Enviá-los como parâmetros GET não funcionará.

Eu tentei e falhei. Portanto, não consegui usar o IFTTT conforme instruído aqui…

No entanto, acabei escrevendo um script PHP personalizado simples que atua como um gatilho de retransmissão, permitindo que dados sejam enviados para o Discourse com a configuração adequada.

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

// Garanta que seja uma requisição POST.
if (strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0) {
    echo json_encode(array("error" => 'O método da requisição deve ser POST!'));
}

// Garanta que o tipo de conteúdo da requisição POST foi definido como application/json
$contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"]) : '';
if (strcasecmp($contentType, 'application/json') != 0) {
    echo json_encode(array("error" => 'O tipo de conteúdo deve ser: application/json'));
}

// Receba os dados brutos do POST.
$content = trim(file_get_contents("php://input"));

// Tente decodificar os dados brutos do POST recebidos a partir do JSON.
$payload = json_decode($content, true);

// Se json_decode falhar, o JSON é inválido.
if (!is_array($payload)) {
    echo json_encode(array("error" => 'O conteúdo recebido continha JSON inválido!'));
    die();
}

if (empty($payload['discourse_endpoint'])) {
    echo json_encode(array("error" => 'O endpoint do Discourse deve ser fornecido no corpo do JSON!'));
    die();
}

if (empty($payload['api_key'])) {
    echo json_encode(array("error" => 'A Chave da API do Discourse deve ser fornecida no corpo do JSON!'));
    die();
}

if (empty($payload['api_username'])) {
    echo json_encode(array("error" => 'O Usuário da API do Discourse deve ser fornecido no corpo do 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;
?>

Você pode ler mais sobre isso aqui: Generate new topics, posts and PM via Discourse Relay API Script - php - CTC 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.