<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://hna.wiki/Template:Bots/doc?action=history&amp;feed=atom</id>
	<title>Template:Bots/doc - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://hna.wiki/Template:Bots/doc?action=history&amp;feed=atom"/>
	<link rel="alternate" type="text/html" href="https://hna.wiki/Template:Bots/doc?action=history"/>
	<updated>2026-07-15T00:26:05Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://hna.wiki/Template:Bots/doc?diff=260&amp;oldid=prev</id>
		<title>Mattk4355: Created page with &quot;{{Documentation/Header}} The &#039;&#039;&#039;Bots&#039;&#039;&#039; and &#039;&#039;&#039;Nobots&#039;&#039;&#039; templates tell bots and other automated editing tools and scripts that they either should or should not edit a page that has the template. The templates can be used to block most bots (all bots that have implemented this functionality) or specific bots by name or function. For example, this can be used to opt-in or opt-out from user talk bot messages or to cause maintenance bots to avoid certain pages. These templa...&quot;</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/Template:Bots/doc?diff=260&amp;oldid=prev"/>
		<updated>2025-08-29T15:22:51Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;{{Documentation/Header}} The &amp;#039;&amp;#039;&amp;#039;Bots&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;Nobots&amp;#039;&amp;#039;&amp;#039; templates tell bots and other automated editing tools and scripts that they either should or should not edit a page that has the template. The templates can be used to block most bots (all bots that have implemented this functionality) or specific bots by name or function. For example, this can be used to opt-in or opt-out from user talk bot messages or to cause maintenance bots to avoid certain pages. These templa...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Documentation/Header}}&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Bots&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;Nobots&amp;#039;&amp;#039;&amp;#039; templates tell bots and other automated editing tools and scripts that they either should or should not edit a page that has the template. The templates can be used to block most bots (all bots that have implemented this functionality) or specific bots by name or function. For example, this can be used to opt-in or opt-out from user talk bot messages or to cause maintenance bots to avoid certain pages. These templates should be used carefully outside userspace to avoid blocking useful bot edits.&lt;br /&gt;
&lt;br /&gt;
Explicitly opting-in has the advantage of receiving useful changes or targeted posts a bot might otherwise skip by following &amp;quot;opt-out&amp;quot; behavior by default. Users should be aware that by opting-out of bot posts, they will not be notified of matters relating to material they have edited or uploaded, which are tagged or scanned by bots per policy.&lt;br /&gt;
&lt;br /&gt;
In particular, in the encyclopedia spaces:&lt;br /&gt;
* Avoid using the template as a blunt instrument&lt;br /&gt;
* Address the root problem with the bot owner or bot community&lt;br /&gt;
* Remove the template tag once the underlying problem has been resolved.&lt;br /&gt;
&lt;br /&gt;
==Important notes==&lt;br /&gt;
Most bots will NOT understand these templates when they are indirectly transcluded.&lt;br /&gt;
&lt;br /&gt;
Most bots will not disregard the template if it is inside of &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;&amp;lt;now&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;iki&amp;gt; ... &amp;lt;/now&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;iki&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039; tags.  For example, if you are discussing the templates with another editor, please use the {{t|t}} template, e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{t|nobots}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, which will show {{t|nobots}}, rather than &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;no&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;wiki&amp;gt;{{nobots}}&amp;lt;/now&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;iki&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, which will possibly be parsed as intending to ban bots from the page.&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;{{nobots}}&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;                Ban all compliant bots (shortcut that takes no parameters)&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;{{bots}}&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;                  Allow all bots (shortcut that takes no parameters)&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;{{bots|allow=&amp;lt;botlist&amp;gt;}}&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;  Ban all compliant bots not in the list&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;{{bots|deny=&amp;lt;botlist&amp;gt;}}&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;   Ban all compliant bots in the list&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;Where &amp;lt;botlist&amp;gt; is a comma-delimited string of bot usernames (AWB can be used for all AWB-based bots):&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;{{bots|allow=SineBot,Legobot}}&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;{{bots|deny=AWB}}&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;lt;botlist&amp;gt; can also be &amp;quot;none&amp;quot; or &amp;quot;all&amp;quot; as in the following examples:&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;{{bots|allow=all}}&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;      Allow all bots&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;{{bots|allow=none}}&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;     Ban all compliant bots&lt;br /&gt;
&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;{{bots|deny=all}}&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;       Ban all compliant bots&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;{{bots|deny=none}}&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;      Allow all bots&lt;br /&gt;
&lt;br /&gt;
Bots are not bound to observe the nobots template; it will depend on their functionality, their owners and their terms of approval.&lt;br /&gt;
&lt;br /&gt;
==Incorrect syntax==&lt;br /&gt;
This syntax looks correct, but depending on the individual bot may not have the intended effect. This statement may deny neither Bot1 nor Bot2, only one of the two bots, or both bots as intended.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;{{bots|deny=Bot1|deny=Bot2}}&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039; INCORRECT&lt;br /&gt;
&lt;br /&gt;
Instead, write:&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;{{bots|deny=Bot1,Bot2}}&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;      CORRECT&lt;br /&gt;
&lt;br /&gt;
==Implementation==&lt;br /&gt;
*[[mw:Pywikibot|Pywikibot]] supports bots and nobots since &amp;#039;&amp;#039;r4096&amp;#039;&amp;#039;. The templates may be ignored using a parameter.&lt;br /&gt;
*Since version 3.2.0.0 {{w|AutoWikiBrowser}} fully supports &amp;lt;nowiki&amp;gt;{{bots}} and {{nobots}}&amp;lt;/nowiki&amp;gt;. Additionally, pseudo-username &amp;#039;&amp;#039;AWB&amp;#039;&amp;#039; can be specified to ban all AWB-based bots from the page. However, AWB has an option to ignore these templates.&lt;br /&gt;
&lt;br /&gt;
===Example implementations===&lt;br /&gt;
====PHP====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function allowBots( $text, $user ) {&lt;br /&gt;
    if (preg_match(&amp;#039;/\{\{(nobots|bots\|allow=none|bots\|deny=all|bots\|optout=all|bots\|deny=.*?&amp;#039;.preg_quote($user,&amp;#039;/&amp;#039;).&amp;#039;.*?)}}/iS&amp;#039;,$text))&lt;br /&gt;
        return false;&lt;br /&gt;
    if (preg_match(&amp;#039;/\{\{(bots\|allow=all|bots\|allow=.*?&amp;#039;.preg_quote($user,&amp;#039;/&amp;#039;).&amp;#039;.*?)}}/iS&amp;#039;, $text))&lt;br /&gt;
        return true;&lt;br /&gt;
    if (preg_match(&amp;#039;/\{\{(bots\|allow=.*?)}}/iS&amp;#039;, $text))&lt;br /&gt;
        return false;&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Perl====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub allow_bots {&lt;br /&gt;
    my($text, $user, $opt) = @_;&lt;br /&gt;
    return 0 if $text =~ /{{[nN]obots}}/;&lt;br /&gt;
    return 1 if $text =~ /{{[bB]ots}}/;&lt;br /&gt;
    if($text =~ /\{\{[bB]ots\s*\|\s*allow\s*=\s*(.*?)\s*}}/s){&lt;br /&gt;
        return 1 if $1 eq &amp;#039;all&amp;#039;;&lt;br /&gt;
        return 0 if $1 eq &amp;#039;none&amp;#039;;&lt;br /&gt;
        my @bots = split(/\s*,\s*/, $1);&lt;br /&gt;
        return (grep $_ eq $user, @bots) ? 1 : 0;&lt;br /&gt;
    }&lt;br /&gt;
    if($text =~ /\{\{[bB]ots\s*\|\s*deny\s*=\s*(.*?)\s*}}/s){&lt;br /&gt;
        return 0 if $1 eq &amp;#039;all&amp;#039;;&lt;br /&gt;
        return 1 if $1 eq &amp;#039;none&amp;#039;;&lt;br /&gt;
        my @bots = split(/\s*,\s*/, $1);&lt;br /&gt;
        return (grep $_ eq $user, @bots) ? 0 : 1;&lt;br /&gt;
    }&lt;br /&gt;
    if(defined($opt) &amp;amp;&amp;amp; $text =~ /\{\{[bB]ots\s*\|\s*optout\s*=\s*(.*?)\s*}}/s){&lt;br /&gt;
        return 0 if $1 eq &amp;#039;all&amp;#039;;&lt;br /&gt;
        my @opt = split(/\s*,\s*/, $1);&lt;br /&gt;
        return (grep $_ eq $opt, @opt) ? 0 : 1;&lt;br /&gt;
    }&lt;br /&gt;
    return 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====VB.NET====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vbnet&amp;quot;&amp;gt;&lt;br /&gt;
Public Shared Function AllowBots(ByVal text As String, ByVal user As String) As Boolean&lt;br /&gt;
    Return Not Regex.IsMatch(text, &amp;quot;\{\{(nobots|bots\|(allow=none|deny=(?!none).*(&amp;quot; &amp;amp; user.Normalize() &amp;amp; &amp;quot;|all)|optout=all))\}\}&amp;quot;, RegexOptions.IgnoreCase)&lt;br /&gt;
End Function&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====C#====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public static bool AllowBots(string text, string user)&lt;br /&gt;
{&lt;br /&gt;
    return !Regex.IsMatch(text, @&amp;quot;\{\{(nobots|bots\|(allow=none|deny=(?!none).*(&amp;quot; + user.Normalize() + @&amp;quot;.*|all)|optout=all))\}\}&amp;quot;, RegexOptions.IgnoreCase);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Java====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public static boolean allowBots(String text, String user)&lt;br /&gt;
{&lt;br /&gt;
      return !text.matches(&amp;quot;(?si).*\\{\\{(nobots|bots\\|(allow=none|deny=([^\\}]*?&amp;quot; + user + &amp;quot;[^\\}]*?|all)|optout=all))\\}\\}.*&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====JavaScript====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function allowBots(text, user){&lt;br /&gt;
  if (!new RegExp(&amp;quot;\\{\\{\\s*(nobots|bots[^}]*)\\s*\\}\\}&amp;quot;, &amp;quot;i&amp;quot;).test(text)) return true;&lt;br /&gt;
  return (new RegExp(&amp;quot;\\{\\{\\s*bots\\s*\\|\\s*deny\\s*=\\s*([^}]*,\\s*)*&amp;quot; + user.replace(/([\(\)\*\+\?\.\-\:\!\=\/\^\$])/g, &amp;quot;\\$1&amp;quot;) + &amp;quot;\\s*(?=[,\\}])[^}]*\\s*\\}\\}&amp;quot;, &amp;quot;i&amp;quot;).test(text)) ? false : new RegExp(&amp;quot;\\{\\{\\s*((?!nobots)|bots(\\s*\\|\\s*allow\\s*=\\s*((?!none)|([^}]*,\\s*)*&amp;quot; + user.replace(/([\(\)\*\+\?\.\-\:\!\=\/\^\$])/g, &amp;quot;\\$1&amp;quot;) + &amp;quot;\\s*(?=[,\\}])[^}]*|all))?|bots\\s*\\|\\s*deny\\s*=\\s*(?!all)[^}]*|bots\\s*\\|\\s*optout=(?!all)[^}]*)\\s*\\}\\}&amp;quot;, &amp;quot;i&amp;quot;).test(text);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Python====&lt;br /&gt;
This code assumes that the [http://pypi.python.org/pypi/mwparserfromhell/ mwparserfromhell] library was installed and imported in the current script.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def allow_bots(text, user):&lt;br /&gt;
	user = user.lower().strip()&lt;br /&gt;
	text = mwparserfromhell.parse(text)&lt;br /&gt;
	for tl in text.filter_templates():&lt;br /&gt;
		if tl.name.matches([&amp;#039;bots&amp;#039;, &amp;#039;nobots&amp;#039;]):&lt;br /&gt;
			break&lt;br /&gt;
	else:&lt;br /&gt;
		return True&lt;br /&gt;
	for param in tl.params:&lt;br /&gt;
		bots = [x.lower().strip() for x in param.value.split(&amp;quot;,&amp;quot;)]&lt;br /&gt;
		if param.name == &amp;#039;allow&amp;#039;:&lt;br /&gt;
			if &amp;#039;&amp;#039;.join(bots) == &amp;#039;none&amp;#039;: return False&lt;br /&gt;
			for bot in bots:&lt;br /&gt;
				if bot in (user, &amp;#039;all&amp;#039;):&lt;br /&gt;
					return True&lt;br /&gt;
		elif param.name == &amp;#039;deny&amp;#039;:&lt;br /&gt;
			if &amp;#039;&amp;#039;.join(bots) == &amp;#039;none&amp;#039;: return True&lt;br /&gt;
			for bot in bots:&lt;br /&gt;
				if bot in (user, &amp;#039;all&amp;#039;):&lt;br /&gt;
					return False&lt;br /&gt;
	if (tl.name.matches(&amp;#039;nobots&amp;#039;) and len(tl.params) == 0):&lt;br /&gt;
		return False&lt;br /&gt;
	return True&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mattk4355</name></author>
	</entry>
</feed>