| 
									
										
										
										
											2021-01-13 11:31:25 +01:00
										 |  |  | # SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							| 
									
										
										
										
											2017-05-21 05:33:08 +02:00
										 |  |  | """
 | 
					
						
							| 
									
										
										
										
											2022-11-05 15:10:52 +01:00
										 |  |  | DuckDuckGo Images | 
					
						
							|  |  |  | ~~~~~~~~~~~~~~~~~ | 
					
						
							| 
									
										
										
										
											2017-05-21 05:33:08 +02:00
										 |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-05 15:10:52 +01:00
										 |  |  | from typing import TYPE_CHECKING | 
					
						
							| 
									
										
										
										
											2020-08-06 17:42:46 +02:00
										 |  |  | from urllib.parse import urlencode | 
					
						
							| 
									
										
										
										
											2022-11-05 15:10:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | from searx.engines.duckduckgo import fetch_traits  # pylint: disable=unused-import | 
					
						
							|  |  |  | from searx.engines.duckduckgo import ( | 
					
						
							|  |  |  |     get_ddg_lang, | 
					
						
							|  |  |  |     get_vqd, | 
					
						
							| 
									
										
										
										
											2021-12-27 10:16:20 +01:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2022-11-05 15:10:52 +01:00
										 |  |  | from searx.enginelib.traits import EngineTraits | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if TYPE_CHECKING: | 
					
						
							|  |  |  |     import logging | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     logger: logging.Logger | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | traits: EngineTraits | 
					
						
							| 
									
										
										
										
											2017-05-21 05:33:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-13 11:31:25 +01:00
										 |  |  | # about | 
					
						
							|  |  |  | about = { | 
					
						
							|  |  |  |     "website": 'https://duckduckgo.com/', | 
					
						
							|  |  |  |     "wikidata_id": 'Q12805', | 
					
						
							|  |  |  |     "use_official_api": False, | 
					
						
							|  |  |  |     "require_api_key": False, | 
					
						
							|  |  |  |     "results": 'JSON (site requires js to get images)', | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-21 05:33:08 +02:00
										 |  |  | # engine dependent config | 
					
						
							| 
									
										
										
										
											2021-12-22 16:58:52 +01:00
										 |  |  | categories = ['images', 'web'] | 
					
						
							| 
									
										
										
										
											2017-05-21 05:33:08 +02:00
										 |  |  | paging = True | 
					
						
							|  |  |  | safesearch = True | 
					
						
							| 
									
										
										
										
											2022-08-01 17:01:59 +02:00
										 |  |  | send_accept_language_header = True | 
					
						
							| 
									
										
										
										
											2017-05-21 05:33:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-05 15:10:52 +01:00
										 |  |  | safesearch_cookies = {0: '-2', 1: None, 2: '1'} | 
					
						
							|  |  |  | safesearch_args = {0: '1', 1: None, 2: '1'} | 
					
						
							| 
									
										
										
										
											2017-05-21 05:33:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-05 15:10:52 +01:00
										 |  |  | def request(query, params): | 
					
						
							| 
									
										
										
										
											2017-05-21 05:33:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-05 15:10:52 +01:00
										 |  |  |     eng_region = traits.get_region(params['searxng_locale'], traits.all_locale) | 
					
						
							|  |  |  |     eng_lang = get_ddg_lang(traits, params['searxng_locale']) | 
					
						
							| 
									
										
										
										
											2017-05-21 05:33:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-05 15:10:52 +01:00
										 |  |  |     args = { | 
					
						
							|  |  |  |         'q': query, | 
					
						
							|  |  |  |         'o': 'json', | 
					
						
							|  |  |  |         # 'u': 'bing', | 
					
						
							|  |  |  |         'l': eng_region, | 
					
						
							| 
									
										
										
										
											2023-09-05 20:25:13 +02:00
										 |  |  |         'f': ',,,,,', | 
					
						
							|  |  |  |         'vqd': get_vqd(query), | 
					
						
							| 
									
										
										
										
											2022-11-05 15:10:52 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-05-21 05:33:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-05 15:10:52 +01:00
										 |  |  |     if params['pageno'] > 1: | 
					
						
							|  |  |  |         args['s'] = (params['pageno'] - 1) * 100 | 
					
						
							| 
									
										
										
										
											2017-05-21 05:33:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-05 15:10:52 +01:00
										 |  |  |     params['cookies']['ad'] = eng_lang  # zh_CN | 
					
						
							|  |  |  |     params['cookies']['ah'] = eng_region  # "us-en,de-de" | 
					
						
							|  |  |  |     params['cookies']['l'] = eng_region  # "hk-tzh" | 
					
						
							| 
									
										
										
										
											2017-05-21 05:33:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-05 15:10:52 +01:00
										 |  |  |     safe_search = safesearch_cookies.get(params['safesearch']) | 
					
						
							|  |  |  |     if safe_search is not None: | 
					
						
							|  |  |  |         params['cookies']['p'] = safe_search  # "-2", "1" | 
					
						
							|  |  |  |     safe_search = safesearch_args.get(params['safesearch']) | 
					
						
							|  |  |  |     if safe_search is not None: | 
					
						
							|  |  |  |         args['p'] = safe_search  # "-1", "1" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-05 20:25:13 +02:00
										 |  |  |     logger.debug("cookies: %s", params['cookies']) | 
					
						
							| 
									
										
										
										
											2022-11-05 15:10:52 +01:00
										 |  |  |     args = urlencode(args) | 
					
						
							| 
									
										
										
										
											2023-09-05 20:25:13 +02:00
										 |  |  |     params['url'] = 'https://duckduckgo.com/i.js?{args}'.format(args=args) | 
					
						
							| 
									
										
										
										
											2017-05-21 05:33:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return params | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def response(resp): | 
					
						
							|  |  |  |     results = [] | 
					
						
							| 
									
										
										
										
											2022-11-05 15:10:52 +01:00
										 |  |  |     res_json = resp.json() | 
					
						
							| 
									
										
										
										
											2017-05-21 05:33:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     for result in res_json['results']: | 
					
						
							| 
									
										
										
										
											2021-12-27 09:26:22 +01:00
										 |  |  |         results.append( | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 'template': 'images.html', | 
					
						
							| 
									
										
										
										
											2022-11-05 15:10:52 +01:00
										 |  |  |                 'title': result['title'], | 
					
						
							| 
									
										
										
										
											2021-12-27 09:26:22 +01:00
										 |  |  |                 'content': '', | 
					
						
							| 
									
										
										
										
											2022-11-05 15:10:52 +01:00
										 |  |  |                 'thumbnail_src': result['thumbnail'], | 
					
						
							|  |  |  |                 'img_src': result['image'], | 
					
						
							|  |  |  |                 'url': result['url'], | 
					
						
							|  |  |  |                 'img_format': '%s x %s' % (result['width'], result['height']), | 
					
						
							|  |  |  |                 'source': result['source'], | 
					
						
							| 
									
										
										
										
											2021-12-27 09:26:22 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2017-05-21 05:33:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return results |