模板:Bots
此模板用於允許或排除機械人對頁面的瀏覽訪問並留下消息。該模板適用於用戶名字空間及所有討論名字空間中,不推薦在其他名字空間使用。對於機械人賬號所有者,建議閣下遵從頁面中{{bots}}及{{nobots}}的指示。
用戶須意識到透過選擇排除來自機械人的通知,根據他們所選擇的標籤,機械人將不會被通知有關他們的消息。
(i)注意 僅限維護人員在非用戶或用戶討論名字空間使用該模板。在不允許的名字空間放置該模板將被視為破壞。
使用方式
{{nobots}} 拒绝所有机器人账号访问 {{bots}} 允许所有机器人账号访问
{{bots|allow=<botlist>}} 拒绝指定列表外的机器人账号 {{bots|deny=<botlist>}} 拒绝指定列表中的机器人账号
以下指令使用於過濾指定用戶名的機械人帳號(以半形逗號作間隔),另關鍵字「AWB」可以過濾所有使用維基自動瀏覽器的機械人:
{{bots|allow=AWB,AnnAngela-abot}} {{bots|deny=Cewbot}}
<botlist> 可以透過 "none" or "all" 選項允許/禁止機械人訪問,如下:
{{bots|allow=all}} 允许所有机器人账号访问 {{bots|allow=none}} 禁止所有机器人账号访问
{{bots|deny=all}} 禁止所有机器人账号访问 {{bots|deny=none}} 允许所有机器人账号访问
(i)注意 由於機械人在它們創建時不是為了不通知用戶,因此並非所有機械人會遵守以上標籤,這取決於機械人程序的相關設定。
註:deny為最高優先級,其次是optout,再次是allow,最次是(什麼都不填)。
過濾指定的通知
另外一種排除通知法是按通知種類而過濾。在對應頁面使用時,則相關類型的通知會被過濾。
使用這種選擇性排除的方法,用戶將不會收到來自指定機械人的指定通知(請注意大小寫)。
{{bots|optout=all}} 过滤所有机器人发出的所有通知 {{bots|optout=voteEnd}} 过滤U:AnnAngela-abot有关投票结束后至发起人用户讨论页的留言提醒 {{bots|optout=proposalAboutToExpire}} 过滤U:AnnAngela-abot对提案即将超时的通知 {{bots|optout=SIGN}} 过滤U:星海-adminbot有关签名等问题的提醒 {{bots|optout=anchor-fixing}} 阻止U:星海-adminbot对此页面错误锚点的修复 {{bots|optout=fileInfo}} 过滤U:机娘星海酱对错误填写文件上传信息的提醒
以上選項可通過半角逗號間隔相加使用,例如:
{{bots|optout=voteEnd,SIGN}}
限制
有些機械人操作不能以此模板排除,此類操作包括但不限於:
- 機械人未支持該模板
- 任何不含上方所述標籤的通知(若有被遺忘的標籤,請於萌娘百科_talk:討論版告訴我們。)
機械人識別方法
- Pywikipediabot於r4096後支持{{bots}}及{{nobots}},然而可用參數將其忽略。
- 自動維基瀏覽器由3.2.0.0起完全支持{{bots}}及{{nobots}}。另外,將用戶名設置為awb可以拒絕所有自動維基瀏覽器機械人。自動維基瀏覽器亦有選項可忽略這些模板。
處理編譯後html代碼的範例
本段描述的是處理編譯後html代碼(從index.php?action=render
等入口獲取)的範例,內容僅供參考,請在使用前自行驗證。
- 生成的html代碼
本模板會將三個參數填入id為botsMessageConfig
的元素的data-
屬性中,效果如下:
<span id="botsMessageConfig" data-allow="{{{allow|}}}" data-deny="{{{deny|}}}" data-optout="{{{optout|}}}"></span>
因此你可以通過查詢相關屬性來判斷是否匹配。
- JavaScript
Nodejs可以通過 cheerio
模塊來解析html代碼,請自行適配。
"use strict"; /** * @param {string | undefined} str * @returns */ const splitCommaString = (str) => `${str || ""}`.split(",").map((a) => a.trim()).filter((a) => a.length > 0); /** * 检测是否允许 * @param {HTMLElement} rootNode 被检测页面的根元素 * @param {string} user 机器人用户名 * @param {string} type 机器人通知类型 * @returns {boolean} */ function allowBots(rootNode, user, type) { const { dataset: { allow, deny, optout, }, } = rootNode.querySelector("#botsMessageConfig") || { dataset: {} }; if (deny === "all" || optout === "none" || allow === "none") { return false; } if (deny !== "none" && splitCommaString(deny).includes(user)) { return false; } if (optout !== "all" && splitCommaString(optout).includes(type)) { return false; } return true; }
處理原始碼的範例
本段描述的是直接處理原始碼(即頁面的wikitext,從index.php?action=raw
等入口獲取)的範例,內容僅供參考,請在使用前自行驗證。
- PHP
function allowBots( $text ) { global $user; if (preg_match('/\{\{(nobots|bots\|allow=none|bots\|deny=all|bots\|optout=all|bots\|deny=.*?'.preg_quote($user,'/').'.*?)\}\}/iS',$text)) { return false; } return true; }
- Perl
sub allowBots { my($text, $user, $opt) = @_; return 0 if $text =~ /{{nob[o]ts}}/; return 1 if $text =~ /{{b[o]ts}}/; if($text =~ /{{bots\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 =~ /{{bots\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 =~ /{{bots\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; }
- 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 !Regex.Match(text, "\\{\\{(nobots|bots\\|(allow=none|deny=(.*?" + user.Normalize() + ".*?|all)|optout=all))\\}\\}", RegexOptions.IgnoreCase).Success; }
- 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+"\\s*(?=[,\\}])[^}]*\\s*\\}\\}", "i").test(text)) ? false : new RegExp("\\{\\{\\s*((?!nobots)|bots(\\s*\\|\\s*allow\\s*=\\s*((?!none)|([^}]*,\\s*)*"+user+"\\s*(?=[,\\}])[^}]*|all))?|bots\\s*\\|\\s*deny\\s*=\\s*(?!all)[^}]*|bots\\s*\\|\\s*optout=(?!all)[^}]*)\\s*\\}\\}", "i").test(text); }
- Python
def Allowbots(text, user): if (re.search(r'\{\{(nobots|bots\|(allow=none|deny=.*?' + user + r'.*?|optout=all|deny=all))\}\}', text)): return False return True
參見
- 元維基(Meta) — Template:Bots