كيف تربط أي API خارجي بموقعك — بدون ما ينكشف مفتاحك

تربط أي API خارجي بموقعك على ابني عبر دالة سحابة: تحفظ المفتاح في «الأسرار»، ويكتب ابني دالة على الخادم تنادي المزوّد وترجّع النتيجة لصفحتك. المفتاح ما يمرّ بالمتصفح، ولا يظهر بكود الموقع، ولا يوصل للذكاء الاصطناعي. والوكيل يقدر يبحث عن توثيق المزوّد ويقرأه ويجرّب الطرف فعلياً قبل ما يكتب سطر واحد. هالصفحة تشرح الخطوات الخمس، والحدود الحقيقية للتنفيذ، وكيف تتصرّف لما يرد المزوّد بخطأ.

نُشر في:

ابدأ مجاناً
م
لوحة المبيعاتمباشرآخر ٣٠ يوم ▾
٤٥٢ طلب هالشهر١٢٬٤٠٠ مبيعات د.أ+١٨٪نمو شهري
المبيعات عبر الوقت٦٨٪هدف الشهر
موقع تبنيه بابني بالعربي

الطريق الذي يسلكه الطلب

الربط الصحيح فيه أربع محطات، والمفتاح يعيش في محطة واحدة منها فقط.

زائر موقعك
يضغط زراً بالصفحة
cloud.fn.call
نداء واحد من الصفحة للخادم
دالتك على الخادم
تقرأ المفتاح بـ ebnii.secrets.get
الـ API الخارجي
نداء عبر ebnii.fetch
النتيجة بالصفحة
بيانات فقط، بلا أي مفتاح
المفتاح يُقرأ في المحطة الثالثة ويبقى فيها. المتصفح ما يشوفه، والزائر ما يقدر يستخرجه من مصدر الصفحة ولا من أدوات المطوّر.

الأرقام التي تحكم أي ربط

هذي حدود التنفيذ الفعلية داخل دالة السحابة. صمّم ربطك على أساسها من البداية بدل ما تصطدم فيها بعدين.

10 ثوانٍ
مهلة تنفيذ الدالة للزائر
و25 ثانية لما تشغّلها أنت صاحب الموقع
8
نداءات خارجية بالتشغيلة
ترفع لصاحب الموقع بحد أقصى 24
2 ميغابايت
أقصى حجم رد يُقبل
يُقطع أثناء استقبال البايتات لا بعدها
40 حرفاً
أقصى طول اسم المفتاح
حروف إنجليزية كبيرة وأرقام وشرطة سفلية

خمس خطوات لربط API بموقعك

١

اطلب الربط بالمحادثة بلغة عادية

قل لابني وين تبي توصل وليش، مثلاً: «اربط الموقع بـ API شركة الشحن عشان أعرض سعر الشحن قبل تأكيد الطلب». ابني يقدر يبحث بالويب عن توثيق المزوّد ويقرأه، ويجرّب الطرف فعلياً برد حقيقي قبل ما يكتب الكود. هذي الخطوة أهم مما تبدو: أغلب أخطاء الربط سببها افتراض شكل رد مختلف عن الرد الفعلي.

٢

أعطِ المفتاح في البطاقة الآمنة

لما يحتاج ابني مفتاحاً، يطلع لك داخل المحادثة حقل إدخال آمن. القيمة تروح للخادم مباشرة وما تمرّ بالنموذج ولا تنكتب بسجل المحادثة. اسم المفتاح لازم يكون بصيغة SHIPPING_API_KEY — حروف كبيرة وأرقام وشرطة سفلية، حتى 40 حرفاً — والقيمة حتى 2000 حرف. تقدر كمان تضيفه بنفسك من لوحة «الأسرار» بالمحرر، أو تختار مزوّداً من المعرض إذا كان من المزوّدين المشروحين: تويليو، بوت تيليجرام، واتساب أعمال، Calendly، Airtable، Notion، خرائط جوجل، يوتيوب، Mailchimp، سلاك، ديسكورد.

٣

ابني يكتب الدالة على الخادم

الدالة ملف باسم functions/اسمها.js يصدّر async function handler(req) حيث req فيه method وpayload. جوّاها يقرأ المفتاح بـ ebnii.secrets.get وينادي المزوّد بـ ebnii.fetch مع method وheaders وbody. انتبه لتفصيلة عملية: جسم الرد يرجع نصاً خاماً، فالدالة هي اللي تحلّله وتتحقق من رمز الحالة. الأسرار المحمّلة للصندوق هي أسرار هالمشروع فقط، لا غير.

٤

جرّبها من صفحتك

من كود الصفحة تنادي الدالة بسطر واحد: cloud.fn.call مع اسم الدالة والبيانات. الحدود على النداء واضحة: 30 نداء بالدقيقة لك أنت، و60 بالدقيقة لكل زائر حسب عنوانه، و240 بالدقيقة للمشروع كله. لو موقعك يتوقّع ضغطاً أعلى من هذا على طرف واحد، الحل مو رفع الحد — الحل تخزين النتيجة بقاعدة بيانات الموقع وقراءتها من هناك.

٥

تأكد إن المفتاح فعلاً شغّال

لحظة الحفظ، المنصة تسوي نداءً واحداً رخيصاً وآمن التكرار للمزوّد وتسجّل النتيجة. تشوف بلوحة الأسرار «شغّال ✓» إذا قبله المزوّد، أو «الخدمة رفضته» إذا رجع رفضاً صريحاً للصلاحية، أو «محفوظ» إذا كان المزوّد ما عنده طريقة فحص معروفة عندنا. «محفوظ» يعني ما في فحص تلقائي لهالمفتاح — مو يعني إنه فاشل.

شو متوفر داخل الدالة بالضبط

الدوال تشتغل داخل صندوق QuickJS معزول على الخادم — مو بيئة Node.js. هذا معناه إن اللي تحت متوفر، واللي مو مذكور غالباً مو موجود.

الأداةتسوي ماذاالحد العملي
ebnii.fetchنداء HTTP خارجي بـ method وheaders وbody8 نداءات بالتشغيلة، والجسم يرجع نصاً خاماً
ebnii.secrets.getتقرأ مفتاحك على الخادمما يرجع للمتصفح، ويُشطب من السجلات والتقارير
ebnii.cryptohmac وhash وtimingSafeEqual وjwtSign وjwtVerifyتوقيع HS256 وRS256، وrandomHex وuuid
ebnii.dblist وinsert وupdate وremove بصلاحية صاحب الموقعlist يوقف عند 200 صف وما فيه offset ولا listAll
ebnii.email.sendترسل لأي عنوان بريد5 رسائل بالتشغيلة الواحدة
ebnii.jobs.enqueueتؤجل الشغل الطويل لتشغيلة ثانية10 مهام بالتشغيلة، 500 باليوم، 200 معلّقة
ebnii.format وebnii.csv وebnii.urlتنسيق عملة وتواريخ، وقراءة وكتابة CSVبديل عن Intl وURL — الاثنان غير موجودين
مكتبات npm وrequire وsetTimeout وfs وprocessغير موجودة أصلاًالصندوق معزول تماماً عن Node والمتصفح
الدوال ما فيها DOM ولا مؤقتات ولا Buffer ولا TextEncoder. لو مزوّدك يوثّق REST فقط، هذا يكفي؛ ولو ما عنده إلا مكتبة npm، الربط المباشر مو المسار.

متى يكون الربط المباشر هو الحل الصحيح

الربط داخل ابني ممتاز لنمط معيّن من التكاملات، وسيّئ لنمط ثاني. اعرف الفرق قبل ما تبني عليه.

مناسب تماماً

  • عملية من نداء أو نداءين: تسعيرة شحن، إرسال رسالة، إنشاء سجل عند مزوّد، فحص رصيد.
  • المزوّد يوثّق REST بمفتاح Bearer أو Basic بدون SDK إجباري.
  • العملية تخلص بثوانٍ والزائر مستنّي النتيجة قدامه على الشاشة.
  • تحتاج توقيعاً أو تجزئة: ebnii.crypto فيه HMAC وJWT وtimingSafeEqual جاهزين بلا مكتبات.
  • تبي تخزّن ناتج النداء عندك: ebnii.db يكتب بصلاحية صاحب الموقع مباشرة.

فكّر بطريقة ثانية

  • المزوّد ما عنده إلا مكتبة npm ولا يوثّق REST — ما في require داخل الصندوق.
  • العملية تحتاج أكثر من 8 نداءات خارجية أو أطول من 10 ثوانٍ — قسّمها على مهام مؤجلة بـ ebnii.jobs.enqueue بدل ما تصطدم بالمهلة.
  • تحتاج تحويل ملفات مثل PDF إلى وورد أو ضغط فيديو — هذا غير مدعوم داخل الدوال إطلاقاً.
  • الطرف اللي تناديه داخل شبكة خاصة أو على عنوان محلي: النداءات للشبكات الداخلية وعناوين البيانات الوصفية مرفوضة، وكل قفزة بسلسلة التحويلات تُفحص لحالها.
  • تبي ترسل بريداً عبر Resend أو SendGrid أو SMTP: مرفوض بالاسم — البريد مُدار من المنصة عبر cloud.email.
  • تحتاج تسحب آلاف الصفوف من قاعدة بياناتك داخل الدالة: list يوقف عند 200 صف بلا offset.

التعامل مع الأخطاء بدل ما تنكسر الصفحة

ارجع رسالة عربية واضحة من الدالة، ولا ترمي رد المزوّد كما هو للزائر. رد المزوّد يوصلك نصاً خاماً من ebnii.fetch: تتحقق من رمز الحالة، تقرأ الحقل اللي يهمك، وترجّع للصفحة شيئاً مفهوماً مثل «ما قدرنا نجيب سعر الشحن لهالمدينة الآن، جرّب بعد شوي». رسالة الخطأ اللي تشرح المشكلة بلغة الزائر تقلّل الاتصالات على خدمة العملاء أكثر من أي تحسين آخر بالصفحة.

لو تجاوزت الدالة مهلتها، ترجع «انتهت مهلة التنفيذ». هذا مو عطل عشوائي — هذا إشارة إنك تحاول تسوي شغلاً أكثر من اللازم بتشغيلة وحدة. القسمة الصحيحة إن التشغيلة الأولى تستقبل الطلب وتخزّنه بقاعدة البيانات وترد على الزائر فوراً، وebnii.jobs.enqueue تكمّل الباقي بالخلفية. المهام المؤجلة تُعاد ثلاث محاولات بتباعد متزايد قبل ما تُعتبر فاشلة، وebnii.sleep داخل الدالة أقصاه خمس ثوانٍ فما ينفع تنتظر فيها رداً بطيئاً.

سجّل بلا ما تسرّب. ebnii.log يطبع لك أثناء التطوير، وقيم الأسرار وأشكال بيانات الزوّار تُشطب تلقائياً من السجلات وتقارير الأخطاء. يعني تقدر تطبع الرد الكامل من المزوّد وأنت مرتاح إن المفتاح ما راح يظهر بالسجل. وأخيراً: لو الربط صار عبر ويبهوك داخل من طرف خارجي، تذكّر إن هوية المستخدم داخل الويبهوك دائماً فارغة، والتحقق من صحة الطلب يتم بالتوقيع لا بالهوية.

أسئلة شائعة

هل لازم أعرف برمجة عشان أربط API؟

لا. تقول لابني بالعربي شو تبي توصل وليش، وهو يبحث عن توثيق المزوّد ويقرأه ويكتب الدالة ويربطها بالصفحة. دورك الوحيد إنك تعطيه المفتاح في البطاقة الآمنة وتجرّب النتيجة على الموقع. لو رد المزوّد جا بشكل غير متوقّع، تقوله بالمحادثة وهو يعدّل.

وين ينحفظ مفتاح الـ API بالضبط؟

بجدول أسرار خاص بمشروعك على الخادم، ما يوصله إلا خادم ابني نفسه. ما يوصل للمتصفح ولا لزوّار الموقع ولا للذكاء الاصطناعي، وقيمته تنشطب من السجلات وتقارير الأخطاء. ما منوصفه بـ«مشفّر» لأن الوصف الدقيق إنه محمي بعزل صلاحيات لا بتشفير على مستوى التطبيق. والقيمة ما ترجع تنعرض بعد الحفظ ولو آخر أربعة حروف.

أقدر أستخدم مكتبة npm الرسمية للمزوّد؟

لا. الدوال تشتغل داخل صندوق QuickJS معزول، بدون import ولا require ولا Node ولا npm ولا DOM. البديل العملي إنك تنادي طرف REST مباشرة بـ ebnii.fetch — وهذا يغطي الغالبية العظمى من المزوّدين، لأن أغلب المكتبات أصلاً ما هي إلا غلاف حول نداء HTTP.

كم API أقدر أربط بموقع واحد؟

الحد مو على عدد المزوّدين ولا عدد المفاتيح. الحد على التشغيلة الواحدة: 8 نداءات خارجية بالتشغيلة — تُرفع بحد أقصى 24 لتشغيلة صاحب الموقع — و10 ثوانٍ مهلة لطلب الزائر و25 ثانية لك. تقدر تربط عدة خدمات وتوزّعها على دوال منفصلة، كل وحدة تسوي شغلة وحدة.

ليش ما أنادي الـ API مباشرة من كود الصفحة؟

لأن أي شيء بكود الصفحة يقدر أي زائر يقرأه. مفتاحك ينكشف بأول فتح لأدوات المطوّر، وأول واحد يلاقيه يقدر يصرف عليه بحسابك. الدالة السحابية تحلّ هالمشكلة من أساسها: النداء يصير على الخادم، والصفحة تستلم النتيجة فقط. المفاتيح العلنية المخصّصة للمتصفح — مثل مفتاح خرائط جوجل الأمامي أو مفتاح سترايب المنشور — استثناء مقصود وتعيش بالكود بشكل طبيعي.

كيف أعرف إن المفتاح توقف عن العمل؟

لوحة الأسرار تعرض حالة الفحص وقت الحفظ: «شغّال ✓» إذا قبله المزوّد، «الخدمة رفضته» إذا رجع رفضاً صريحاً، و«محفوظ» إذا ما في فحص تلقائي لهذا المزوّد. لكن الفحص يتم وقت الحفظ لا باستمرار، فالطريقة العملية إن دالتك ترجّع رسالة واضحة عند فشل التوثيق، وترسل لك تنبيهاً بالإيميل عشان تنتبه قبل الزبون.

اقرأ أيضاً

ربط APIs مخصّصة داخل موقعكالدوال السحابية: كود يشتغل على الخادماستقبال الويبهوك من الأنظمة الخارجيةدفع العملاء المحتملين إلى الـ CRM تلقائياًالمهام المجدولة داخل موقعك

اربط أول API لك اليوم

افتح محادثة مع ابني، قل له وين تبي توصل، وأعطه المفتاح في البطاقة الآمنة — هو يقرأ التوثيق ويكتب الدالة ويجرّبها على موقعك.

ابدأ مجاناً