Files
flash-call-otp/docs/SMART_OTP_GATEWAY.md
2026-05-23 16:17:20 +03:00

14 KiB
Raw Blame History

دليل تصميم وهندسة نظام بوابة التحقق الذكي (Smart OTP Gateway)

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

١. تقييم المفهوم: تجربة المستخدم البشرية ضد أنظمة كشف الروبوتات

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

الحل الهندسي يكمن في تطبيق "واجهة تحقق متعددة الطبقات" مدعومة بـ "شبكة تحقق ديناميكية متكيفة".

┌─────────────────────────────────────────────────────────────┐
│                      OTP Delivery Message                   │
│                                                             │
│  ┌───────────────────────┐                                  │
│  │     IMAGE LAYER       │  <-- 80% Anti-Detection Entropy  │
│  │    [ 5  4  1  2 ]     │      (Dynamic Generation/Reveal) │
│  └───────────────────────┘                                  │
│                                                             │
│  Click the button below to verify instantly:                │
│  [ Verify Now (Deep Link) ] <-- 100% Seamless UX            │
│                                                             │
│  *Hidden metadata container* <-- 20% OCR Noise              │
└─────────────────────────────────────────────────────────────┘
الركائز الأساسية لواجهة التحقق متعددة الطبقات: ١. طبقة العرض المرئي الأساسي (الصور والوسائط الديناميكية): يعرض رمز التحقق داخل صورة يتم توليدها ديناميكياً مع خطوط تشويش خفيفة. ٢. البيانات الخفية المصاحبة للرسالة: تحتوي الرسالة على الرمز مشفراً أو مخفياً باستخدام علامات ترميز يونيكود مخفية (مثل المسافات الصفرية أو علامات الاتجاه) لقراءتها تلقائياً بواسطة التطبيق دون أن تثير انتباه العين البشرية أو الروبوتات. ٣. روابط التحقق الفورية (الروابط العميقة): تحتوي الرسالة على رابط عميق آمن يقوم بفتح التطبيق وتأكيد العملية تلقائياً عند النقر عليه دون الحاجة لكتابة أو نسخ أي رمز. ٤. التوجيه الديناميكي المتكيف مع المخاطر: يقوم النظام بتغيير طريقة التحقق تلقائياً بناءً على مستوى خطورة الطلب.

٢. البنية التحتية الحالية للنظام

يتكون النظام الحالي لمكالمات الفلاش من ثلاثة أجزاء رئيسية: ١. خادم الخلفية (PHP API): يتولى إنشاء الرموز، وإدارة الأجهزة المتصلة، وتسجيل المهام، والتحقق من الرموز. ٢. تطبيق الاتصال (Android Caller App): يعمل على هواتف أندرويد حقيقية متصلة بالإنترنت وتحتوي على شرائح اتصال نشطة، حيث يقوم بطلب المهام المعلقة وتنفيذ المكالمات والرسائل النصية تلقائياً. ٣. تطبيق الاستقبال (Flutter Receiver App): يثبت لدى المستخدم النهائي، ويقوم بالتحقق التلقائي في أندرويد عبر قراءة سجل المكالمات للتعرف على مكالمة الفلاش الفائتة، بينما يتيح التعبئة التلقائية للرسائل النصية في آيفون.

٢.١ مخطط سير العمل الحالي في أندرويد (مكالمة الفلاش)

sequenceDiagram
    autonumber
    actor User as User Device (Android)
    participant App as Flutter Receiver App
    participant BE as PHP Backend API
    participant DB as Database / Redis
    participant Caller as Android Caller Node

    User->>App: Input Phone Number & Submit
    App->>BE: POST /api/request-otp (phone, device_type: "android")
    BE->>BE: Generate 4-digit OTP (e.g., 4829)
    BE->>DB: Store OTP in Redis (TTL: 120s)
    BE->>DB: Assign Task (round-robin) to Active Caller Node
    BE->>BE: Format Caller ID Prefix + 2 Random Digits + OTP (e.g., +96279XX4829)
    BE-->>App: JSON Response (otp_id, expires_in, method: "flash_call")
    App->>App: Request READ_CALL_LOG permission & Start Polling
    
    loop Polling Tasks (Every 3s)
        Caller->>BE: GET /api/pending-call?device_id=X
        BE-->>Caller: JSON (pending call: phone + dynamic Caller ID)
    end

    Caller->>User: Initiates Voice Call (displays +96279XX4829)
    Caller->>Caller: Wait 2.5s & Programmatically Terminate Call (Missed Call)
    Caller->>BE: POST /api/call-done (status: "success")
    
    App->>App: Detects Missed Call in Call Log
    App->>App: Extracts last 4 digits of Caller ID (4829)
    App->>BE: POST /api/verify-otp (phone, otp)
    BE->>DB: Verify OTP in Redis & Update DB Status
    BE-->>App: {"success": true, "message": "verified"}
    App->>User: Display Success Screen

٣. بنية بوابة التحقق الذكي المقترحة

تقوم البوابة الذكية بفحص توفر حساب للرقم على وتساب وتيليجرام أولاً لتحديد قناة الإرسال المثالية بدلاً من الاعتماد الكلي على نظام تشغيل الهاتف فقط.

مخطط اتخاذ القرار وقنوات التوجيه

graph TD
    A[Start: Request OTP] --> B{Check WhatsApp Availability}
    B -- Exists --> C[Determine Risk Level]
    C -- Low Risk --> D1[Send Obfuscated Text OTP]
    C -- Medium Risk --> D2[Send Dynamic OTP Image + Deep Link]
    C -- High Risk --> D3[Send Short APNG/MP4 + Deep Link]
    
    B -- Does Not Exist --> F{Check Telegram Availability}
    F -- Exists --> G[Send OTP via Telegram Bot/Client]
    
    F -- Does Not Exist --> H{Check Device OS}
    H -- Android --> I[Trigger Flash Call via Caller Node]
    H -- iOS --> J[Trigger SMS via Caller Node]
    
    D1 --> K[End: Await Verification]
    D2 --> K
    D3 --> K
    G --> K
    I --> K
    J --> K

٣.١ تصنيف مستويات المخاطر الديناميكية

مستوى الخطورة القناة والمحتوى مستوى الأمان مستوى صعوبة تجربة المستخدم حالات الاستخدام المستهدفة
المستوى الأول (منخفض) رمز نصي عادي (مع علامات يونيكود مخفية) منخفض منخفض جداً (تعبئة تلقائية) عناوين إنترنت موثوقة، مستخدمون متكررون
المستوى الثاني (متوسط) صورة ديناميكية ثابتة + رابط تحقق فوري متوسط منخفض (التحقق بنقرة واحدة) التسجيلات القياسية، التوجيه الافتراضي
المستوى الثالث (مرتفع) صورة متحركة APNG/MP4 تظهر تدريجياً + رابط تحقق مرتفع منخفض (التحقق بنقرة واحدة) عناوين إنترنت مشبوهة، طلبات متكررة بكثافة
المستوى الرابع (مشبوه) مكالمة فلاش خارجية / رمز صوتي أقصى حد متوسط (إدخال يدوي وتحدي) تخطي حدود المحاولات المسموحة

٤. المواصفات البرمجية للتكامل

٤.١ بوابة وتساب (Node.js Baileys Gateway)

أ. إضافة واجهة التحقق من الأرقام في خادم الويب

في ملف server.js:

app.post('/api/contacts/check', async (req, res) => {
    const { session_key, phone } = req.body;
    if (!session_key || !phone) {
        return res.status(400).json({ error: 'Missing session_key or phone' });
    }
    try {
        const result = await checkWhatsApp(session_key, phone);
        res.json({ status: 'success', data: result });
    } catch (err) {
        res.status(500).json({ error: err.message || 'Failed to check contact' });
    }
});

ب. توليد صورة رمز التحقق ورابط التحقق التلقائي (PHP Backend)

function generateWhatsAppOtpPayload($otp, $phone, $riskLevel) {
    // Generate Deep Link Token
    $token = bin2hex(random_bytes(16));
    
    // Store deep link token in Redis mapped to phone & OTP (expires in 120s)
    $redis = RedisClient::getInstance();
    $redis->setex("verify_token:{$token}", 120, json_encode([
        'phone' => $phone,
        'otp' => $otp
    ]));
    
    $deepLink = "https://verify.nabeh.app/otp?token=" . $token;
    
    if ($riskLevel === 'level_1') {
        // Obfuscate OTP text using zero-width joiners (ZWJ) or LTR/RTL control characters
        $obfuscatedOtp = "\u{202D}" . implode("\u{200B}", str_split($otp)) . "\u{202C}";
        return [
            'type' => 'text',
            'message' => "رمز التحقق الخاص بك هو: " . $obfuscatedOtp . "\n\nأو اضغط للتحقق الفوري:\n" . $deepLink
        ];
    }
    
    // Create base64 dynamic image for Level 2 & 3
    $imageBase64 = generateOtpImageBase64($otp);
    
    return [
        'type' => 'image',
        'image' => $imageBase64,
        'message' => "اضغط على الرابط أدناه لتأكيد هويتك تلقائيًا دون نسخ الرمز:\n\n" . $deepLink
    ];
}

٥. أتمتة التحقق في تطبيق الهاتف (Flutter Client)

لتحقيق واجهة مستخدم بدون كتابة أو تعبئة يدوية للرموز، يتم تطبيق آليتين أساسيتين في تطبيق فلاتر:
يقوم التطبيق بتسجيل الدومين الخاص به. عند النقر على الرابط من داخل محادثة وتساب أو تيليجرام: ١. يكتشف نظام التشغيل الرابط ويفتح تطبيق الهاتف تلقائياً. ٢. يقوم التطبيق باستخراج التوكين وإرساله مباشرة للخلفية. ٣. تكتمل عملية التحقق بنجاح وينتقل المستخدم للشاشة التالية فوراُ.

٥.٢ قارئ الإشعارات التلقائي (Notification Listener - Android)

بالنسبة لهواتف أندرويد، يمكن الاستماع للإشعارات الواردة برمجياً لقراءة الرسائل وتمرير التوكين أو الرمز المخفي دون الحاجة لفتح وتساب:
void onNotificationReceived(NotificationEvent event) {
  if (event.packageName == "com.whatsapp" && event.title == "Nabeh") {
    final body = event.text ?? "";
    final tokenRegex = RegExp(r"token=([a-f0-9]+)");
    if (tokenRegex.hasMatch(body)) {
      final token = tokenRegex.firstMatch(body)!.group(1);
      _verifyToken(token!);
    }
  }
}

٦. تعديلات قاعدة البيانات

ALTER TABLE otp_requests 
ADD COLUMN channel ENUM('flash_call', 'sms', 'whatsapp', 'telegram') NOT NULL DEFAULT 'flash_call' AFTER method,
ADD COLUMN risk_level ENUM('level_1', 'level_2', 'level_3', 'level_4') NOT NULL DEFAULT 'level_2' AFTER channel,
ADD COLUMN deep_link_token VARCHAR(64) NULL DEFAULT NULL AFTER risk_level;

٧. خطة التطوير والتشغيل

المرحلة الأولى: تهيئة قنوات الفحص والروابط العميقة

١. كتابة وتفعيل منطق الروابط العميقة (Deep Links) في خادم PHP وتطبيق فلاتر. ٢. ربط النطاقات المرتبطة (Associated Domains) في آبل وجوجل.

المرحلة الثانية: تحديثات وتساب (Baileys Node.js)

١. إضافة واجهة التحقق من وجود الرقم على خادم وتساب. ٢. تفعيل مكتبة توليد الصور برمجياً في خادم PHP لإرسال الصور التلقائية عبر وتساب.

المرحلة الثالثة: أتمتة تطبيق الهاتف والبدائل

١. دمج قارئ الإشعارات في فلاتر وتجربة الأتمتة الكاملة. ٢. ربط قنوات الاتصال الفائت والرسائل النصية كقنوات بديلة نهائية في حال عدم نجاح التحقق عبر وتساب أو تيليجرام.