يرشدك هذا الدليل خطوة بخطوة إلى دمج TRACIO في تطبيقك. ستقوم بتثبيت SDK الخاص بالعميل، وتهيئته باستخدام مفتاحك العام، وقراءة أول نتيجة لتحديد هوية الزائر.
ثبّت TRACIO SDK باستخدام مدير الحزم المفضّل لديك:
npm install @tracio/sdkأو باستخدام pnpm:
pnpm add @tracio/sdkأو باستخدام yarn:
yarn add @tracio/sdkإذا كنت لا تستخدم أداة تجميع (bundler)، أدرج وسم سكربت الحافة (edge) في صفحتك. تتم تهيئته تلقائيًا باستخدام المفتاح العام في معامِل الاستعلام k.
اختر الموضع الذي يُحمَّل منه السكربت. تحظر بعض الشبكات وإضافات المتصفح الطلبات الموجَّهة إلى نطاقات التحليلات التابعة لطرف ثالث: مرشّحات الشركات، وأدوات الحجب على مستوى DNS، والقيود الإقليمية، وإضافات الخصوصية. وعند تقديمه من نطاقك الفرعي الخاص، يصبح السكربت طلبًا من الطرف الأول على موقعك ويستمر في العمل في تلك البيئات — انظر النطاقات المخصّصة:
<script src="https://metrics.yoursite.com/s.js?k=PUBLIC_KEY" async></script>أو حمِّله من نطاق الحافة المشترك، وهو أسرع طريقة للبدء:
<script src="https://edge.tracio.ai/s.js?k=PUBLIC_KEY" async></script>استورد Tracio واستدعِ Tracio.init() باستخدام مفتاحك العام. يعيد هذا TracioInstance على الفور — بينما يُحمَّل الوكيل (agent) الأساسي في الخلفية.
import { Tracio } from "@tracio/sdk"
const tracio = Tracio.init({ publicKey: "5ca175fc...",})مفتاحك العام آمن للشحن ضمن الكود الذي يعمل من جهة العميل. يمكنك العثور عليه في لوحة التحكم ضمن API Keys.
يقبل Tracio.init() كائنًا من نوع TracioConfig:
| الخيار | النوع | الافتراضي | الوصف |
|---|---|---|---|
publicKey | string | مطلوب | مفتاحك العام. انسخه من لوحة التحكم. |
region | "us" | "eu" | لا شيء | منطقة بيانات اختيارية. عند عدم تعيينها، يستخدم SDK نقطة النهاية العامة https://edge.tracio.ai (دون افتراض ضمني لإقامة البيانات في الولايات المتحدة). عيّنها صراحةً لتثبيتها على us أو eu. يُتجاهَل عند ضبط endpoint. |
endpoint | string | تلقائي | أصل نطاقك الفرعي الخاص، مثل https://metrics.yoursite.com. يُقدَّم منه السكربت والإشارات. انظر النطاقات المخصّصة. |
scriptUrl | string | تلقائي | عنوان URL الكامل لسكربت الوكيل. يستبدل العنوان بأكمله، بما في ذلك المفتاح العام — وللنطاق المخصّص استخدم endpoint بدلًا منه. |
linkedId | string | لا شيء | معرّف يربط هذا الزائر بكيان في نظامك. انظر ربط الحسابات. |
tag | string | لا شيء | وسم حر يُرفَق بالطلب لأغراض التصفية لاحقًا. |
debug | boolean | false | يسجّل تشخيصات مفصّلة في وحدة التحكم (console). |
timeoutMs | number | 15000 | مدة الانتظار للنتيجة قبل انتهاء المهلة. |
استدعِ tracio.getVisitorId() للحصول على معرّف زائر ثابت. هذه عملية غير متزامنة.
const visitorId = await tracio.getVisitorId()
console.log(visitorId) // "X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y"استدعِ tracio.getResult() للحصول على نتيجة تحديد الهوية الكاملة، بما في ذلك كشف البوتات.
const result = await tracio.getResult()
console.log(result.visitorId) // "X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y"
if (result.bot.detected) { console.warn("bot, confidence:", result.bot.confidence)}تأتي النتيجة بالشكل التالي:
{ visitorId: "X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y", bot: { detected: false, confidence: 2, // 0-100 reasons: [], },}استخدم استدعاءات دورة الحياة (lifecycle callbacks) للتفاعل عندما يصبح الوكيل جاهزًا أو عند فشل شيء ما، واستخدم destroy() لهدم النسخة:
const tracio = Tracio.init({ publicKey: "5ca175fc..." })
tracio.onReady((result) => { console.log("ready:", result.visitorId)})
tracio.onError((error) => { console.error("tracio error:", error.code, error.message)})
// later, when you no longer need ittracio.destroy()راجع معالجة الأخطاء للاطلاع على القائمة الكاملة لرموز الأخطاء وأدوات إعادة المحاولة المساعِدة.
import { Tracio } from "@tracio/sdk"
const tracio = Tracio.init({ publicKey: "5ca175fc..." })
async function handleLogin(email: string, password: string) { const visitorId = await tracio.getVisitorId()
const response = await fetch("/api/login", { method: "POST", body: JSON.stringify({ email, password, visitorId }), })
return response.json()}import { Tracio } from "@tracio/sdk"
const tracio = Tracio.init({ publicKey: "5ca175fc...", tag: "payment",})
async function processPayment(paymentData: PaymentData) { const result = await tracio.getResult()
if (result.bot.detected) { throw new Error("Automated client detected") }
const response = await fetch("/api/payment", { method: "POST", body: JSON.stringify({ ...paymentData, visitorId: result.visitorId }), })
return response.json()}