@@ -1,7 +1,7 @@
11"""
22 Wikipedia (Web)
33
4− @website https://{language}.wikipedia.org
4+ @website https://en.wikipedia.org/api/rest_v1/
55 @provide-api yes
66
77 @using-api yes
@@ -12,21 +12,11 @@
1212
1313from json import loads
1414from lxml.html import fromstring
15−from searx.url_utils import quote, urlencode
16−from searx.utils import match_language
15+from searx.url_utils import quote
16+from searx.utils import match_language, searx_useragent
1717
1818# search-url
19−base_url = u'https://{language}.wikipedia.org/'
20−search_url = base_url + u'w/api.php?'\
21− 'action=query'\
22− '&format=json'\
23− '&{query}'\
24− '&prop=extracts|pageimages|pageprops'\
25− '&ppprop=disambiguation'\
26− '&exintro'\
27− '&explaintext'\
28− '&pithumbsize=300'\
29− '&redirects'
19+search_url = u'https://{language}.wikipedia.org/api/rest_v1/page/summary/{title}'
3020supported_languages_url = 'https://meta.wikimedia.org/wiki/List_of_Wikipedias'
3121
3222
@@ -41,51 +31,37 @@ def url_lang(lang):
4131# do search-request
4232def request(query, params):
4333 if query.islower():
44− query = u'{0}|{1}'.format(query.decode('utf-8'), query.decode('utf-8').title()).encode('utf-8')
34+ query = query.title()
4535
46− params['url'] = search_url.format(query=urlencode({'titles': query}),
36+ params['url'] = search_url.format(title=quote(query),
4737 language=url_lang(params['language']))
4838
39+ params['headers']['User-Agent'] = searx_useragent()
40+
4941 return params
5042
5143
5244# get response from search-request
5345def response(resp):
54− results = []
55−
56− search_result = loads(resp.text)
57−
58− # wikipedia article's unique id
59− # first valid id is assumed to be the requested article
60− if 'pages' not in search_result['query']:
61− return results
62−
63− for article_id in search_result['query']['pages']:
64− page = search_result['query']['pages'][article_id]
65− if int(article_id) > 0:
66− break
67−
68− if int(article_id) < 0 or 'disambiguation' in page.get('pageprops', {}):
46+ if not resp.ok:
6947 return []
7048
71− title = page.get('title')
72−
73− image = page.get('thumbnail')
74− if image:
75− image = image.get('source')
49+ results = []
50+ api_result = loads(resp.text)
7651
77− summary = page.get('extract', '').split('\n')[0].replace('()', '')
52+ # skip disambiguation pages
53+ if api_result['type'] != 'standard':
54+ return []
7855
79− # link to wikipedia article
80− wikipedia_link = base_url.format(language=url_lang(resp.search_params['language'])) \
81− + 'wiki/' + quote(title.replace(' ', '_').encode('utf8'))
56+ title = api_result['title']
57+ wikipedia_link = api_result['content_urls']['desktop']['page']
8258
8359 results.append({'url': wikipedia_link, 'title': title})
8460
8561 results.append({'infobox': title,
8662 'id': wikipedia_link,
87− 'content': summary,
88− 'img_src': image,
63+ 'content': api_result.get('extract', ''),
64+ 'img_src': api_result.get('thumbnail', {}).get('source'),
8965 'urls': [{'title': 'Wikipedia', 'url': wikipedia_link}]})
9066
9167 return results