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

From Wikimedia Foundation Governance Wiki
Content deleted Content added
Stang (talk | contribs)
Created page with "通常的格式是$fmt,可省略其中不适用的部分。"
FuzzyBot (talk | contribs)
Updating to match new version of source page
 
(37 intermediate revisions by 7 users not shown)
Line 1: Line 1:
<languages />
<languages />{{DISPLAYTITLE:用戶代理方針}}
{{notice|本頁面僅提供反映了當前狀態的信息,如需討論此主題請移步wikitech-l[[Special:MyLanguage/Mailing lists|郵件組]]。}}
{{notice|1=本頁面僅提供反映了當前狀態的信息,如需討論此主題請移步wikitech-l[[:m:Special:MyLanguage/Mailing lists|郵件組]]。}}
{{policy-staff}}


自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日起,維基媒體網站要求所有請求必須包含'''[[{{lwp|User-Agent}}|用户代理]]HTTP-{zh-hans:头字段;zh-hant:頭欄位;}-'''。做出本决定的技術人員在技术邮件列表内讨论并发布<ref>[[mailarchive:wikitech-l/2010-February/thread.html#46764|The Wikitech-l February 2010 Archive by subject]]</ref><ref>[[listarchive:list/wikitech-l@lists.wikimedia.org/thread/R4RU7XTBM5J3BTS6GGQW77NYS2E4WGLI/|User-Agent: - Wikitech-l - lists.wikimedia.org]]</ref>。對此的解釋是,沒有在請求中包含User-Agent字符串的客戶端基本都是運行有錯誤的代碼,它们給服務器造成了巨大的負擔,且对維基項目毫无貢獻。以不具有描述性的默认值开头的用户代理字段,例如<code>python-requests/x</code>也可能被维基媒体网站(或网站的一部分,如<code>api.php</code>页面)屏蔽。


没有包含描述性用户代理字段的请求(如来自浏览器或脚本的请求)可能遇到以下的错误信息:
没有包含描述性用户代理字段的请求(如来自浏览器或脚本的请求)可能遇到以下的错误信息:
Line 12: Line 13:
:''我們的伺服器目前遇到了技術問題。請幾分鐘后再試。''
:''我們的伺服器目前遇到了技術問題。請幾分鐘后再試。''


這項改動最可能影響通過api.php或其他方式自動訪問Wikimedia的脚本(機械人)和命令行程式。<ref>[//www.mediawiki.org/w/index.php?title=API:FAQ#do_I_get_HTTP_403_errors.3F API:FAQ - MediaWiki]</ref>如果你執行一個機械人,請在請求頭中包含能夠標識此機械人的User-Agent,并且不與很多其他機械人衝突。并且在其中包含你的聯絡方式(例如本地維基上的用戶頁,使用跨維基鏈接語法的相關維基項目的用戶頁,一個相關外部站點的URI,或是電郵地址),舉例如下:
這項改動最可能影響通過api.php或其他方式自動訪問Wikimedia的脚本(機械人)和命令行程式。<ref>[[:mw:Special:MyLanguage/API:FAQ|API:FAQ - MediaWiki]]</ref>如果你執行一個機械人,請在請求頭中包含能夠標識此機械人的User-Agent,并且不與很多其他機械人衝突。并且在其中包含你的聯絡方式(例如本地維基上的用戶頁,使用跨維基鏈接語法的相關維基項目的用戶頁,一個相關外部站點的URI,或是電郵地址),舉例如下:
<pre>
<pre>
User-Agent: CoolTool/0.0 (https://example.org/cool-tool/; cool-tool@example.org) generic-library/0.0
User-Agent: CoolBot/0.0 (https://example.org/coolbot/; coolbot@example.org) generic-library/0.0
</pre>
</pre>


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


不要拷貝瀏覽器上的的客戶代理字符串,行爲像機械人但是具有瀏覽器的客戶代理的行爲將被視爲有害。<ref>[//lists.wikimedia.org/pipermail/wikitech-l/2010-February/046783.html [Wikitech-l&#93; User-Agent:]</ref>亦不要使用通用代理,例如“curl”、“lwp”和“Python-urllib”等等。像pywikibot這樣的大型框架有很多用戶在用,僅僅使用“pywikibot”很可能比較模糊。在其中包含具體任務、脚本等細節通常是個好主意,即使這些信息對操作者外的其他人是模糊的。<ref>{{cite web|url=http://lists.wikimedia.org/pipermail/mediawiki-api/2014-July/003308.html|title=Clarification on what is needed for "identifying the bot" in bot user-agent?|publisher=Mediawiki-api|author=Anomie|date=31 July 2014}}</ref>
不要拷貝瀏覽器上的的客戶代理字符串,行爲像機械人但是具有瀏覽器的客戶代理的行爲將被視爲有害。<ref>[[mailarchive:wikitech-l/2010-February/046783.html|[Wikitech-l] User-Agent:]]</ref>亦不要使用通用代理,例如“curl”、“lwp”和“Python-urllib”等等。像pywikibot這樣的大型框架有很多用戶在用,僅僅使用“pywikibot”很可能比較模糊。在其中包含具體任務、脚本等細節通常是個好主意,即使這些信息對操作者外的其他人是模糊的。<ref>[[mailarchive:mediawiki-api/2014-July/003308.html|Clarification on what is needed for "identifying the bot" in bot user-agent?]]</ref>


<div lang="en" dir="ltr" class="mw-content-ltr">
網路瀏覽器一般會自動包括User-Agent字符串,如果你遭遇上述錯誤,請參閲所使用瀏覽器的用戶手冊修改User-Agent字符串。請注意某些插件或隱私保護代理可能消除這個頭部。建議使用一個一般的User-Agent字符串,而不是消除之或留空。請注意其他特性更有可能被網站用於確定你的身份:如閣下對保護隱私感興趣,請瀏覽[https://panopticlick.eff.org/ Panopticlick project]。
Web browsers generally send a User-Agent string automatically; if you encounter the above error, please refer to your browser's manual to find out how to set the User-Agent string. Note that some plugins or proxies for privacy enhancement may suppress this header. However, for anonymous surfing, it is recommended to send a generic User-Agent string, instead of suppressing it or sending an empty string. Note that other features are much more likely to identify you to a website — if you are interested in protecting your privacy, visit the [//coveryourtracks.eff.org/ Cover Your Tracks project].
</div>


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


自2015年始,维基媒体站点不屏蔽未设置用户代理头的页面访问和API请求。因此这些要求没有被自动强制执行,但是如有需要,在某些特定情況下可能被强制执行。<ref>gmane.science.linguistics.wikipedia.technical/83870 ([http://thread.gmane.org/gmane.science.linguistics.wikipedia.technical/83870/ deadlink])</ref>
自2015年始,维基媒体站点不屏蔽未设置用户代理头的页面访问和API请求。因此这些要求没有被自动强制执行,但是如有需要,在某些特定情況下可能被强制执行。<ref>gmane.science.linguistics.wikipedia.technical/83870 ([//thread.gmane.org/gmane.science.linguistics.wikipedia.technical/83870/ deadlink])</ref>
<span id="Code_examples"></span>
== 代码示例 ==
== 代码示例 ==


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

<div lang="en" dir="ltr" class="mw-content-ltr">
=== JavaScript ===
</div>


如果您以基于浏览器的JavaScript脚本调用API,您将无法改变<code>User-Agent</code>头字段:它由浏览器设定。请使用<code>Api-User-Agent</code>头字段解决这一问题。
如果您以基于浏览器的JavaScript脚本调用API,您将无法改变<code>User-Agent</code>头字段:它由浏览器设定。请使用<code>Api-User-Agent</code>头字段解决这一问题。
Line 37: Line 45:
// Using XMLHttpRequest
// Using XMLHttpRequest
xhr.setRequestHeader( 'Api-User-Agent', 'Example/1.0' );
xhr.setRequestHeader( 'Api-User-Agent', 'Example/1.0' );
</syntaxhighlight>

<syntaxhighlight lang="javascript">
// Using jQuery
// Using jQuery
$.ajax( {
$.ajax( {
url: remoteUrlWithOrigin,
url: 'https://example/...',
data: queryData,
data: ...,
dataType: 'json',
dataType: 'json',
type: 'POST',
type: 'GET',
headers: { 'Api-User-Agent': 'Example/1.0' },
headers: { 'Api-User-Agent': 'Example/1.0' },
success: function(data) {
} ).then( function ( data ) {
// do something with data
// ..
}
} );
} );
</syntaxhighlight>

<syntaxhighlight lang="javascript">
// Using mw.Api, specify it when creating the mw.Api object
// Using mw.Api
var api = new mw.Api( {
var api = new mw.Api( {
ajax: {
ajax: {
Line 56: Line 65:
}
}
} );
} );
api.get( {...} ).done(function(data) {
api.get( ... ).then( function ( data ) {
// do something with data
// ...
});
});
</syntaxhighlight>

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

<div lang="en" dir="ltr" class="mw-content-ltr">
=== PHP ===
</div>


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


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
ini_set('user_agent', 'MyCoolTool/1.1 (https://example.org/MyCoolTool/; MyCoolTool@example.org) BasedOnSuperLib/1.4');
ini_set( 'user_agent', 'CoolBot/0.0 (https://example.org/coolbot/; coolbot@example.org)' );
</syntaxhighlight>
</syntaxhighlight>


<div lang="en" dir="ltr" class="mw-content-ltr">
或如果您使用[[w:zh:cURL|cURL]]:
=== cURL ===
</div>

或如果您使用[[{{lwp|cURL}}|cURL]]:


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
curl_setopt($curl, CURLOPT_USERAGENT, 'MyCoolTool/1.1 (https://example.org/MyCoolTool/; MyCoolTool@example.org) BasedOnSuperLib/1.4');
curl_setopt( $curl, CURLOPT_USERAGENT, 'CoolBot/0.0 (https://example.org/coolbot/; coolbot@example.org)' );
</syntaxhighlight>
</syntaxhighlight>


<div lang="en" dir="ltr" class="mw-content-ltr">
== 備註 ==
=== Python ===
</div>

<div lang="en" dir="ltr" class="mw-content-ltr">
In Python, you can use the [[{{lwp|Requests (software)}}|Requests]] library to set a header:
</div>

<syntaxhighlight lang="python">
import requests

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

response = requests.get(url, headers=headers)
</syntaxhighlight>

<div lang="en" dir="ltr" class="mw-content-ltr">
Or, if you want to use [//sparqlwrapper.readthedocs.io SPARQLWrapper] like in https://people.wikimedia.org/~bearloga/notes/wdqs-python.html:
</div>

<syntaxhighlight lang="python">
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()
</syntaxhighlight>

== {{int string|Notes}} ==
<references />
<references />


== 參見 ==
== {{int string|See also}} ==

* 在维基媒体下属网站上[[wikitech:Robot policy|有关网络爬虫和机器人的方针]]
* 在维基媒体下属网站上[[wikitech:Robot policy|有关网络爬虫和机器人的方针]]


[[Category:Global policies{{#translation:}}]]
[[Category:Bots{{#translation:}}]]
[[Category:Bots{{#translation:}}]]
[[Category:Policies maintained by the Wikimedia Foundation{{#translation:}}]]

Latest revision as of 01:04, 29 March 2024

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

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

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

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

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

這項改動最可能影響通過api.php或其他方式自動訪問Wikimedia的脚本(機械人)和命令行程式。[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]

Web browsers generally send a User-Agent string automatically; if you encounter the above error, please refer to your browser's manual to find out how to set the User-Agent string. Note that some plugins or proxies for privacy enhancement may suppress this header. However, for anonymous surfing, it is recommended to send a generic User-Agent string, instead of suppressing it or sending an empty string. Note that other features are much more likely to identify you to a website — if you are interested in protecting your privacy, visit the 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( {
    ajax: {
        headers: { 'Api-User-Agent': '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

In Python, you can use the Requests library to set a header:

import requests

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

response = requests.get(url, headers=headers)
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. The Wikitech-l February 2010 Archive by subject
  2. User-Agent: - Wikitech-l - lists.wikimedia.org
  3. API:FAQ - MediaWiki
  4. [Wikitech-l] User-Agent:
  5. Clarification on what is needed for "identifying the bot" in bot user-agent?
  6. gmane.science.linguistics.wikipedia.technical/83870 (deadlink)

参见