模板:Bots

萌娘百科,萬物皆可萌的百科全書!轉載請標註來源頁面的網頁連結,並聲明引自萌娘百科。內容不可商用。
貢獻者:
Template-info.svg 模板文檔  [查看] [] [歷史] [刷新]

此模板用於允許或排除機器人對頁面的瀏覽訪問並留下消息。該模板適用於用戶命名空間及所有討論命名空間中,不推薦在其他命名空間使用。對於機器人帳號所有者,建議閣下遵從頁面中{{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}} 

限制

有些機器人操作不能以此模板排除,此類操作包括但不限於:

  1. 機器人未支持該模板
  2. 任何不含上方所述標籤的通知(若有被遺忘的標籤,請於萌娘百科_talk:討論版告訴我們。)

機器人識別方法

  • Pywikipediabot於r4096後支持{{bots}}及{{nobots}},然而可用參數將其忽略。
  • 自動維基瀏覽器由3.2.0.0起完全支持{{bots}}及{{nobots}}。另外,將用戶名設置為awb可以拒絕所有自動維基瀏覽器機器人。自動維基瀏覽器亦有選項可忽略這些模板。

處理編譯後html代碼的範例

本段描述的是處理編譯後html代碼(從index.php?action=render等入口獲取)的範例,內容僅供參考,請在使用前自行驗證。

生成的html代碼

本模板會將三個參數填入id為botsMessageConfig的元素的data-屬性中,效果如下:

  1. <span id="botsMessageConfig" data-allow="{{{allow|}}}" data-deny="{{{deny|}}}" data-optout="{{{optout|}}}"></span>

因此你可以通過查詢相關屬性來判斷是否匹配。

JavaScript

Nodejs可以通過 cheerio 模塊來解析html代碼,請自行適配。

  1. "use strict";
  2. /**
  3. * @param {string | undefined} str
  4. * @returns
  5. */
  6. const splitCommaString = (str) => `${str || ""}`.split(",").map((a) => a.trim()).filter((a) => a.length > 0);
  7. /**
  8. * 檢測是否允許
  9. * @param {HTMLElement} rootNode 被檢測頁面的根元素
  10. * @param {string} user 機器人用戶名
  11. * @param {string} type 機器人通知類型
  12. * @returns {boolean}
  13. */
  14. function allowBots(rootNode, user, type) {
  15. const {
  16. dataset: {
  17. allow,
  18. deny,
  19. optout,
  20. },
  21. } = rootNode.querySelector("#botsMessageConfig") || { dataset: {} };
  22. if (deny === "all" || optout === "none" || allow === "none") {
  23. return false;
  24. }
  25. if (deny !== "none" && splitCommaString(deny).includes(user)) {
  26. return false;
  27. }
  28. if (optout !== "all" && splitCommaString(optout).includes(type)) {
  29. return false;
  30. }
  31. return true;
  32. }

處理原始碼的範例

本段描述的是直接處理原始碼(即頁面的wikitext,從index.php?action=raw等入口獲取)的範例,內容僅供參考,請在使用前自行驗證。

PHP
  1. function allowBots( $text ) {
  2. global $user;
  3. if (preg_match('/\{\{(nobots|bots\|allow=none|bots\|deny=all|bots\|optout=all|bots\|deny=.*?'.preg_quote($user,'/').'.*?)\}\}/iS',$text)) { return false; }
  4. return true;
  5. }
Perl
  1. sub allowBots {
  2. my($text, $user, $opt) = @_;
  3. return 0 if $text =~ /{{nob[o]ts}}/;
  4. return 1 if $text =~ /{{b[o]ts}}/;
  5. if($text =~ /{{bots\s*\|\s*allow\s*=\s*(.*?)\s*}}/s){
  6. return 1 if $1 eq 'all';
  7. return 0 if $1 eq 'none';
  8. my @bots = split(/\s*,\s*/, $1);
  9. return (grep $_ eq $user, @bots)?1:0;
  10. }
  11. if($text =~ /{{bots\s*\|\s*deny\s*=\s*(.*?)\s*}}/s){
  12. return 0 if $1 eq 'all';
  13. return 1 if $1 eq 'none';
  14. my @bots = split(/\s*,\s*/, $1);
  15. return (grep $_ eq $user, @bots)?0:1;
  16. }
  17. if(defined($opt) && $text =~ /{{bots\s*\|\s*optout\s*=\s*(.*?)\s*}}/s){
  18. return 0 if $1 eq 'all';
  19. my @opt = split(/\s*,\s*/, $1);
  20. return (grep $_ eq $opt, @opt)?0:1;
  21. }
  22. return 1;
  23. }
C#
  1. public static bool AllowBots(string text, string user)
  2. {
  3. return !Regex.IsMatch(text, @"\{\{(nobots|bots\|(allow=none|deny=(?!none).*(" + user.Normalize() + @"|all)|optout=all))\}\}", RegexOptions.IgnoreCase);
  4. }
Java
  1. public static boolean AllowBots(String text, String user)
  2. {
  3. return !Regex.Match(text, "\\{\\{(nobots|bots\\|(allow=none|deny=(.*?" + user.Normalize() + ".*?|all)|optout=all))\\}\\}", RegexOptions.IgnoreCase).Success;
  4. }
JavaScript
  1. function allowBots(text, user){
  2. if (!new RegExp("\\{\\{\\s*(nobots|bots[^}]*)\\s*\\}\\}", "i").test(text)) return true;
  3. 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);
  4. }
Python
  1. def Allowbots(text, user):
  2. if (re.search(r'\{\{(nobots|bots\|(allow=none|deny=.*?' + user + r'.*?|optout=all|deny=all))\}\}', text)):
  3. return False
  4. return True

參見

此頁面最後編輯於 2021年6月21日 (週一) 13:18。
搜尋萌娘百科 (按"/"快速搜尋)
有新的未讀公告

阅读更多:http://mzh.moegirl.tw/Template:Bots
本文引自萌娘百科(http://mzh.moegirl.tw ),文字内容默认使用《知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆》协议。