跳至內容

模板:Bots/doc

維基百科,自由的百科全書

此頁面是為用戶解釋有關於如何允許或排除機械人對頁面的瀏覽訪問並留下訊息,相關的指令非常容易理解,因下有範例在此不贅述。這類模板適用於用戶頁或其討論頁當中(即以「User:」或「User_talk:」這2個命名空間開首的頁面),在用戶空間之外請小心使用,以避免阻止有用的機械人編輯。對於機械人管理者,建議閣下遵從頁面中{{bots}}及{{nobots}}的指示。

用戶須意識到透過選擇排除來自機械人的通知,根據他們所選擇的標籤,機械人將不會被通知有關他們已編輯或上傳資料的訊息(如版權問題、條目DYK等訊息)。

對於百科條目空間,尤其注意:

  • 小心模板作用範圍過大,帶來副作用;
  • 應用於處置機械人持有者或機械人社群的根本問題;
  • 一旦相關問題解決,請移除模板標籤。

機械人語法

[編輯]
  • {{nobots}} 封鎖所有的機械人帳戶訪問
  • {{bots}} 允許所有機械人帳戶訪問
  • {{bots|allow=<botlist>}} 封鎖所有列表指定之外的機械人帳戶
  • {{bots|deny=<botlist>}} 封鎖列表指定之所有機械人帳戶

以下指令使用於過濾指定用戶名的機械人帳戶(以半形逗號作間隔),另關鍵字「AWB」可以過濾所有使用維基自動瀏覽器的機械人:

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

<botlist> 可以透過 "none" or "all" 選項允許/封鎖機械人訪問,如下:

  • {{bots|allow=all}} 允許所有機械人帳戶訪問
  • {{bots|allow=none}} 封鎖所有的機械人帳戶訪問
  • {{bots|deny=all}} 封鎖所有的機械人帳戶訪問
  • {{bots|deny=none}} 允許所有機械人帳戶訪問

但須注意的是,由於機械人在它們創建時不是為了不通知用戶,因此並非所有機械人會遵守以上標籤,這取決於機械人程序的相關設定。

排除所有機械人通知

[編輯]

另外一種排除通知法是按通知種類而過濾,當用戶套用至個人用戶頁面時,相關類型的停滯將會被過濾,當用戶套用以下模板就代表其同意本模板使用原則。但如果用在非其個人用戶頁面放置以下模板將會被視為破壞

使用這種選擇性排除的方法,用戶將不會受到來自機械人的負面通知,但透過人工編輯的負面通知/警告將在排除範圍之外。


以上選項可透過逗號間隔相加使用,例如:

  • {{bots|optout=nosource,nolicense}} 過濾所有機械人所發出有關上傳資料缺乏來源以及缺乏授權的通知
  • {{bots|optout=orfud,norationale,replaceable}} 過濾所有機械人所發出有關上傳資料合理使用的通知

限制

[編輯]

有些通知不能以此模板排除,此類通知包括但不限於:

  1. 違反版權的通知
  2. 破壞(及類似行為)的通知
  3. 任何不含上方標籤的通知(有任何被遺忘的通知標籤?請於討論頁告訴我們。;])

置入使用

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

範例

[編輯]

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

參見

[編輯]