إنشاء مواضيع ورسائل جديدة عبر IFTTT

هل ترغب في استخدام IFTTT لإنشاء مواضيع ورسائل ومشاركات جديدة؟ لنبدأ!

باستخدام مكّانات الويب من خدمة IFTTT، يمكننا إجراء استدعاءات لـ Discourse API. ولتحقيق ذلك، يجب علينا أولاً إنشاء مفاتيح API. يمكنك إنشاء مفاتيح API من لوحة الإدارة في /admin/api/keys.

كما يمكننا أيضًا إنشاء مفاتيح API خاصة بالمستخدمين من خلال صفحات إدارة المستخدمين.

الآن، قم بإنشاء تطبيق جديد على IFTTT، ثم اختر خدمة المُحفِّز المفضلة لديك. في هذا المثال، سأستخدم خدمة Google Calendar.

ثم سأختار مُحفِّز أي حدث جديد مُضاف.

لربط المُحفِّز الخاص بك بـ Discourse، اختر مكّانات الويب كخدمة إجراء، وإجراء طلب ويب كإجراء.

الآن املأ حقول الإجراء على النحو التالي:

  • URL (مطلوب): https://discourse.example.com/posts.json

  • Method (مطلوب): POST

  • Content Type: application/json

  • Additional Headers:

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

:warning: مهم: يجب إرسال بيانات اعتماد API كعناوين HTTP (Api-Key و Api-Username)، وليس كمعاملات استعلام في URL. لا تقبل Discourse مصادقة مفتاح API عبر معاملات الاستعلام في طلبات POST. تدعم خدمة مكّانات الويب في IFTTT العناوين المخصصة — استخدم حقل Additional Headers لإضافتها.

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

في نص الجسم، يمكنك رؤية العديد من الحقول ذات الأقواس المزدوجة {{ }}. ستختلف هذه الحقول (مصادر المحتوى) مع كل مُحفِّز خدمة. اخترها من زر Ingredient أدناه.

يمكنك تعديل حقلي title و raw في جسم JSON كما تحتاج، مع النصوص المحيطة. ابحث عن معرف الفئة من عنوان URL /site.json لموقعك وضعه في حقل الفئة. الآن انقر على زر Create action لإنشاء التطبيق. بعد إنشاء التطبيق، قد يستغرق الأمر بعض الوقت ليصبح نشطًا.

تم بنجاح :sunglasses:. الآن سيتم إنشاء موضوع جديد في كل مرة يتم فيها إنشاء حدث جديد في تقويم Google الخاص بك :calendar_spiral:.


لإنشاء رد على موضوع موجود بدلاً من إنشاء موضوع جديد، يجب تغيير نص الجسم على النحو التالي (استخدام topic_id بدلاً من category)

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

لإنشاء رسالة شخصية جديدة

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

وبنفس هذه الطريقة، يمكنك إجراء طلبات Discourse API باستخدام أي خدمات إجراء أخرى من IFTTT.

22 إعجابًا

أتساءل عما إذا كانت هذه الخيارات لم تعد مجانية، وأصبحت متاحة فقط كميزة متميزة للمطورين؟

إعجاب واحد (1)

بناءً على توثيق واجهة برمجة تطبيقات Discourse، يجب إرسال Api_username و Api_key عبر رؤوس طلب HTTP. إرسالها كمعاملات GET لن ينجح.

لقد جربت ذلك وفشل، وبالتالي لم أتمكن من استخدام IFTTT كما هو مُوضح هنا…

ومع ذلك، قمت في النهاية بكتابة سكريبت PHP مخصص بسيط يعمل كخط ربط (relay hook) يسمح بإرسال البيانات إلى 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" => 'يجب توفير مفتاح واجهة برمجة تطبيقات Discourse في جسم JSON!'));
    die();
}

if (empty($payload['api_username'])) {
    echo json_encode(array("error" => 'يجب توفير اسم مستخدم واجهة برمجة تطبيقات 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;
?>

يمكنك قراءة المزيد حول ذلك هنا: Generate new topics, posts and PM via Discourse Relay API Script - php - CTC Community Forum

إعجابَين (2)

أنا في نفس القارب هنا أحاول إعداد تطبيق IFTTT لنشر العناصر التي تم وضع إشارة مرجعية عليها بعلامة معينة في Pinboard (لدي تطبيقات أخرى تنشر إلى Mastodon حيث أتمكن من تمرير رمز كعنصر رأس بدلاً من معلمات GET).

مهاراتي المتواضعة في PHP ترى تمامًا كيف يعمل الكود الخاص بك، وسؤالي، نظرًا لقلة معرفتي بخادم Discourse، هو أين يمكنني وضع البرنامج النصي؟ هل يحتاج إلى أن يكون على نفس الخادم لتجنب مشكلات CORS؟

أم يجب أن أبحث عن منصة وسيطة تكامل أخرى غير IFTTT؟

ما عليك سوى استضافته على خادم يمكنه قبول الطلب من IFTTT و يمكنه التحدث إلى مثيل Discourse الخاص بك عبر وظائف curl. إنه يبدأ فقط نفس نوع الطلب الذي تقوم به واجهة ويب Discourse. :slight_smile:

إعجاب واحد (1)

شكرا. يبدو أن لدي وصولاً إلى Zapier الذي يتمتع بتكاملات أفضل.