Policy:User-Agent policy/zh: Difference between revisions

From Wikimedia Foundation Governance Wiki
Content deleted Content added
Stang (talk | contribs)
typo
Stang (talk | contribs)
No edit summary
Line 4: Line 4:
自2010年2月15日起,維基媒體網站要求所有請求必須包含'''[[w:zh:用户代理|用户代理]]HTTP-{zh-hans:头字段;zh-hant:頭欄位;}-'''。此決定由技術人員作出,并且在技術郵件組中發佈并討論了這個決定<ref>[https://lists.wikimedia.org/pipermail/wikitech-l/2010-February/thread.html#46764 The Wikitech-l February 2010 Archive by subject]</ref><ref>[http://www.gossamer-threads.com/lists/wiki/wikitech/189275 User-Agent: | Wikipedia | Wikitech]</ref>。對此的解釋是,沒有在請求中包含User-Agent字符串的客戶端基本都是運行有錯誤的代碼,它们給服務器造成了巨大的負擔,且对維基項目毫无貢獻。以不具有描述性的默认值开头的用户代理字段,例如<code>python-requests/x</code>也可能被维基媒体网站(或网站的一部分,如<code>api.php</code>页面)屏蔽。
自2010年2月15日起,維基媒體網站要求所有請求必須包含'''[[w:zh:用户代理|用户代理]]HTTP-{zh-hans:头字段;zh-hant:頭欄位;}-'''。此決定由技術人員作出,并且在技術郵件組中發佈并討論了這個決定<ref>[https://lists.wikimedia.org/pipermail/wikitech-l/2010-February/thread.html#46764 The Wikitech-l February 2010 Archive by subject]</ref><ref>[http://www.gossamer-threads.com/lists/wiki/wikitech/189275 User-Agent: | Wikipedia | Wikitech]</ref>。對此的解釋是,沒有在請求中包含User-Agent字符串的客戶端基本都是運行有錯誤的代碼,它们給服務器造成了巨大的負擔,且对維基項目毫无貢獻。以不具有描述性的默认值开头的用户代理字段,例如<code>python-requests/x</code>也可能被维基媒体网站(或网站的一部分,如<code>api.php</code>页面)屏蔽。


没有包含描述性用户代理字段的请求(如来自浏览器或脚本的请求)可能遇到以下的错误信息:
<div class="mw-translate-fuzzy">
不提供User-Agent請求頭的客戶代理(瀏覽器或脚本)現在可能會遇到如下所示之錯誤訊息:
</div>


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

Revision as of 00:20, 6 March 2022

自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)

参见