@@ -18,7 +18,6 @@
18from lxml import html
18from lxml import html
19from json import loads
19from json import loads
21−from searx.engines.bing import _fetch_supported_languages, supported_languages_url
22from searx.url_utils import urlencode
21from searx.url_utils import urlencode
24# engine dependent config
23# engine dependent config
@@ -26,6 +25,8 @@ categories = ['images']
26paging = True
25paging = True
27safesearch = True
26safesearch = True
28time_range_support = True
27time_range_support = True
28+language_support = True
29+supported_languages_url = 'https://www.bing.com/account/general'
30# search-url
31# search-url
31base_url = 'https://www.bing.com/'
32base_url = 'https://www.bing.com/'
@@ -45,23 +46,41 @@ safesearch_types = {2: 'STRICT',
45_quote_keys_regex = re.compile('({|,)([a-z][a-z0-9]*):(")', re.I | re.U)
46_quote_keys_regex = re.compile('({|,)([a-z][a-z0-9]*):(")', re.I | re.U)
49+# get supported region code
50+def get_region_code(lang, lang_list=None):
52+ if lang in (lang_list or supported_languages):
54+ elif lang.startswith('no'):
57+ # try to get a supported country code with language
58+ lang = lang.split('-')[0]
59+ for lc in (lang_list or supported_languages):
60+ if lang == lc.split('-')[0]:
64+ return region.lower()
48# do search-request
69# do search-request
49def request(query, params):
70def request(query, params):
50 offset = (params['pageno'] - 1) * 10 + 1
71 offset = (params['pageno'] - 1) * 10 + 1
52− # required for cookie
53− if params['language'] == 'all':
56− language = params['language']
58 search_path = search_string.format(
73 search_path = search_string.format(
59 query=urlencode({'q': query}),
74 query=urlencode({'q': query}),
60 offset=offset)
75 offset=offset)
77+ language = get_region_code(params['language'])
62 params['cookies']['SRCHHPGUSR'] = \
79 params['cookies']['SRCHHPGUSR'] = \
63− 'NEWWND=0&NRSLT=-1&SRCHLANG=' + language.split('-')[0] +\
64− '&ADLT=' + safesearch_types.get(params['safesearch'], 'DEMOTE')
80+ 'ADLT=' + safesearch_types.get(params['safesearch'], 'DEMOTE')
82+ params['cookies']['_EDGE_S'] = 'mkt=' + language +\
83+ '&ui=' + language + '&F=1'
66 params['url'] = base_url + search_path
85 params['url'] = base_url + search_path
67 if params['time_range'] in time_range_dict:
86 if params['time_range'] in time_range_dict:
@@ -106,3 +125,22 @@ def response(resp):
107 # return results
126 # return results
108 return results
127 return results
130+# get supported languages from their site
131+def _fetch_supported_languages(resp):
132+ supported_languages = []
133+ dom = html.fromstring(resp.text)
135+ regions_xpath = '//div[@id="region-section-content"]' \
136+ + '//ul[@class="b_vList"]/li/a/@href'
138+ regions = dom.xpath(regions_xpath)
139+ for region in regions:
140+ code = re.search('setmkt=[^\&]+', region).group()[7:]
144+ supported_languages.append(code)
146+ return supported_languages