@@ -0,0 +1,64 @@
1+# SPDX-License-Identifier: AGPL-3.0-or-later
2+# lint: pylint
3+"""Stack Exchange API v2.3
4+
5+* https://api.stackexchange.com/
6+
7+"""
8+
9+from json import loads
10+from urllib.parse import urlencode
11+
12+about = {
13+ "website": 'https://stackexchange.com',
14+ "wikidata_id": 'Q3495447',
15+ "official_api_documentation": 'https://api.stackexchange.com/docs',
16+ "use_official_api": True,
17+ "require_api_key": False,
18+ "results": 'JSON',
19+}
20+
21+paging = True
22+pagesize = 10
23+
24+api_site = 'stackoverflow'
25+api_sort= 'activity'
26+api_order = 'desc'
27+
28+# https://api.stackexchange.com/docs/advanced-search
29+search_api = 'https://api.stackexchange.com/2.3/search/advanced?'
30+
31+def request(query, params):
32+
33+ args = urlencode({
34+ 'q' : query,
35+ 'page' : params['pageno'],
36+ 'pagesize' : pagesize,
37+ 'site' : api_site,
38+ 'sort' : api_sort,
39+ 'order': 'desc',
40+ })
41+ params['url'] = search_api + args
42+
43+ return params
44+
45+def response(resp):
46+
47+ results = []
48+ json_data = loads(resp.text)
49+
50+ for result in json_data['items']:
51+
52+ content = "[%s]" % ", ".join(result['tags'])
53+ content += " %s" % result['owner']['display_name']
54+ if result['is_answered']:
55+ content += ' // is answered'
56+ content += " // score: %s" % result['score']
57+
58+ results.append({
59+ 'url': "https://%s.com/q/%s" % (api_site, result['question_id']),
60+ 'title': result['title'],
61+ 'content': content,
62+ })
63+
64+ return results