هذا القالب يوضح للبوت أو أي أداة تحرير آلية أنه يجب ألا يقوم بتحرير الصفحة التي تحتوي هذا القالب. يُستخدم القالب لمنع مُعظم البوتات (كل البوتات التي تستخدم هذه الخاصية) أو تمنع بوتات محددة بالاسم أو تمنع وظيفة محددة. على سبيل المثال، يمكن استخدامه للسماح أو لمنع رسائل البوت أو لجعل بوتات الصيانة تتخطى صفحةٍ ما. هذا القالب يجب استخدامه بعناية خارج صفحات المستخدمين لكي لا نفقد تعديدلات مهمة للبوتات.

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

ملاحظات مهمة

معظم البوتات لن تفهم هذه القوالب عندما يتم تضمينها بشكل غير مباشر.

معظم البوتات لن تتجاهل القالب إذا كان داخل علامات <nowiki> ... </nowiki>. على سبيل المثال، إذا كنت تناقش القوالب مع محرر آخر، يُرجى استخدام القالب {{قا}}، مثل {{قا|Bots}}، الذي سيعرض {{Bots}}، بدلاً من <nowiki>{{Bots}}</now>iki>، الذي قد يُعامل على أنه محاولة لحظر البوتات من الصفحة.

استخدام القالب

الاستخدام النتيجة
{{nobots}} منع جميع البوتات (اختصار)
{{bots}} السماح لجميع البوتات (اختصار)
الاستخدام النتيجة
{{bots|allow=<botlist>}}
منع جميع البوتات غير الموجودة في القائمة
{{bots|deny=<botlist>}}
منع جميع البوتات الموجودة في القائمة

يتم فصل أسماء البوتات في بفاصلة <botlist> مثل:

  • {{bots|allow=HagermanBot,Werdnabot}}
  • {{bots|deny=AWB}}

<botlist> يكون أيضًا أن تكون قيمة الوسيط "none" أو "all" كما في الأمثلة التالية:

الاستخدام النتيجة
{{bots|allow=all}} السماح لجميع البوتات
{{bots|allow=none}} منع جميع البوتات
{{bots|deny=all}} منع جميع البوتات
{{bots|deny=none}} السماح لجميع البوتات

البوتات غير ملزمة بمراعاة قالب "nobots"؛ سيعتمد ذلك على وظيفتها ومالكيها وشروط موافقتها. البوتات التي تدعم حالياً استبعاد القوالب مدرجة في بوتات يمكن استبعادها.

صيغة غير صحيحة

تبدو هذه الصيغة صحيحة، ولكن قد لا تكون لها التأثير المقصود تبعًا للبوت الفردي. قد تمنع هذه البيانات كل من بوت1 وبوت2، أو قد تمنع أحد البوتين فقط، أو تمنع كلا البوتين كما هو المقصود.

{{Bots|deny=Bot1|deny=Bot2}} خاطئ

بدلاً من ذلك، اكتب:

{{Bots|deny=Bot1,Bot2}}      صحيح

الاختيار بعدم الإشعار بالرسائل

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

بإضافة هذا إلى صفحة نقاش المستخدم، ما زال بإمكان المستخدم استقبال هذه الرسائل من قبل البوتات أو النصوص غير المتوافقة أو من الأشخاص الذين يقومون يدويًا بإضافة الوسم.

{{Bots|optout=all}}            الاختيار بعدم الاشعار بجميع الرسائل (انظر القيود أدناه).
{{Bots|optout=nosource}}       اختيار عدم استلام رسائل عدم وجود مصدر.
{{Bots|optout=nolicense}}      اختيار عدم استلام رسائل عدم وجود ترخيص.
{{Bots|optout=orfud}}          اختيار عدم استلام رسائل صور غير مألوفة يتيمة.
{{Bots|optout=npd}}            اختيار عدم استلام رسائل بدون إذن.
{{Bots|optout=norationale}}    اختيار عدم استلام رسائل بدون تفسير ‏.
{{Bots|optout=replaceable}}    اختيار عدم استلام رسائل صور قابلة للاستبدال.
{{Bots|optout=bettersource}}   اختيار عدم استلام رسائل طلبات الحصول على مصدر أفضل ‏.
{{Bots|optout=afd}}            اختيار عدم استلام رسائل مقالات للحذف أو أشكال بديلة.
{{Bots|optout=ifd}}            اختيار عدم استلام رسائل صور للحذف ‏ أو بدائلها.
{{Bots|optout=prod}}           اختيار عدم استلام رسائل تحذيرات الحذف السريع ‏.
{{Bots|optout=MassMessage}}    اختيار عدم استلام رسائل الرسائل الجماعية ‏.

يمكن دمج الخيارات عن طريق وضع فاصلة بينها {{Bots|optout=nosource,nolicense}} الاختيار بعدم الاشعار برسائل عدم وجود مصدر وعدم وجود ترخيص. {{Bots|optout=orfud,norationale,replaceable}} الاختيار بعدم الاشعار برسائل استخدام عدم الترخيص للمحتوى المعني.

قيود الرسائل التي يمكن اختيار عدم استلامها

بعض إشعارات الرسائل غير مسموح بها أن تختار عدم استلامها. تشمل هذه:

  1. إشعارات انتهاك حقوق النشر
  2. تحذيرات التخريب (وغيرها)
  3. إشعارات SineBot بشأن عدم توقيع المشاركات
  4. أي علامة رسالة غير مدرجة كوسيلة للاختيار عدم استلامها أعلاه. (هل هناك واحدة يجب تضمينها؟ اترك رسالة على صفحة النقاش.)
  5. الرسائل الجماعية لا يمكن اختيار عدم استلامها باستخدام {{Bots|optout=all}}; يجب على المستخدمين اختيار عدم استلامها بشكل صريح باستخدام {{Bots|optout=MassMessage}}

التنفيذ

  • باي ويكي بوت يدعم القالب، ويمكن تجاهل القالب من الخيارات!.
  • منذ الإصدار 3.2.0.0 أوتوويكي براوزر يدعم بشكل كامل {{bots}} و {{nobots}}. بالإضافة إلى ذلك، يمكن تحديد اسم مستخدم زائف "AWB" (|bots=deny) لحظر جميع الروبوتات المعتمدة على AWB من الصفحة. ومع ذلك، يحتوي AWB على خيار لتجاهل هذه القوالب.

أمثلة على التنفيذ

PHP

function allowBots( $text, $user ) {
    if (preg_match('/\{\{(nobots|bots\|allow=none|bots\|deny=all|bots\|optout=all|bots\|deny=.*?'.preg_quote($user,'/').'.*?)}}/iS',$text))
        return false;
    if (preg_match('/\{\{(bots\|allow=all|bots\|allow=.*?'.preg_quote($user,'/').'.*?)}}/iS', $text))
        return true;
    if (preg_match('/\{\{(bots\|allow=.*?)}}/iS', $text))
        return false;
    return true;
}

Perl

sub allow_bots {
    my($text, $user, $opt) = @_;
    return 0 if $text =~ /{{[nN]obots}}/;
    return 1 if $text =~ /{{[bB]ots}}/;
    if($text =~ /\{\{[bB]ots\s*\|\s*allow\s*=\s*(.*?)\s*}}/s){
        return 1 if $1 eq 'all';
        return 0 if $1 eq 'none';
        my @bots = split(/\s*,\s*/, $1);
        return (grep $_ eq $user, @bots) ? 1 : 0;
    }
    if($text =~ /\{\{[bB]ots\s*\|\s*deny\s*=\s*(.*?)\s*}}/s){
        return 0 if $1 eq 'all';
        return 1 if $1 eq 'none';
        my @bots = split(/\s*,\s*/, $1);
        return (grep $_ eq $user, @bots) ? 0 : 1;
    }
    if(defined($opt) && $text =~ /\{\{[bB]ots\s*\|\s*optout\s*=\s*(.*?)\s*}}/s){
        return 0 if $1 eq 'all';
        my @opt = split(/\s*,\s*/, $1);
        return (grep $_ eq $opt, @opt) ? 0 : 1;
    }
    return 1;
}

VB.NET

Public Shared Function AllowBots(ByVal text As String, ByVal user As String) As Boolean
    Return Not Regex.IsMatch(text, "\{\{(nobots|bots\|(allow=none|deny=(?!none).*(" & user.Normalize() & "|all)|optout=all))\}\}", RegexOptions.IgnoreCase)
End Function

C#

public static bool AllowBots(string text, string user)
{
    return !Regex.IsMatch(text, @"\{\{(nobots|bots\|(allow=none|deny=(?!none).*(" + user.Normalize() + @".*|all)|optout=all))\}\}", RegexOptions.IgnoreCase);
}

Java

public static boolean allowBots(String text, String user)
{
      return !text.matches("(?si).*\\{\\{(nobots|bots\\|(allow=none|deny=([^\\}]*?" + user + "[^\\}]*?|all)|optout=all))\\}\\}.*");
}

JavaScript

function allowBots(text, user){
  if (!new RegExp("\\{\\{\\s*(nobots|bots[^}]*)\\s*\\}\\}", "i").test(text)) return true;
  return (new RegExp("\\{\\{\\s*bots\\s*\\|\\s*deny\\s*=\\s*([^}]*,\\s*)*" + user.replace(/([\(\)\*\+\?\.\-\:\!\=\/\^\$])/g, "\\$1") + "\\s*(?=[,\\}])[^}]*\\s*\\}\\}", "i").test(text)) ? false : new RegExp("\\{\\{\\s*((?!nobots)|bots(\\s*\\|\\s*allow\\s*=\\s*((?!none)|([^}]*,\\s*)*" + user.replace(/([\(\)\*\+\?\.\-\:\!\=\/\^\$])/g, "\\$1") + "\\s*(?=[,\\}])[^}]*|all))?|bots\\s*\\|\\s*deny\\s*=\\s*(?!all)[^}]*|bots\\s*\\|\\s*optout=(?!all)[^}]*)\\s*\\}\\}", "i").test(text);
}

Python

يفترض هذا الكود أن مكتبة mwparserfromhell مُثبتة ومستوردة في البرنامج النصي.

def allow_bots(text, user):
	user = user.lower().strip()
	text = mwparserfromhell.parse(text)
	for tl in text.filter_templates():
		if tl.name.matches(['bots', 'nobots']):
			break
	else:
		return True
	for param in tl.params:
		bots = [x.lower().strip() for x in param.value.split(",")]
		if param.name == 'allow':
			if ''.join(bots) == 'none': return False
			for bot in bots:
				if bot in (user, 'all'):
					return True
		elif param.name == 'deny':
			if ''.join(bots) == 'none': return True
			for bot in bots:
				if bot in (user, 'all'):
					return False
	if (tl.name.matches('nobots') and len(tl.params) == 0):
		return False
	return True

انظر أيضًا