|  | # SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						
						
						
							|  | """
 | 
						
						
						
							|  |  not Evil (Onions)
 | 
						
						
						
							|  | """
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  | from urllib.parse import urlencode
 | 
						
						
						
							|  | from lxml import html
 | 
						
						
						
							|  | from searx.engines.xpath import extract_text
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  | # about
 | 
						
						
						
							|  | about = {
 | 
						
						
						
							|  |     "website": 'http://hss3uro2hsxfogfq.onion',
 | 
						
						
						
							|  |     "wikidata_id": None,
 | 
						
						
						
							|  |     "official_api_documentation": 'http://hss3uro2hsxfogfq.onion/api.htm',
 | 
						
						
						
							|  |     "use_official_api": False,
 | 
						
						
						
							|  |     "require_api_key": False,
 | 
						
						
						
							|  |     "results": 'HTML',
 | 
						
						
						
							|  | }
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  | # engine dependent config
 | 
						
						
						
							|  | categories = ['onions']
 | 
						
						
						
							|  | paging = True
 | 
						
						
						
							|  | page_size = 20
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  | # search-url
 | 
						
						
						
							|  | base_url = 'http://hss3uro2hsxfogfq.onion/'
 | 
						
						
						
							|  | search_url = 'index.php?{query}&hostLimit=20&start={pageno}&numRows={page_size}'
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  | # specific xpath variables
 | 
						
						
						
							|  | results_xpath = '//*[@id="content"]/div/p'
 | 
						
						
						
							|  | url_xpath = './span[1]'
 | 
						
						
						
							|  | title_xpath = './a[1]'
 | 
						
						
						
							|  | content_xpath = './text()'
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  | # do search-request
 | 
						
						
						
							|  | def request(query, params):
 | 
						
						
						
							|  |     offset = (params['pageno'] - 1) * page_size
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  |     params['url'] = base_url + search_url.format(pageno=offset,
 | 
						
						
						
							|  |                                                  query=urlencode({'q': query}),
 | 
						
						
						
							|  |                                                  page_size=page_size)
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  |     return params
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  | # get response from search-request
 | 
						
						
						
							|  | def response(resp):
 | 
						
						
						
							|  |     results = []
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  |     # needed because otherwise requests guesses wrong encoding
 | 
						
						
						
							|  |     resp.encoding = 'utf8'
 | 
						
						
						
							|  |     dom = html.fromstring(resp.text)
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  |     # parse results
 | 
						
						
						
							|  |     for result in dom.xpath(results_xpath):
 | 
						
						
						
							|  |         url = extract_text(result.xpath(url_xpath)[0])
 | 
						
						
						
							|  |         title = extract_text(result.xpath(title_xpath)[0])
 | 
						
						
						
							|  |         content = extract_text(result.xpath(content_xpath))
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  |         # append result
 | 
						
						
						
							|  |         results.append({'url': url,
 | 
						
						
						
							|  |                         'title': title,
 | 
						
						
						
							|  |                         'content': content,
 | 
						
						
						
							|  |                         'is_onion': True})
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  |     return results
 |