Generate new topics, posts and PM via IFTTT

Want to use IFTTT to create new topics, posts and private messages? Let’s get started!

Using Maker Webhooks of IFTTT service we can make Discourse API calls. For that we must generate API keys first. You can create API keys from the admin panel at /admin/api/keys.

Also we can generate user specific API keys through user admin pages.

Now create new applet on IFTTT and then choose your favorite trigger service. Now I am using Google Calendar service for example.

Then I am choosing Any new event added trigger.

To connect your trigger with Discourse choose Maker Webhooks as action service and Make a web request action.

Now fill the action fields as below.

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

  • Method (required): POST

  • Content Type: application/json

  • Additional Headers:

Api-Key: [YOUR_API_KEY]
Api-Username: [API_USERNAME]

:warning: Important: API credentials must be sent as HTTP headers (Api-Key and Api-Username), not as URL query parameters. Discourse does not accept API key authentication via query parameters on POST requests. IFTTT’s Maker Webhooks service supports custom headers — use the Additional Headers field to add them.

  • Body:
{
 "title": "{{Title}}",
 "raw": "{{Description}}\n\nPlace: {{Where}}\nAt: {{Starts}} - {{Ends}}",
 "category": 4,
 "created_at": "{{CreatedAt}}"
}

In body text you can see many fields with double brackets {{ }}. Those fields (content sources) will vary with every service triggers. Choose it from Ingredient button below.

You can edit title and raw fields in JSON body however you need with surrounded texts. Find category id from your site’s /site.json URL and put it on category field. Now click Create action button to create the applet. After the applet creation it may take some time to be live.

It’s done :sunglasses:. Now a new topic will be created whenever a new event created on your Google Calendar :calendar_spiral:.


To create a post reply to an existing topic instead of new topic creation the body text should be changed as below (topic_id instead of category)

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

To create new private message

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

In this same method you can make Discourse API requests by any other IFTTT action services.

Last edited by @JammyDodger 2024-05-26T06:54:38Z

Check documentPerform check on document:
22 лайка

Интересно, не является ли эта опция больше бесплатной и доступна ли она только как премиум-функция для разработчиков?

1 лайк

Согласно документации API Discourse, параметры Api_username и Api_key должны передаваться в заголовках HTTP-запроса. Отправка их в качестве параметров GET не сработает.

Я пробовал, но это не сработало. Поэтому я не смог использовать IFTTT, как было указано здесь…

Однако в итоге я написал простой пользовательский PHP-скрипт, который действует как прокси-хук и позволяет отправлять данные в Discourse с правильной конфигурацией.

Код
<?php
header('Content-Type: application/json');

// Убедитесь, что это запрос POST.
if (strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0) {
    echo json_encode(array("error" => 'Метод запроса должен быть POST!'));
}

// Убедитесь, что тип содержимого POST-запроса установлен в application/json.
$contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"]) : '';
if (strcasecmp($contentType, 'application/json') != 0) {
    echo json_encode(array("error" => 'Тип содержимого должен быть: application/json'));
}

// Получите необработанные данные POST.
$content = trim(file_get_contents("php://input"));

// Попытка декодировать входящие необработанные данные POST из JSON.
$payload = json_decode($content, true);

// Если json_decode не удался, JSON некорректен.
if (!is_array($payload)) {
    echo json_encode(array("error" => 'Полученное содержимое содержит некорректный JSON!'));
    die();
}

if (empty($payload['discourse_endpoint'])) {
    echo json_encode(array("error" => 'Конечная точка Discourse должна быть указана в теле JSON!'));
    die();
}

if (empty($payload['api_key'])) {
    echo json_encode(array("error" => 'API-ключ Discourse должен быть указан в теле JSON!'));
    die();
}

if (empty($payload['api_username'])) {
    echo json_encode(array("error" => 'Пользователь API Discourse должен быть указан в теле 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;
?>

Вы можете узнать об этом больше здесь: https://community.jamaicans.dev/t/generate-new-topics-posts-and-pm-via-discourse-relay-api-script/176

2 лайка

Я тоже в такой же ситуации, пытаясь настроить апплет IFTTT для публикации элементов, отмеченных определённым тегом в Pinboard (у меня есть другие апплеты для публикации в Mastodon, где я могу передавать токен как заголовок, а не через параметры GET).

Мои посредственные навыки PHP позволяют понять, как работает ваш код. Мой вопрос связан с тем, что я менее знаком с сервером Discourse: где можно разместить этот скрипт? Нужно ли размещать его на том же сервере, чтобы избежать проблем CORS?

Или мне стоит рассмотреть другую интеграционную платформу вместо IFTTT?

Ему просто нужно быть размещенным на сервере, который может принимать запросы от IFTTT и общаться с вашим экземпляром Discourse через функции curl. Он просто инициирует тот же тип запроса, что и веб-интерфейс Discourse. :slight_smile:

1 лайк

Спасибо. Похоже, у меня есть доступ к Zapier, у которого интеграции лучше.