Policy:User-Agent policy/zh

From Wikimedia Foundation Governance Wiki
Revision as of 00:20, 6 March 2022 by Stang (talk | contribs)

自2010年2月15日起,維基媒體網站要求所有請求必須包含用户代理HTTP头字段。此決定由技術人員作出,并且在技術郵件組中發佈并討論了這個決定[1][2]。對此的解釋是,沒有在請求中包含User-Agent字符串的客戶端基本都是運行有錯誤的代碼,它们給服務器造成了巨大的負擔,且对維基項目毫无貢獻。以不具有描述性的默认值开头的用户代理字段,例如python-requests/x也可能被维基媒体网站(或网站的一部分,如api.php页面)屏蔽。

没有包含描述性用户代理字段的请求(如来自浏览器或脚本的请求)可能遇到以下的错误信息:

脚本應該使用可提供信息的User-Agent字符串,並在其中包括聯絡訊息,否則這些脚本所在IP可能在無通知的情況被封禁。

提供被拉黑的User-Agent(例如任何以“lwp”開頭的User-Agent字符串)的客戶代理可能會遇到如下不太有用的錯誤訊息:

我們的伺服器目前遇到了技術問題。請幾分鐘后再試。

這項改動最可能影響通過api.php或其他方式自動訪問Wikimedia的脚本(機械人)和命令行程式。[3]如果你執行一個機械人,請在請求頭中包含能夠標識此機械人的User-Agent,并且不與很多其他機械人衝突。并且在其中包含你的聯絡方式(例如本地維基上的用戶頁,使用跨維基鏈接語法的相關維基項目的用戶頁,一個相關外部站點的URI,或是電郵地址),舉例如下:

User-Agent: CoolTool/0.0 (https://example.org/cool-tool/; cool-tool@example.org) generic-library/0.0

The generic format is <client name>/<version> (<contact information>) <library/framework name>/<version> [<library name>/<version> ...]. Parts that are not applicable can be omitted.

如果你執行一個自動代理,請考慮按照互聯網慣例在User-Agent中包括“bot”(不限大小寫)。這會被Wikimedia的系統識別,被用於將流量分類,并且提供更精確的統計數據。

不要拷貝瀏覽器上的的客戶代理字符串,行爲像機械人但是具有瀏覽器的客戶代理的行爲將被視爲有害。[4]亦不要使用通用代理,例如“curl”、“lwp”和“Python-urllib”等等。像pywikibot這樣的大型框架有很多用戶在用,僅僅使用“pywikibot”很可能比較模糊。在其中包含具體任務、脚本等細節通常是個好主意,即使這些信息對操作者外的其他人是模糊的。[5]

網路瀏覽器一般會自動包括User-Agent字符串,如果你遭遇上述錯誤,請參閲所使用瀏覽器的用戶手冊修改User-Agent字符串。請注意某些插件或隱私保護代理可能消除這個頭部。建議使用一個一般的User-Agent字符串,而不是消除之或留空。請注意其他特性更有可能被網站用於確定你的身份:如閣下對保護隱私感興趣,請瀏覽Panopticlick project

以Flash或JavaScript編寫的基於瀏覽器的應用通常是强制與宿主瀏覽器的User-Agent頭部相同,這不被視爲違規,然而這些程序應該包含Api-User-Agent頭部來實現合適的用戶代理信息。

自2015年始,维基媒体站点不屏蔽未设置用户代理头的页面访问和API请求。因此这些要求没有被自动强制执行,但是如有需要,在某些特定情況下可能被强制执行。[6]

Code examples

On Wikimedia wikis, if you don't supply a User-Agent header, or you supply an empty or generic one, your request will fail with an HTTP 403 error. Other MediaWiki installations may have similar policies.

If you are calling the API from browser-based JavaScript, you won't be able to influence the User-Agent header: the browser will use its own. To work around this, use the Api-User-Agent header:

// Using XMLHttpRequest
xhr.setRequestHeader( 'Api-User-Agent', 'Example/1.0' );

// Using jQuery
$.ajax( {
    url: remoteUrlWithOrigin,
    data: queryData,
    dataType: 'json',
    type: 'POST',
    headers: { 'Api-User-Agent': 'Example/1.0' },
    success: function(data) {
       // do something with data
    }
} );

// Using mw.Api, specify it when creating the mw.Api object
var api = new mw.Api( {
    ajax: {
        headers: { 'Api-User-Agent': 'Example/1.0' }
    }
} );
api.get( {...} ).done(function(data) {
    // do something with data
});

// Using fetch
fetch( remoteUrlWithOrigin, {
    method: 'POST',
    headers: new Headers( {
        'Api-User-Agent': 'Example/1.0'
    } )
    // Other init settings such as 'credentials'
} ).then( function ( response ) {
    if ( response.ok ) {
        return response.json();
    }
    throw new Error( 'Network response was not ok: ' + response.statusText );
} ).then( function ( data ) {
    // do something with data
});

In PHP, you can identify your user-agent with code such as this:

ini_set('user_agent', 'MyCoolTool/1.1 (https://example.org/MyCoolTool/; MyCoolTool@example.org) BasedOnSuperLib/1.4');

Or if you use cURL:

curl_setopt($curl, CURLOPT_USERAGENT, 'MyCoolTool/1.1 (https://example.org/MyCoolTool/; MyCoolTool@example.org) BasedOnSuperLib/1.4');

備註

  1. The Wikitech-l February 2010 Archive by subject
  2. User-Agent: | Wikipedia | Wikitech
  3. API:FAQ - MediaWiki
  4. [Wikitech-l] User-Agent:
  5. Anomie (31 July 2014). "Clarification on what is needed for "identifying the bot" in bot user-agent?". Mediawiki-api. 
  6. gmane.science.linguistics.wikipedia.technical/83870 (deadlink)

參見