تكامل JS API

FlowHunt JavaScript API Chatbot Integration

يمنحك FlowHunt JS API تحكماً كاملاً في كيفية تكامل روبوت الدردشة مع موقعك الإلكتروني. باستخدام كود التكامل الإصدار الثاني، يمكنك تضمين روبوت الدردشة، والاشتراك في أحداث دورة الحياة والتفاعل، وتمرير البيانات الديناميكية عبر متغيرات التدفق، وإطلاق مشغّل Chat Hook في منتصف المحادثة باستخدام sendHook()، وتتبّع التفاعلات بمعلمات URL، والتحكم في نافذة الدردشة برمجياً.

يغطي هذا الدليل كل جانب من جوانب JS API مع أمثلة كود يمكنك نسخها وتكييفها مع مشروعك.

كود التكامل (الإصدار الثاني)

انسخ المقتطف أدناه والصقه في HTML الخاص بك قبل وسم الإغلاق </body> مباشرة. استبدل YOUR_CHATBOT_ID و YOUR_WORKSPACE_ID بالقيم من إعدادات روبوت الدردشة في FlowHunt.

<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
  var currentScript = document.currentScript
    || document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');

  var script = document.createElement('script');
  script.async = true;
  script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
    + '?workspace_id=YOUR_WORKSPACE_ID&v=2';

  script.onload = function () {
    window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
      // The chatbot is ready — use chatbotManager here
    });
  };

  if (currentScript && currentScript.parentNode) {
    currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
  } else {
    document.head.appendChild(script);
  }
</script>

معرف روبوت الدردشة في اسم المتغير العام (window.FHChatbot_YOUR_CHATBOT_ID) يستخدم الشرطات السفلية بدلاً من الواصلات.

تجاوز التكوين باستخدام setConfig()

قبل استدعاء init()، يمكنك تجاوز إعدادات روبوت الدردشة الافتراضية باستخدام setConfig():

<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
  var currentScript = document.currentScript
    || document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');

  var script = document.createElement('script');
  script.async = true;
  script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
    + '?workspace_id=YOUR_WORKSPACE_ID&v=2';

  script.onload = function () {
    window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
      headerTitle: 'Support Assistant',
      maxWindowWidth: '700px',
      showChatButton: false,
      flowVariables: {
        userId: '12345',
        plan: 'enterprise',
      },
      urlSuffix: '?utm_source=chatbot',
    });

    window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
      // Chatbot initialised with custom config
    });
  };

  if (currentScript && currentScript.parentNode) {
    currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
  } else {
    document.head.appendChild(script);
  }
</script>

خيارات التكوين المتاحة

OptionTypeDescription
headerTitlestringنص عنوان رأسي مخصص
maxWindowWidthstringالحد الأقصى لعرض نافذة الدردشة (مثال "700px")
maxWindowHeightstringالحد الأقصى لارتفاع نافذة الدردشة
inputPlaceholderstringنص العنصر النائب لحقل إدخال الرسالة
showChatButtonbooleanإظهار أو إخفاء زر الدردشة العائم الافتراضي
openChatPanelbooleanفتح لوحة الدردشة تلقائياً عند تحميل الصفحة
flowVariablesobjectأزواج المفتاح والقيمة للبيانات المخصصة المُمررة إلى التدفق. يمكن أن تكون القيم من أي نوع قابل للتسلسل بصيغة JSON (سلسلة نصية، رقم، قيمة منطقية، كائن، مصفوفة).
urlSuffixstringسلسلة استعلام تُلحق بجميع عناوين URL التي ينشئها روبوت الدردشة
cookieConsentbooleanتفعيل استمرار الجلسة عبر ملفات تعريف الارتباط
embeddedstringتعيين لتفعيل الوضع المضمّن (بدون زر إغلاق)
themestringوضع السمة

متغيرات التدفق: تمرير البيانات الديناميكية

تُدمج flowVariables في كل جلسة ينشئها روبوت الدردشة. تُستخدم عادةً كسياق ثابت (معروف عند تحميل الصفحة): معرف المستخدم، الباقة، اللغة الحالية، وما إلى ذلك.

window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
  flowVariables: {
    userId: getCurrentUserId(),
    userEmail: getCurrentUserEmail(),
    currentPage: window.location.pathname,
    plan: 'enterprise',
  },
});

إذا تنقّل المستخدم بعد فتح الدردشة، تصبح القيم المُمررة هنا قديمة. لتحديثها في منتصف المحادثة، استدعِ chatbotManager.sendHook() مع options.flowVariables — انظر التواصل من المضيف إلى التدفق في منتصف المحادثة أدناه.

URL Suffix: تتبع تفاعلات روبوت الدردشة

تُلحق معلمة urlSuffix سلسلة استعلام بكل عنوان URL ينشئه روبوت الدردشة. هذا مفيد لتتبع حركة المرور الناتجة عن روبوت الدردشة في أدوات التحليل:

window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
  urlSuffix: '?utm_source=chatbot&utm_medium=widget',
});

حالات الاستخدام:

  • تتبع التحويلات من تفاعلات روبوت الدردشة في Google Analytics.
  • تحليل سلوك المستخدم بعد التفاعل مع روبوت الدردشة.
  • نسب الحملات التي تعزز مشاركة روبوت الدردشة.

Logo

هل أنت مستعد لتنمية عملك؟

ابدأ تجربتك المجانية اليوم وشاهد النتائج في غضون أيام.

التواصل من المضيف إلى التدفق في منتصف المحادثة

أُضيف في أبريل 2026 كجزء من ميزة Chat Hook في FlowHunt.

في تطبيقات الصفحة الواحدة (SPA) تظل نافذة الدردشة مفتوحة عادةً بينما يتنقّل المستخدم بين الشاشات. وبمجرد تشغيل الدردشة، تصبح flowVariables المُمررة عبر setConfig() قديمة، ولا توجد طريقة لتنبيه التدفق بشيء حدث على الصفحة المضيفة. طريقة مدير واحدة — sendHook(name, payload, options?) — تغطي كلتا حالتي الاستخدام: “إطلاق مشغّل” و"مجرد تحديث السياق":

  • مرّر name و(اختيارياً) payload لإطلاق مشغّل Chat Hook الخاص بالتدفق. يضع مؤلف التدفق عقدة Chat Hook واحدة على اللوحة ويتفرّع على {ChatHook.hook_name} ليقرر ما يفعله.
  • مرّر options.flowVariables لدمج متغيرات الجلسة في الوقت نفسه — تُحفظ القيم قبل إطلاق المشغّل وتظل متاحة لبقية الجلسة.
  • إذا لم يكن للتدفق مشغّل Chat Hook، فالاستدعاء هو 200 صامتة بلا تأثير: يُدمَج options.flowVariables رغم ذلك، لكن لا يعمل أي مشغّل ولا يُخصم أي رصيد. هذا يعني أن الصفحات المضيفة يمكنها استدعاء sendHook() بتفاؤل دون معرفة ما إذا كان مؤلف التدفق قد ربط مشغّلاً بعد.

sendHook() آمن بلا تأثير قبل وجود الجلسة (يُخزَّن داخلياً في مخزن مؤقت ويُفرَّغ بمجرد إنشاء الجلسة) ولا يطرح أبداً استثناء إلى الصفحة المضيفة — تُسجَّل أخطاء الشبكة عبر console.warn فقط.

حدود المدخلات

الحدود الخادمية والعميلية التي تنطبق على sendHook(). مخالفتها ليست انهياراً — الواجهة الخلفية تُرجع HTTP 422 ويُسجِّل المدير عبر console.warn دون طرح استثناء.

ConstraintLimitWhere enforcedOn violation
طول name في sendHook1–256 حرفاًالواجهة الخلفية (Pydantic)HTTP 422، لا يُطلق المشغّل
عدد المفاتيح في options.flowVariables≤ 64الواجهة الخلفية (Pydantic)HTTP 422، لا يُحفَظ شيء
طول كل مفتاح في options.flowVariables≤ 128 حرفاًالواجهة الخلفية (Pydantic)HTTP 422، لا يُحفَظ شيء
الاستدعاءات قبل الجلسة المُخزّنة في المدير50الودجت (في المتصفح)يُحذف أقدم استدعاء مُدرج ويُسجَّل console.warn

سعة المخزن المؤقت قبل الجلسة تهمّ فقط في الصفحات التي يفشل فيها إنشاء الجلسة بشكل دائم (مثلاً خطأ شبكة دائم). في الظروف العادية تُفرَّغ القائمة بمجرد إطلاق onFHChatbotSessionCreated.

1. إضافة مشغّل Chat Hook (من جانب مؤلف التدفق)

  1. افتح التدفق المرتبط بروبوت الدردشة في محرر FlowHunt.
  2. اسحب عقدة مشغّل Chat Hook إلى اللوحة. يفرض المحرر مشغّلاً واحداً لكل تدفق — لا يُسمح بأكثر من واحد.
  3. (اختياري) فعِّل Validate Payload Schema وعرِّف JSON Schema يجب أن تتطابق معه الحمولة الواردة. يجري التحقق داخل الخطوة — يظهر عدم التطابق كحدث خطأ في التدفق (تظل النقطة النهائية تُرجع 200؛ والخطأ مرئي عبر onFHError).
  4. اربط مخرجات المشغّل (hook_name، payload، flow_variables) بأي خطوات لاحقة تريد تشغيلها (Generator، Chat Output، Tool Calls، فروع شرطية على hook_name، إلخ).
  5. انشر التدفق.

2. التفرّع على أسماء الخطّافات المختلفة داخل التدفق

الـ name الذي تمرره الصفحة المضيفة إلى sendHook() هو علامة ليتفرّع عليها تدفقك، وليس مفتاح توجيه — الواجهة الخلفية لا تطابق الأسماء مع العقد. بدلاً من ذلك، يُطلق مشغّل Chat Hook الواحد للتدفق ويعرض الاسم بصيغة {ChatHook.hook_name}، الذي تشير إليه في منطق تدفقك لتقرر ما تفعله.

مثال على موجّه النظام:

If {ChatHook.hook_name} is "screen_changed", briefly summarise the page at
{ChatHook.payload.url}. If it is "user_action", acknowledge the action and
update memory. Otherwise, continue the conversation normally.

للتوجيه الأكثر تعقيداً، اربط خطوة شرطية على {ChatHook.hook_name} وتفرّع إلى عدة مسارات لاحقة.

3. chatbotManager.sendHook(name, payload, options?)

chatbotManager.sendHook(
  name: string,
  payload?: Record<string, unknown>,
  options?: { flowVariables?: Record<string, unknown> }
): Promise<void>;

الوسائط

ArgumentTypeRequiredDescription
namestringنعمعلامة تُمرَّر إلى التدفق بصيغة {ChatHook.hook_name}. يُطلق المشغّل بصرف النظر عن القيمة؛ ويتفرّع منطق تدفقك عليها.
payloadobjectلاحمولة JSON تُسلَّم إلى المشغّل بصيغة {ChatHook.payload}. تُتحقَّق مقابل مخطط العقدة إن كان مفعَّلاً. الافتراضي {}.
options.flowVariablesobjectلامتغيرات جلسة لدمجها قبل إطلاق المشغّل. تكون متاحة للخطوات اللاحقة ولرسائل المستخدم القادمة.

السلوك

  • الاستدعاء قبل onFHChatbotSessionCreated آمن؛ يُحفَظ الاستدعاء في مخزن مؤقت ويُفرَّغ بمجرد وجود الجلسة. للمخزن سعة محدودة — انظر حدود المدخلات أعلاه.
  • إذا لم يكن للتدفق مشغّل Chat Hook، فالطلب 200 صامتة بلا تأثير — لذا يمكن للصفحات المضيفة استدعاء sendHook() بتفاؤل قبل أن يربط مؤلف التدفق مشغّلاً. يظل options.flowVariables محفوظاً حتى في تلك الحالة، فالاستدعاء نفسه يخدم كتحديث للسياق فقط.
  • إذا كان لمشغّل Chat Hook التحقق من المخطط مفعَّلاً وفشلت الحمولة فيه، يجري التحقق داخل الخطوة — تُرجع النقطة النهائية 200 لكن التدفق يصدر حدث خطأ خطوة (يمكن مراقبته عبر onFHError).
  • name و options.flowVariables لهما حدود — انظر حدود المدخلات أعلاه. المخالفات تُرجع HTTP 422 ولا يُحفَظ شيء.
  • الاستدعاءات الناجحة تُصدر حدث onFHChatbotFlowVariablesUpdate إذا تم توفير options.flowVariables (انظر مرجع الأحداث).
  • لا يطرح استثناء أبداً. تُسجَّل إخفاقات الشبكة والاستجابات غير 2xx عبر console.warn.

مثال — اقتراح استباقي عند التنقل في SPA

window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
  window.addEventListener('hashchange', function () {
    chatbotManager.sendHook('screen_changed', {
      url: window.location.href,
      screen_name: getScreenName(),
    }, {
      flowVariables: { current_page_url: window.location.href },
    });
  });
});

مثال — تحديث للسياق فقط (دون ربط Chat Hook)

إذا لم يكن للتدفق مشغّل Chat Hook، فالاستدعاء 200 صامتة — لذلك يمكن لنفس الـ API الإبقاء على flow_variables متزامنة دون إطلاق أي شيء:

window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
  window.addEventListener('hashchange', function () {
    chatbotManager.sendHook('navigate', {}, {
      flowVariables: {
        current_page_url: window.location.href,
        screen_name: getScreenName(),
      },
    });
  });
});

4. كيف يستهلك مؤلف التدفق هذه القيم

  • {ChatHook.hook_name} و {ChatHook.payload.foo} — القيم المُمررة عبر sendHook('x', { foo: 1 }) تُكشف على مسار تنفيذ مشغّل Chat Hook. متاحة فقط على المسار الذي بدأه إطلاق الخطّاف.
  • {flow_variables.foo} — القيم المُمررة عبر options.flowVariables تُدمج في حقيبة متغيرات الجلسة قبل إطلاق المشغّل. كل مسار تنفيذ (بما في ذلك رسائل المستخدم العادية المُطلقة عبر Chat Input) يمكنه قراءتها.

إذا أردت أن ترى رسالة المستخدم التالية قيمة جديدة، فضعها في options.flowVariablespayload وحده يؤثر فقط على دورة التنفيذ التي بدأها ذلك الخطّاف.


مرجع الأحداث

يرسل FlowHunt JS API أحد عشر حدثاً مخصصاً على كائن window. تستخدم جميع الأحداث واجهة CustomEvent مع bubbles: true و composed: true.

onFHChatbotReady

يُطلق عندما يكتمل عرض ودجت روبوت الدردشة ويصبح جاهزاً للاستخدام.

  • بيانات الحدث: لا شيء.
  • متى: بعد تركيب DOM الودجت وظهور زر الدردشة.

onFHChatbotSessionCreated

يُطلق عند إنشاء جلسة دردشة جديدة على الخادم.

  • بيانات الحدث: event.detail.sessionId — معرف الجلسة المُنشأة حديثاً.
  • متى: بعد استدعاء API ناجح لإنشاء الجلسة.

onFHChatbotWindowOpened

يُطلق عندما يفتح المستخدم نافذة الدردشة. لا يُطلق في الوضع المضمّن.

onFHChatbotWindowClosed

يُطلق عندما يغلق المستخدم نافذة الدردشة. لا يُطلق في الوضع المضمّن.

onFHMessageSent

يُطلق عندما يرسل المستخدم رسالة.

event.detail.metadata = {
  content: 'Hello, I need help with...',
  createdAt: '2026-02-19T10:30:00.000Z',
};

onFHMessageReceived

يُطلق عندما يستقبل روبوت الدردشة رداً ويعرضه.

event.detail.metadata = {
  flow_id: 'abc123',
  message_id: 'msg_456',
  message: 'Sure, I can help you with that!',
  sender: {
    sender_name: 'Support Agent',
    sender_avatar: 'https://example.com/avatar.png',
  },
};

حقل sender اختياري ويكون موجوداً فقط عندما يكون وكيل بشري مشاركاً.

onFHFormDataSent

يُطلق عندما يرسل المستخدم بيانات نموذج عبر روبوت الدردشة.

event.detail.metadata = {
  objectData: { name: 'John', email: 'john@example.com' },
  createdAt: '2026-02-19T10:31:00.000Z',
};

onFHFeedback

يُطلق عندما يقدم المستخدم تقييماً إيجابياً أو سلبياً على رسالة روبوت الدردشة.

event.detail.metadata = {
  message_id: 'msg_456',
  content: 'Optional feedback text',
  feedback: 'P', // 'P' = positive, 'N' = negative
};

onFHToolCall

يُطلق عند تنفيذ أداة أو إجراء أثناء معالجة التدفق. يُطلق فقط في وضعَي flowAssistant و flowAssistantV3.

event.detail.metadata = {
  metadata: {
    flow_id: 'abc123',
    message_id: 'msg_789',
    message: 'Calling search API...',
  },
  createdAt: '2026-02-19T10:32:00.000Z',
};

onFHError

يُطلق عند حدوث خطأ أثناء تشغيل روبوت الدردشة.

event.detail.metadata = {
  metadata: {
    flow_id: 'abc123',
    message_id: 'msg_err',
    message: 'Flow execution failed',
  },
  createdAt: '2026-02-19T10:33:00.000Z',
};

onFHChatbotFlowVariablesUpdate

أُضيف في أبريل 2026.

يُطلق بعد استدعاء ناجح لـ chatbotManager.sendHook(...) تم تزويده بـ options.flowVariables. لا يُطلق لاستدعاءات sendHook() التي تحذف flowVariables.

event.detail = {
  variables: {
    current_page_url: 'https://example.com/products',
    screen_name: 'products',
  },
};

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


الاشتراك في الأحداث

هناك طريقتان للاشتراك في أحداث روبوت الدردشة.

الطريقة الأولى: مستمعو أحداث النافذة

استخدم window.addEventListener في أي مكان في صفحتك. يعمل هذا حتى قبل تحميل روبوت الدردشة:

<script>
document.addEventListener('DOMContentLoaded', function () {
  window.addEventListener('onFHChatbotReady', function () {
    console.log('Chatbot is ready');
  });

  window.addEventListener('onFHChatbotSessionCreated', function (event) {
    console.log('Session created:', event.detail.sessionId);
  });

  window.addEventListener('onFHChatbotWindowOpened', function () {
    console.log('Chat window opened');
  });

  window.addEventListener('onFHChatbotWindowClosed', function () {
    console.log('Chat window closed');
  });

  window.addEventListener('onFHMessageSent', function (event) {
    console.log('User sent:', event.detail.metadata.content);
  });

  window.addEventListener('onFHMessageReceived', function (event) {
    console.log('Bot replied:', event.detail.metadata.message);
  });

  window.addEventListener('onFHFormDataSent', function (event) {
    console.log('Form submitted:', event.detail.metadata.objectData);
  });

  window.addEventListener('onFHFeedback', function (event) {
    var fb = event.detail.metadata;
    console.log('Feedback on message', fb.message_id, ':', fb.feedback);
  });

  window.addEventListener('onFHToolCall', function (event) {
    console.log('Tool called:', event.detail.metadata);
  });

  window.addEventListener('onFHError', function (event) {
    console.error('Chatbot error:', event.detail.metadata);
  });

  window.addEventListener('onFHChatbotFlowVariablesUpdate', function (event) {
    console.log('Variables merged:', event.detail.variables);
  });
});
</script>

لإزالة مستمع، احتفظ بمرجع المعالج:

var handleMessage = function (event) {
  console.log(event.detail.metadata);
};
window.addEventListener('onFHMessageReceived', handleMessage);
// Later …
window.removeEventListener('onFHMessageReceived', handleMessage);

الطريقة الثانية: طرق الاستدعاء الراجع للمدير

داخل استدعاء init() الراجع، استخدم الطرق المدمجة لمدير روبوت الدردشة:

window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
  chatbotManager.onSessionCreated(function () {
    console.log('Session created');
  });

  chatbotManager.onWindowOpened(function () {
    console.log('Window opened');
  });

  chatbotManager.onWindowClosed(function () {
    console.log('Window closed');
  });

  chatbotManager.onMessageSent(function (event) {
    console.log('User sent:', event.metadata);
  });

  chatbotManager.onMessageReceived(function (event) {
    console.log('Bot replied:', event.metadata);
  });

  chatbotManager.onFormDataSent(function (event) {
    console.log('Form data:', event.metadata);
  });

  chatbotManager.onFeedback(function (event) {
    console.log('Feedback:', event.metadata);
  });

  chatbotManager.onToolCall(function (event) {
    console.log('Tool call:', event.metadata);
  });

  chatbotManager.onError(function (event) {
    console.error('Error:', event.metadata);
  });
});

مرجع طرق المدير

MethodParametersDescription
onSessionCreated(fn)fn: () => voidالاستماع لإنشاء الجلسة
onWindowOpened(fn)fn: () => voidالاستماع لفتح النافذة
onWindowClosed(fn)fn: () => voidالاستماع لإغلاق النافذة
onMessageSent(fn)fn: (event) => voidالاستماع لرسائل المستخدم
onMessageReceived(fn)fn: (event) => voidالاستماع لردود الروبوت
onFormDataSent(fn)fn: (event) => voidالاستماع لإرسال النماذج
onFeedback(fn)fn: (event) => voidالاستماع لتقييمات المستخدم
onToolCall(fn)fn: (event) => voidالاستماع لتنفيذ الأدوات
onError(fn)fn: (event) => voidالاستماع للأخطاء
openChat()يفتح لوحة الدردشة
closeChat()يغلق لوحة الدردشة
sendHook(name, payload?, options?) (جديد)name: string, payload?: object, options?: { flowVariables?: object }يطلق مشغّل Chat Hook في التدفق المُشغَّل (أو يدمج options.flowVariables بصمت إذا لم يُربط أي مشغّل)

تفعيل الدردشة المخصص: إخفاء الزر والفتح عند النقر

للتحكم الكامل في وقت ظهور روبوت الدردشة، أخفِ الزر العائم الافتراضي وافتح الدردشة برمجياً — على سبيل المثال، من زر مخصص خاص بك.

<button id="my-chat-button">Chat with us</button>

<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
  var currentScript = document.currentScript
    || document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');

  var script = document.createElement('script');
  script.async = true;
  script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
    + '?workspace_id=YOUR_WORKSPACE_ID&v=2';

  script.onload = function () {
    window.FHChatbot_YOUR_CHATBOT_ID.setConfig({ showChatButton: false });

    window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
      document.getElementById('my-chat-button')
        .addEventListener('click', function () {
          chatbotManager.openChat();
        });
    });
  };

  if (currentScript && currentScript.parentNode) {
    currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
  } else {
    document.head.appendChild(script);
  }
</script>

إظهار زر مخصص فقط عندما يكون روبوت الدردشة جاهزاً

يمكنك الجمع بين التفعيل المخفي ومستمعي الأحداث لإنشاء تفاعلات متقدمة:

<button id="open-chat" style="display:none;">Need help?</button>

<script>
  window.addEventListener('onFHChatbotReady', function () {
    document.getElementById('open-chat').style.display = 'block';
  });
</script>

<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
  var currentScript = document.currentScript
    || document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');

  var script = document.createElement('script');
  script.async = true;
  script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
    + '?workspace_id=YOUR_WORKSPACE_ID&v=2';

  script.onload = function () {
    window.FHChatbot_YOUR_CHATBOT_ID.setConfig({ showChatButton: false });

    window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
      document.getElementById('open-chat')
        .addEventListener('click', function () {
          chatbotManager.openChat();
        });
    });
  };

  if (currentScript && currentScript.parentNode) {
    currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
  } else {
    document.head.appendChild(script);
  }
</script>

مثال التكامل الكامل

مثال عملي كامل يوضح تجاوز التكوين وتتبع الأحداث وتفعيل الدردشة المخصص وطريقة sendHook() الجديدة معاً:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>FlowHunt Chatbot Integration</title>
  </head>
  <body>
    <h1>My Website</h1>
    <button id="open-chat-btn">Talk to our AI assistant</button>
    <button id="close-chat-btn">Close chat</button>

    <!-- Subscribe to events before the chatbot loads -->
    <script>
      document.addEventListener('DOMContentLoaded', function () {
        window.addEventListener('onFHChatbotReady', function () {
          console.log('Chatbot widget is ready');
        });

        window.addEventListener('onFHChatbotSessionCreated', function (event) {
          console.log('New chat session started:', event.detail.sessionId);
        });

        window.addEventListener('onFHMessageSent', function (event) {
          console.log('User message:', event.detail.metadata.content);
        });

        window.addEventListener('onFHMessageReceived', function (event) {
          console.log('Bot response:', event.detail.metadata.message);
        });

        window.addEventListener('onFHChatbotFlowVariablesUpdate', function (event) {
          console.log('Context updated:', event.detail.variables);
        });

        window.addEventListener('onFHError', function (event) {
          console.error('Chatbot error:', event.detail.metadata);
        });
      });
    </script>

    <!-- FlowHunt integration -->
    <script id="fh-chatbot-script-YOUR_CHATBOT_ID">
      var currentScript = document.currentScript
        || document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');

      var script = document.createElement('script');
      script.async = true;
      script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
        + '?workspace_id=YOUR_WORKSPACE_ID&v=2';

      script.onload = function () {
        window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
          showChatButton: false,
          headerTitle: 'AI Assistant',
          maxWindowWidth: '600px',
          flowVariables: {
            source: 'website',
            current_page_url: window.location.href,
          },
          urlSuffix: '?utm_source=chatbot',
        });

        window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
          // Open / close from custom buttons
          document.getElementById('open-chat-btn')
            .addEventListener('click', function () {
              chatbotManager.openChat();
            });
          document.getElementById('close-chat-btn')
            .addEventListener('click', function () {
              chatbotManager.closeChat();
            });

          // Keep the flow's context in sync with SPA navigation and
          // optionally fire the Chat Hook trigger (if the flow has one wired).
          // If the flow has no Chat Hook, the call is a silent 200 — the
          // flow_variables still get merged, so the same line covers both
          // "notify the flow" and "just update context".
          window.addEventListener('hashchange', function () {
            chatbotManager.sendHook('screen_changed', {
              url: window.location.href,
            }, {
              flowVariables: { current_page_url: window.location.href },
            });
          });
        });
      };

      if (currentScript && currentScript.parentNode) {
        currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
      } else {
        document.head.appendChild(script);
      }
    </script>
  </body>
</html>

الأسئلة الشائعة

اعرف المزيد

mcp التفاعلي
mcp التفاعلي

mcp التفاعلي

قم بدمج FlowHunt مع mcp التفاعلي لتمكين التواصل الآمن والفوري بين نماذج اللغة الكبيرة والمستخدمين على الأجهزة المحلية. التقط مدخلات المستخدم، وقدم إشعارات النظا...

4 دقيقة قراءة
AI interactive-mcp +7
كيفية ربط روبوتات FlowHunt مع واجهات برمجة التطبيقات (API) لأسعار الأسهم والتوصيل في الوقت الحقيقي
كيفية ربط روبوتات FlowHunt مع واجهات برمجة التطبيقات (API) لأسعار الأسهم والتوصيل في الوقت الحقيقي

كيفية ربط روبوتات FlowHunt مع واجهات برمجة التطبيقات (API) لأسعار الأسهم والتوصيل في الوقت الحقيقي

تعرّف على كيفية تمكين روبوت FlowHunt من الإجابة على أسئلة العملاء حول توفر المنتجات وحالة توصيل الطلبات من خلال التكامل مع واجهات برمجة التطبيقات في الوقت الفعل...

5 دقيقة قراءة
chatbot API +3
تكامل FlowHunt–LiveAgent المتقدم: التحكم في اللغة، تصفية الرسائل المزعجة، اختيار واجهة البرمجة، وأفضل ممارسات الأتمتة
تكامل FlowHunt–LiveAgent المتقدم: التحكم في اللغة، تصفية الرسائل المزعجة، اختيار واجهة البرمجة، وأفضل ممارسات الأتمتة

تكامل FlowHunt–LiveAgent المتقدم: التحكم في اللغة، تصفية الرسائل المزعجة، اختيار واجهة البرمجة، وأفضل ممارسات الأتمتة

دليل تقني لإتقان تكامل FlowHunt المتقدم مع LiveAgent، يغطي استهداف اللغة، منع تنسيقات الماركداون، تصفية الرسائل المزعجة، إدارة إصدارات API، اختيار نماذج LLM، أت...

9 دقيقة قراءة
FlowHunt LiveAgent +3