Skip to content

Commit 79dde4b

Browse files
committed
fix: add headers compliant with user-agent policy
Prior to this commit, when sending several requests in a row, some requests could fail with `429/Too many requests` as the client was not providing an `User-Agent` header compliant with Wikimedia's user-agent policy. See also: https://meta.wikimedia.org/wiki/User-Agent_policy
1 parent 66fd002 commit 79dde4b

File tree

1 file changed

+11
-1
lines changed

1 file changed

+11
-1
lines changed

wikidata/client.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io
66
import json
77
import logging
8+
import sys
89
from typing import (
910
TYPE_CHECKING,
1011
Callable,
@@ -21,6 +22,7 @@
2122
import urllib.request
2223
import weakref
2324

25+
from . import __version__
2426
from .cache import CacheKey, CachePolicy, NullCachePolicy
2527
from .entity import Entity, EntityId, EntityType
2628

@@ -104,7 +106,8 @@ def __init__(self,
104106
None] = None,
105107
entity_type_guess: bool = True,
106108
cache_policy: CachePolicy = NullCachePolicy(),
107-
repr_string: Optional[str] = None) -> None:
109+
repr_string: Optional[str] = None,
110+
user_agent: Optional[str] = None) -> None:
108111
self._using_default_opener = opener is None
109112
if self._using_default_opener:
110113
if urllib.request._opener is None: # type: ignore
@@ -114,6 +117,13 @@ def __init__(self,
114117
pass
115118
opener = urllib.request._opener # type: ignore
116119
assert isinstance(opener, urllib.request.OpenerDirector)
120+
if not user_agent:
121+
python_version = f'{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}'
122+
user_agent = f'wikidata-based-bot/{__version__} (https://github.com/dahlia/wikidata) python/{python_version}'
123+
# See also: https://meta.wikimedia.org/wiki/User-Agent_policy
124+
opener.addheaders = {
125+
'User-Agent': user_agent,
126+
}
117127
if datavalue_decoder is None:
118128
from .datavalue import Decoder # noqa: F811
119129
datavalue_decoder = Decoder()

0 commit comments

Comments
 (0)