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

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

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

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

الآن، أنشئ تطبيقًا جديدًا (Applet) في IFTTT، ثم اختر خدمة المشغّل المفضلة لديك. في هذا المثال، سأستخدم خدمة Google Calendar.

\u003cimg src="//assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/3/4/341b41d93de97b271496b99dcc53d21df4089ac4.png" width="591" height="409"\u003e

ثم سأختار مشغّل أي حدث جديد تمت إضافته.

\u003cimg src="//assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/a/9/a92552c97474e03de602f8f5b134e4d3929bc76b.png" width="690" height="330"\u003e

لربط مشغّلك بـ Discourse، اختر مكّان الويب (Maker Webhooks) كخدمة إجراء، وإجراء طلب ويب كإجراء.

\u003cimg src="//assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/c/9/c9522a31c798594cadafc8f3962b0eb4cccc6a13.png" width="681" height="500"\u003e

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

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

  • Method (مطلوب): POST

  • Content Type: application/json

  • Additional Headers:
    \nApi-Key: [YOUR_API_KEY]\nApi-Username: [API_USERNAME]\n

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

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

\u003cimg src="//assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/7/7/77365735ed9f95d460f2de4c16bcb13dbfda9ea0.png" width="194" height="500"\u003e

في نص الجسم، يمكنك رؤية العديد من الحقول المحاطة بعلامتي [[]]. ستختلف هذه الحقول (مصادر المحتوى) مع كل مشغّل خدمة. اخترها من زر المكون (Ingredient) أدناه.

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

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


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

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

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

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

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

22 إعجابًا

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

إعجاب واحد (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 الذي يتمتع بتكاملات أفضل.