Jump to content

Policy:Wikimedia Foundation User-Agent Policy/ja

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

2010年2月15日より、すべてのリクエストに対してHTTP User-Agent ヘッダーが必須となりました。これは技術スタッフによる運用上の決定であり、技術系メーリングリストにて告知および議論が行われました。[1][2] その理由は、User-Agent文字列を送信しないクライアントの多くは、プロジェクトに何の利益ももたらさないにもかかわらずサーバーに多大な負荷をかける、挙動の悪いスクリプトであるためです。また、意味をなさないデフォルト値(例: python-requests/x)で始まるUser-Agent文字列も、ウィキメディアのサイト(またはサイトの一部、例: api.php)からブロックされる場合があります。

(例えばブラウザもしくはスクリプトからの)説明的なユーザーエージェントヘッダを送信しないリクエストは現在、次のようなエラーメッセージに出くわす場合があります。

スクリプトは連絡先情報を含む情報を提供するユーザーエージェント文字列を使用するべきであり、さもなくば予告なくブロックの対象となる場合があります。

許可されていない User-Agent からのリクエストは、代わりに以下のようなあまり役に立たないエラー メッセージに遭遇する場合があります:

現在、このサーバーには技術的な問題が発生しています。数分後に再度お試しください。

この変更は、WikipediaなどのWikimediaのウェブサイトに(api.php経由か否かを問わず)自動的にアクセスするスクリプト(Bot)や、コマンドラインプログラムに最も影響を及ぼす可能性が高いものです。[3] ボットを運用する場合は、API利用ガイドラインに従い、他の多数のボットと混同されないような識別情報を含むUser-Agentヘッダーを送信し、運用者であるあなたへの連絡手段を提示してください。連絡先情報は、メールアドレス、ウェブサイト、または (<project>; User:<name>) の形式(例: (wikipedia:de; User:DuesenBot))を用いたWikiユーザー名のいずれかで指定する必要があります。例:

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」という文字列(大文字・小文字の組み合わせは不問)を含めるという、インターネット全体で広く採用されている慣行に従うことをご検討ください。この文字列はウィキメディアのシステムによって認識され、トラフィックの分類や、より正確な統計の作成に利用されます。

BotにブラウザのUserAgentをコピーして使用しないでください。ブラウザのUserAgentを使用しながらBotのような挙動を示すと、悪意あるものとみなされるためです。[4] 「curl」、「lwp」、「Python-urllib」といった一般的な名称は使用しないでください。pywikibotのような大規模なフレームワークの場合、ユーザー数が非常に多いため、単に「pywikibot」とするだけでは、何を示しているのか曖昧になりがちです。たとえ担当者以外には内容が判別できないものであっても、具体的なタスクやスクリプトなどに関する詳細を含めることをお勧めします。[5]

通常、Webブラウザは自動的にUser-Agent文字列を送信しますが、上記のエラーが発生した場合は、ブラウザのマニュアルを参照してUser-Agent文字列の設定方法を確認してください。なお、プライバシー保護を目的とした一部のプラグインやプロキシは、このヘッダーの送信を抑制する場合があります。しかし、匿名でWebを閲覧する場合でも、ヘッダーを抑制したり空の文字列を送信したりするのではなく、一般的なUser-Agent文字列を送信することが推奨されます。ただし、Webサイト側があなたを特定する要因としては、他にも多くの要素が関与している可能性が高い点にご注意ください。プライバシー保護に関心をお持ちの方は、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では、このコードでUserAgentを識別できます。

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)

あるいは、https://people.wikimedia.org/~bearloga/notes/wdqs-python.htmlのようにSPARQLWrapperを使用したい場合は:

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 (リンク切れ)

参照