Jump to content

政策:维基媒体基金会用户代理政策

From Wikimedia Foundation Governance Wiki
This page is a translated version of the page Policy:Wikimedia Foundation User-Agent Policy and the translation is 100% complete.

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

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

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

来自被禁止的用户代理的请求可能会遇到如下不太有用的錯誤訊息:

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

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

User-Agent: CoolBot/0.0 (https://example.org/coolbot/; coolbot@example.org) generic-library/0.0

通常的格式是<client name>/<version> (<contact information>) <library/framework name>/<version> [<library name>/<version> ...],可省略其中不适用的部分。

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

不要拷貝瀏覽器上的的客戶代理字符串,行爲像機械人但是具有瀏覽器的客戶代理的行爲將被視爲有害。[4] 不要使用通用的用户代理,例如“curl”、“lwp”或“Python-urllib”之类。对于大型框架,例如pywikibot,会有许多用户使用,因此只使用“pywikibot”作为用户代理也较为模糊。较好的做法是在用户代理中包含具体任务、脚本的细节,即使细节对于操作者以外的人仍然不透明。[5]

网页浏览器通常会自动发送用户代理,如果遇到了上文提及的错误,请参考浏览器的说明,查看如何设置用户代理字符串。需要留意的是,有些用于改善隐私的插件或代理可能会覆盖修改请求头里的用户代理。如果是为了维持上网的隐私性,推荐使用一个通用的用户代理字符串,而不是覆盖它或发送空字符串。而且相比用户代理,其他功能更有可能让网站能够识别您。如果有兴趣保护个人隐私,请见 Cover Your Tracks project

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

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

代码示例

在维基媒体站点上,如果您不提供User-Agent头字段,或提供了一个空的、通用的字段,您的请求会返回HTTP 403错误。其他的MediaWiki站点可能会有类似的策略。

JavaScript

如果您以基于浏览器的JavaScript脚本调用API,您将无法改变User-Agent头字段:它由浏览器设定。请使用Api-User-Agent头字段解决这一问题。

// Using XMLHttpRequest
xhr.setRequestHeader( 'Api-User-Agent', 'Example/1.0' );
// Using jQuery
$.ajax( {
    url: 'https://example/...',
    data: ...,
    dataType: 'json',
    type: 'GET',
    headers: { 'Api-User-Agent': 'Example/1.0' },
} ).then( function ( data )  {
    // ..
} );
// Using mw.Api
var api = new mw.Api( {
    userAgent: 'Example/1.0'
} );
api.get( ... ).then( function ( data ) {
    // ...
});
// Using Fetch
fetch( 'https://example/...', {
    method: 'GET',
    headers: new Headers( {
        'Api-User-Agent': 'Example/1.0'
    } )
} ).then( function ( response ) {
    return response.json();
} ).then( function ( data ) {
    // ...
});


PHP

在PHP语言中,您可以使用如下的代码标识您的用户代理:

ini_set( 'user_agent', 'CoolBot/0.0 (https://example.org/coolbot/; coolbot@example.org)' );

cURL

如果您使用cURL

curl_setopt( $curl, CURLOPT_USERAGENT, 'CoolBot/0.0 (https://example.org/coolbot/; coolbot@example.org)' );

Python

在Python中,可以使用Requests,设置请求头的方式如下:

import requests

url = 'https://example/...'
headers = {'User-Agent': 'CoolBot/0.0 (https://example.org/coolbot/; coolbot@example.org)'}

response = requests.get(url, headers=headers)

或者,如果你想使用SPARQLWrapper (如 https://people.wikimedia.org/~bearloga/notes/wdqs-python.html ):

from SPARQLWrapper import SPARQLWrapper, JSON

url = 'https://example/...'
user_agent = 'CoolBot/0.0 (https://example.org/coolbot/; coolbot@example.org)'

sparql = SPARQLWrapper(url, agent = user_agent )
results = sparql.query()

备注

  1. 2010年2月Wikitech-l存档
  2. User-Agent: - Wikitech-l - lists.wikimedia.org
  3. API:常见问题 - MediaWiki
  4. [Wikitech-l] User-Agent:
  5. 澄清机器人的用户代理中,何为“识别机器人”所需的内容?
  6. gmane.science.linguistics.wikipedia.technical/83870 (失效链接)

另见