on master help sign in
Merge pull request #220 from pointhi/safesearch
67df3c5Adam Tauber
searx/engines/bing_images.py+8−1
@@ -21,12 +21,18 @@ import re
21# engine dependent config
21# engine dependent config
22categories = ['images']
22categories = ['images']
23paging = True
23paging = True
24+safesearch = True
24
25
25# search-url
26# search-url
26base_url = 'https://www.bing.com/'
27base_url = 'https://www.bing.com/'
27search_string = 'images/search?{query}&count=10&first={offset}'
28search_string = 'images/search?{query}&count=10&first={offset}'
28thumb_url = "http://ts1.mm.bing.net/th?id={ihk}"
29thumb_url = "http://ts1.mm.bing.net/th?id={ihk}"
29
30
31+# safesearch definitions
32+safesearch_types = {2: 'STRICT',
33+ 1: 'DEMOTE',
34+ 0: 'OFF'}
35+
30
36
31# do search-request
37# do search-request
32def request(query, params):
38def request(query, params):
@@ -43,7 +49,8 @@ def request(query, params):
43 offset=offset)
49 offset=offset)
44
50
45 params['cookies']['SRCHHPGUSR'] = \
51 params['cookies']['SRCHHPGUSR'] = \
46− 'NEWWND=0&NRSLT=-1&SRCHLANG=' + language.split('-')[0]
52+ 'NEWWND=0&NRSLT=-1&SRCHLANG=' + language.split('-')[0] +\
53+ '&ADLT=' + safesearch_types.get(params['safesearch'], 'DEMOTE')
47
54
48 params['url'] = base_url + search_path
55 params['url'] = base_url + search_path
49
56
searx/engines/blekko_images.py+12
@@ -14,11 +14,17 @@ from urllib import urlencode
14# engine dependent config
14# engine dependent config
15categories = ['images']
15categories = ['images']
16paging = True
16paging = True
17+safesearch = True
17
18
18# search-url
19# search-url
19base_url = 'https://blekko.com'
20base_url = 'https://blekko.com'
20search_url = '/api/images?{query}&c={c}'
21search_url = '/api/images?{query}&c={c}'
21
22
23+# safesearch definitions
24+safesearch_types = {2: '1',
25+ 1: '',
26+ 0: '0'}
27+
22
28
23# do search-request
29# do search-request
24def request(query, params):
30def request(query, params):
@@ -31,6 +37,12 @@ def request(query, params):
31 if params['pageno'] != 1:
37 if params['pageno'] != 1:
32 params['url'] += '&page={pageno}'.format(pageno=(params['pageno']-1))
38 params['url'] += '&page={pageno}'.format(pageno=(params['pageno']-1))
33
39
40+ # let Blekko know we wan't have profiling
41+ params['cookies']['tag_lesslogging'] = '1'
42+
43+ # parse safesearch argument
44+ params['cookies']['safesearch'] = safesearch_types.get(params['safesearch'], '')
45+
34 return params
46 return params
35
47
36
48
searx/engines/google_images.py+9−2
@@ -15,18 +15,25 @@ from json import loads
15# engine dependent config
15# engine dependent config
16categories = ['images']
16categories = ['images']
17paging = True
17paging = True
18+safesearch = True
18
19
19# search-url
20# search-url
20url = 'https://ajax.googleapis.com/'
21url = 'https://ajax.googleapis.com/'
21−search_url = url + 'ajax/services/search/images?v=1.0&start={offset}&rsz=large&safe=off&filter=off&{query}'
22+search_url = url + 'ajax/services/search/images?v=1.0&start={offset}&rsz=large&safe={safesearch}&filter=off&{query}'
22
23
23
24
24# do search-request
25# do search-request
25def request(query, params):
26def request(query, params):
26 offset = (params['pageno'] - 1) * 8
27 offset = (params['pageno'] - 1) * 8
27
28
29+ if params['safesearch'] == 0:
30+ safesearch = 'off'
31+ else:
32+ safesearch = 'on'
33+
28 params['url'] = search_url.format(query=urlencode({'q': query}),
34 params['url'] = search_url.format(query=urlencode({'q': query}),
29− offset=offset)
35+ offset=offset,
36+ safesearch=safesearch)
30
37
31 return params
38 return params
32
39
searx/search.py+5
@@ -457,6 +457,11 @@ class Search(object):
457 request_params['started'] = time()
457 request_params['started'] = time()
458 request_params['pageno'] = self.pageno
458 request_params['pageno'] = self.pageno
459 request_params['language'] = self.lang
459 request_params['language'] = self.lang
460+ try:
461+ # 0 = None, 1 = Moderate, 2 = Strict
462+ request_params['safesearch'] = int(request.cookies.get('safesearch', 1))
463+ except ValueError:
464+ request_params['safesearch'] = 1
460
465
461 # update request parameters dependent on
466 # update request parameters dependent on
462 # search-engine (contained in engines folder)
467 # search-engine (contained in engines folder)
searx/templates/courgette/preferences.html+10
@@ -59,6 +59,16 @@
59 </select>
59 </select>
60 </p>
60 </p>
61 </fieldset>
61 </fieldset>
62+ <fieldset>
63+ <legend>{{ _('SafeSearch') }}</legend>
64+ <p>
65+ <select name='safesearch'>
66+ <option value="2" {% if safesearch == '2' %}selected="selected"{% endif %}>{{ _('Strict') }}</option>
67+ <option value="1" {% if safesearch == '1' %}selected="selected"{% endif %}>{{ _('Moderate') }}</option>
68+ <option value="0" {% if safesearch == '0' %}selected="selected"{% endif %}>{{ _('None') }}</option>
69+ </select>
70+ </p>
71+ </fieldset>
62 <fieldset>
72 <fieldset>
63 <legend>{{ _('Themes') }}</legend>
73 <legend>{{ _('Themes') }}</legend>
64 <p>
74 <p>
searx/templates/default/preferences.html+10
@@ -60,6 +60,16 @@
60 </select>
60 </select>
61 </p>
61 </p>
62 </fieldset>
62 </fieldset>
63+ <fieldset>
64+ <legend>{{ _('SafeSearch') }}</legend>
65+ <p>
66+ <select name='safesearch'>
67+ <option value="2" {% if safesearch == '2' %}selected="selected"{% endif %}>{{ _('Strict') }}</option>
68+ <option value="1" {% if safesearch == '1' %}selected="selected"{% endif %}>{{ _('Moderate') }}</option>
69+ <option value="0" {% if safesearch == '0' %}selected="selected"{% endif %}>{{ _('None') }}</option>
70+ </select>
71+ </p>
72+ </fieldset>
63 <fieldset>
73 <fieldset>
64 <legend>{{ _('Themes') }}</legend>
74 <legend>{{ _('Themes') }}</legend>
65 <p>
75 <p>
searx/templates/oscar/preferences.html+11
@@ -87,6 +87,17 @@
87 </div>
87 </div>
88 <span class="col-sm-5 col-md-6 help-block">{{ _('Change how forms are submited, <a href="http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods" rel="external">learn more about request methods</a>') }}</span>
88 <span class="col-sm-5 col-md-6 help-block">{{ _('Change how forms are submited, <a href="http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods" rel="external">learn more about request methods</a>') }}</span>
89 </div>
89 </div>
90+ <div class="row form-group">
91+ <label class="col-sm-3 col-md-2">{{ _('SafeSearch') }}</label>
92+ <div class="col-sm-4 col-md-4">
93+ <select class="form-control" name='safesearch'>
94+ <option value="2" {% if safesearch == '2' %}selected="selected"{% endif %}>{{ _('Strict') }}</option>
95+ <option value="1" {% if safesearch == '1' %}selected="selected"{% endif %}>{{ _('Moderate') }}</option>
96+ <option value="0" {% if safesearch == '0' %}selected="selected"{% endif %}>{{ _('None') }}</option>
97+ </select>
98+ </div>
99+ <span class="col-sm-5 col-md-6 help-block">{{ _('Filter explicite content') }}</span>
100+ </div>
90 <div class="row form-group">
101 <div class="row form-group">
91 <label class="col-sm-3 col-md-2">{{ _('Themes') }}</label>
102 <label class="col-sm-3 col-md-2">{{ _('Themes') }}</label>
92 <div class="col-sm-4 col-md-4">
103 <div class="col-sm-4 col-md-4">
searx/tests/engines/test_bing_images.py+1
@@ -12,6 +12,7 @@ class TestBingImagesEngine(SearxTestCase):
12 dicto = defaultdict(dict)
12 dicto = defaultdict(dict)
13 dicto['pageno'] = 1
13 dicto['pageno'] = 1
14 dicto['language'] = 'fr_FR'
14 dicto['language'] = 'fr_FR'
15+ dicto['safesearch'] = 1
15 params = bing_images.request(query, dicto)
16 params = bing_images.request(query, dicto)
16 self.assertTrue('url' in params)
17 self.assertTrue('url' in params)
17 self.assertTrue(query in params['url'])
18 self.assertTrue(query in params['url'])
searx/tests/engines/test_blekko_images.py+1
@@ -10,6 +10,7 @@ class TestBlekkoImagesEngine(SearxTestCase):
10 query = 'test_query'
10 query = 'test_query'
11 dicto = defaultdict(dict)
11 dicto = defaultdict(dict)
12 dicto['pageno'] = 0
12 dicto['pageno'] = 0
13+ dicto['safesearch'] = 1
13 params = blekko_images.request(query, dicto)
14 params = blekko_images.request(query, dicto)
14 self.assertTrue('url' in params)
15 self.assertTrue('url' in params)
15 self.assertTrue(query in params['url'])
16 self.assertTrue(query in params['url'])
searx/webapp.py+8
@@ -267,6 +267,8 @@ def render(template_name, override_theme=None, **kwargs):
267
267
268 kwargs['method'] = request.cookies.get('method', 'POST')
268 kwargs['method'] = request.cookies.get('method', 'POST')
269
269
270+ kwargs['safesearch'] = request.cookies.get('safesearch', '1')
271+
270 # override url_for function in templates
272 # override url_for function in templates
271 kwargs['url_for'] = url_for_theme
273 kwargs['url_for'] = url_for_theme
272
274
@@ -471,6 +473,8 @@ def preferences():
471 locale = None
473 locale = None
472 autocomplete = ''
474 autocomplete = ''
473 method = 'POST'
475 method = 'POST'
476+ safesearch = '1'
477+
474 for pd_name, pd in request.form.items():
478 for pd_name, pd in request.form.items():
475 if pd_name.startswith('category_'):
479 if pd_name.startswith('category_'):
476 category = pd_name[9:]
480 category = pd_name[9:]
@@ -489,6 +493,8 @@ def preferences():
489 lang = pd
493 lang = pd
490 elif pd_name == 'method':
494 elif pd_name == 'method':
491 method = pd
495 method = pd
496+ elif pd_name == 'safesearch':
497+ safesearch = pd
492 elif pd_name.startswith('engine_'):
498 elif pd_name.startswith('engine_'):
493 if pd_name.find('__') > -1:
499 if pd_name.find('__') > -1:
494 engine_name, category = pd_name.replace('engine_', '', 1).split('__', 1)
500 engine_name, category = pd_name.replace('engine_', '', 1).split('__', 1)
@@ -530,6 +536,8 @@ def preferences():
530
536
531 resp.set_cookie('method', method, max_age=cookie_max_age)
537 resp.set_cookie('method', method, max_age=cookie_max_age)
532
538
539+ resp.set_cookie('safesearch', safesearch, max_age=cookie_max_age)
540+
533 resp.set_cookie('image_proxy', image_proxy, max_age=cookie_max_age)
541 resp.set_cookie('image_proxy', image_proxy, max_age=cookie_max_age)
534
542
535 resp.set_cookie('theme', theme, max_age=cookie_max_age)
543 resp.set_cookie('theme', theme, max_age=cookie_max_age)