[fix] bing-images engine: language support, safesearch and time range

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
This commit is contained in:
Markus Heiser 2022-04-11 09:04:16 +02:00
parent 864f9ded44
commit 81ffabee4f

View file

@ -6,11 +6,9 @@
from json import loads from json import loads
from urllib.parse import urlencode from urllib.parse import urlencode
from lxml import html from lxml import html
import babel
from searx.utils import match_language
from searx.engines.bing import language_aliases
from searx.engines.bing import ( # pylint: disable=unused-import from searx.engines.bing import ( # pylint: disable=unused-import
_fetch_supported_languages, _fetch_supported_languages,
supported_languages_url, supported_languages_url,
@ -29,44 +27,103 @@ about = {
# engine dependent config # engine dependent config
categories = ['images', 'web'] categories = ['images', 'web']
paging = True paging = True
safesearch = True
time_range_support = True
supported_languages_url = 'https://www.bing.com/account/general' supported_languages_url = 'https://www.bing.com/account/general'
number_of_results = 28 number_of_results = 28
time_range_support = True
time_range_string = '&qft=+filterui:age-lt{interval}'
time_range_dict = {'day': '1440', 'week': '10080', 'month': '43200', 'year': '525600'}
safesearch = True
safesearch_types = {2: 'STRICT', 1: 'DEMOTE', 0: 'OFF'}
# search-url # search-url
base_url = 'https://www.bing.com/' base_url = 'https://www.bing.com/'
search_string = (
# https://www.bing.com/images/search?q=london&FORM=HDRSC2
inital_query = (
# fmt: off # fmt: off
'images/search' 'images/search'
'?{query}' '?{query}'
'&count={count}' '&count={count}'
'&tsc=ImageHoverTitle'
# fmt: on
)
page_query = (
# fmt: off
'images/async'
'?{query}'
'&count={count}'
'&first={first}' '&first={first}'
'&tsc=ImageHoverTitle' '&tsc=ImageHoverTitle'
# fmt: on # fmt: on
) )
time_range_string = '&qft=+filterui:age-lt{interval}'
time_range_dict = {'day': '1440', 'week': '10080', 'month': '43200', 'year': '525600'}
# safesearch definitions
safesearch_types = {2: 'STRICT', 1: 'DEMOTE', 0: 'OFF'}
# do search-request # do search-request
def request(query, params): def request(query, params):
offset = ((params['pageno'] - 1) * number_of_results) + 1
search_path = search_string.format(query=urlencode({'q': query}), count=number_of_results, first=offset) language = params['language']
if language == 'all':
language = 'en-US'
locale = babel.Locale.parse(language, sep='-')
language = match_language(params['language'], supported_languages, language_aliases).lower() # query and paging
params['cookies']['SRCHHPGUSR'] = 'ADLT=' + safesearch_types.get(params['safesearch'], 'DEMOTE') bing_language = ''
if locale.language in supported_languages:
bing_language = 'language:%s ' % locale.language
query_str = urlencode({'q': bing_language + query})
params['cookies']['_EDGE_S'] = 'mkt=' + language + '&ui=' + language + '&F=1' if params['pageno'] == 1:
search_path = inital_query.format(
query=query_str, count=number_of_results
)
else:
offset = ((params['pageno'] - 1) * number_of_results)
search_path = page_query.format(
query=query_str, count=number_of_results, first=offset
)
params['url'] = base_url + search_path params['url'] = base_url + search_path
if params['time_range'] in time_range_dict:
params['url'] += time_range_string.format(interval=time_range_dict[params['time_range']]) # safesearch
# bing-imgae results are SafeSearch by defautl, setting the '&adlt_set='
# parameter seems not enogh to change the default. I assume there is some
# age verification by a cookie and/or session ID is needed to disable the
# SafeSearch
params['url'] += '&adlt_set=%s' % safesearch_types.get(params['safesearch'], 'off').lower()
# cookies
# On bing-video users can select a SafeSearch level what is saved in a
# cookies, trying to set this coockie here seems not to work, may be the
# cookie needs more values (e.g. a session ID or something like this where a
# age validation is noted)
# SRCHHPGUSR = [
# 'SRCHLANG=%s' % locale.language,
# 'ADLT=%s' % safesearch_types.get(params['safesearch'], 'OFF')
# ]
# params['cookies']['SRCHHPGUSR'] = '&'.join(SRCHHPGUSR) + ';'
# logger.debug("cookies SRCHHPGUSR=%s", params['cookies']['SRCHHPGUSR'])
# time range
time_range = time_range_dict.get(params['time_range'])
if time_range:
params['url'] += time_range_string.format(interval=time_range)
# language & locale
ac_lang = locale.language
if locale.territory:
ac_lang = "%s-%s,%s;q=0.5" % (locale.language, locale.territory, locale.language)
logger.debug("headers.Accept-Language --> %s", ac_lang)
params['headers']['Accept-Language'] = ac_lang
params['headers']['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
return params return params