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

[ XF 2.3 ] كود الغاء الروابط الخارجية لمنع الاشهار العشوائي

motasem

:: الأعضاء ::
29 يناير 2020
157
4
52
28
اعضاء وزوار منتدى زين بالعربية، نعود اليكم من جديد بكود وخاصية جديدة لحماية مواقعكم ومنتدياتكم من الروابط الخارجية والسبام. بشكل مختصر، يعمل هذا الكود على تحويل الروابط الخارجية الى رابط موقعك، ويعمل على شكلين. في حال كان الرابط ملحوق بنص فإنه يحول الرابط مباشرة الى رابط موقعكك، وفي حال كان الرابط على شكل رابط فانه يحوله الى نجوم ويحوله الى رابط موقعك ايضًا.

وطبعًا لم انسى الاستثناءات، إذ انه هناك مكان للروابط الاستثنائية مثل مواقع التواصل واليوتيوب وغيره، بحيث يمكنك اضافة اي استثناء من خلال الكود نفسه لاي رابط خارجي تريده حتى لا يحدث خلل وعشوائية في الغاء الروابط.​

قمت تجربة الكود على نسخة موقعي وهي 2.3.3 والمفترض انه يعمل على جميع النسخ اذ انه غير مربوط بأي وسم معين من الزين فورو.

كود الغاء الروابط الخارجية لمنع الاشهار العشوائي

تركيب الكود​

انا قمت بتركيب الكود وتجربته في قالب Thread_view حتى يعمل الكود في المواضيع فقط ويمكنك وضعه PageContainer حتى يعمل بكل المنتدى واضف الكود التالي في بداية او نهاية القالب:
لا تنسى تغيير yoursite برابط منتداك
JavaScript:
<script>
const config = {
    siteUrl: 'https://yoursite.com',
  
    whitelist: [
        'youtube.com',
        'youtu.be',
        'facebook.com',
        'twitter.com',
        'iinkor.com',
        'forum.iinkor.com',
        'instagram.com'
    ]
};

function isWhitelisted(url) {
    return config.whitelist.some(domain => url.includes(domain));
}

function isExternalLink(url) {
    try {
        const urlObj = new URL(url);
        const siteUrlObj = new URL(config.siteUrl);
        return urlObj.hostname !== siteUrlObj.hostname;
    } catch (e) {
        return false;
    }
}

function convertExternalLink(url, replaceWithStars = false) {
    if (!url) return url;
  
    // تجاهل الروابط الداخلية والمستثناة
    if (!isExternalLink(url) || isWhitelisted(url)) {
        return url;
    }
  
    if (replaceWithStars) {
        return '****';
    }
  
    return config.siteUrl;
}

function processBBCodeLinks() {
    const textNodes = document.evaluate(
        "//text()[contains(., '[URL')]",
        document,
        null,
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
        null
    );

    for (let i = 0; i < textNodes.snapshotLength; i++) {
        const node = textNodes.snapshotItem(i);
        let text = node.textContent;

        text = text.replace(
            /\[URL[^\]]*\](https?:\/\/[^\[]+)\[\/URL\]/g,
            (match, url) => {
                const isUrlAlone = text.trim() === match;
                const newUrl = convertExternalLink(url.trim(), isUrlAlone);
                return `[URL]${newUrl}[/URL]`;
            }
        );

        if (text !== node.textContent) {
            node.textContent = text;
        }
    }
}

function processPlainTextLinks() {
    const textNodes = document.evaluate(
        "//text()[contains(., 'http://') or contains(., 'https://')]",
        document,
        null,
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
        null
    );

    for (let i = 0; i < textNodes.snapshotLength; i++) {
        const node = textNodes.snapshotItem(i);
        let text = node.textContent;

        text = text.replace(
            /(https?:\/\/[^\s\[\]<>"']+)/g,
            (match) => {
                // تحقق مما إذا كان الرابط وحده في النص
                const isUrlAlone = text.trim() === match;
                return convertExternalLink(match, isUrlAlone);
            }
        );

        if (text !== node.textContent) {
            node.textContent = text;
        }
    }
}

function processPageLinks() {
    const links = document.querySelectorAll('.message-body a, .p-body-pageContent a');
    links.forEach(link => {
        const href = link.getAttribute('href');
        if (href) {
            const isUrlAlone = link.textContent.trim() === href;
            const newHref = convertExternalLink(href, isUrlAlone);
            if (newHref !== href) {
                link.setAttribute('href', newHref);
                if (isUrlAlone) {
                    link.textContent = '****';
                }
                link.classList.add('external-redirect');
            }
        }
    });

    processBBCodeLinks();
  
    processPlainTextLinks();
}

document.addEventListener('DOMContentLoaded', processPageLinks);

document.addEventListener('XFContentLoaded', processPageLinks);

const observer = new MutationObserver((mutations) => {
    mutations.forEach((mutation) => {
        if (mutation.addedNodes && mutation.addedNodes.length > 0) {
            processPageLinks();
        }
    });
});

observer.observe(document.body, {
    childList: true,
    subtree: true
});
</script>

ان شاء الله يكون الكود مفيد ويلبي احتياجاتكم
بالتوفيق للجميع
والسلام ختام
 
التعديل الأخير:
طيب ما ممكن اكتب دومبن الذي لا اريده بالرقابه و استبدال نص النقاط برابط موقعي

ولكن تسلم ايدك, ابدعت
 
طيب ما ممكن اكتب دومبن الذي لا اريده بالرقابه و استبدال نص النقاط برابط موقعي
اخي هذا منع للاشهار العشوائي من الاعضاء الـ Spam اللي انتشروا اخر فترة بوضع مواضيع اعلانات عشوائية
ما يعني انك الروابط لا تعرفها اصلا لتكتبها في الرقابة ووقتها كل ما عضو سبام ييجي يضع رابط اعلاني جديد في موقعك بتضطر تاخد الرابط وتضعه بالرقابه
ولكن الروابط المسموحة في المنتديات العامة معروفة وقليلة ويمكن حصرها تواصل اجتماعي ومراركز رفع وتحميل ويوتيوب
لذلك الكود جيد لهم خصيصًا لو اهمل المنتدى لفترة من الزمن
 
اخي هذا منع للاشهار العشوائي من الاعضاء الـ Spam اللي انتشروا اخر فترة بوضع مواضيع اعلانات عشوائية
ما يعني انك الروابط لا تعرفها اصلا لتكتبها في الرقابة ووقتها كل ما عضو سبام ييجي يضع رابط اعلاني جديد في موقعك بتضطر تاخد الرابط وتضعه بالرقابه
ولكن الروابط المسموحة في المنتديات العامة معروفة وقليلة ويمكن حصرها تواصل اجتماعي ومراركز رفع وتحميل ويوتيوب
لذلك الكود جيد لهم خصيصًا لو اهمل المنتدى لفترة من الزمن
فهمتك ممكن تبعتلي خاص
 

إحصائيات المنتدى

المواضيع
1,665
المشاركات
18,683
الأعضاء
1,270
آخر عضو مسجل
Zekal
أعلى