
    i-              	       T   U d Z ddlZddlZddlZddlZddlmZ ddlZ	ddl
Z	ddlmZ ddlmZ ddlmZmZ ddlmZmZ ddlmZ dd	lmZmZ ej8                  rdd
lmZ d7dZd8dZd8dZde de de!e    fdZ"de de de!e    fdZ#de de de!e    fdZ$de de de!e    fdZ%de de de!e    fdZ&de de de!e    fdZ'de de de!e    fdZ(de de de!e    fdZ)de de de!e    fdZ*de de de!e    fdZ+de de de!e    fdZ,de de de!e    fdZ-de de de!e    fdZ.de de de!e    fdZ/de de de!e    fd Z0de de de!e    fd!Z1de de de!e    fd"Z2i d#e*d$e"d%e#d&e$d'e%d(e&d)e'd*e(d+e)d,e+d-e0d.e,d/e-d0e.d1e/d2e1d3e2Z3e4e ejj                  e e ge!e    f   f   e6d4<   d5e de de de!e    fd6Z7y)9z>This module implements functions needed for the autocompleter.    N)	urlencode)	HTTPErrorsettings)enginesgoogle)getpost)SearxEngineResponseException)extrgen_useragent)SXNG_Responsereturnc                  4    d| vrt         d   d   | d<   d| d<   y )Ntimeoutoutgoingrequest_timeoutTraise_for_httperrorr   )kwargss    #/root/searxng/searx/autocomplete.pyupdate_kwargsr      s*    $Z01BCy$(F !    c                  .    t        di | t        | i |S N )r   http_getargsr   s     r   r	   r	   #   s    FT$V$$r   c                  .    t        di | t        | i |S r   )r   	http_postr   s     r   r
   r
   (   s    Fd%f%%r   query_sxng_localec           
          d}t        |t        ddd| d      z         }g }|j                  r2|j                         }d|v r|d   D ]  }|j	                  |d           |S )Nzhttps://www.baidu.com/sugrec?zutf-8   pc)iejsonprodwdgq)r	   r   okr'   append)r!   r"   base_urlresponseresultsdataitems          r   baidur3   -   sk    .H8iw4W\(]^^_HG{{!)$;S	 *tCy)*Nr   c           	      J   d}dj                  d t        d      D              }t        |t        | d|d      z         }g }|j                  rV|j                         }d|v rB|d   D ]:  }|d   }|j                  d	d      j                  d
d      }|j                  |       < |S )Nz$https://www.bing.com/AS/Suggestions? c              3      K   | ]8  }t        j                  t        j                  t        j                  z          : y wN)randomchoicestringascii_uppercasedigits).0_s     r   	<genexpr>zbing.<locals>.<genexpr>?   s(     \Q6==!7!7&--!GH\s   >A     r$   )qrycsrcvidsr+   u   u   )joinranger	   r   r,   r'   replacer-   )	r!   r"   r.   rC   r/   r0   r1   r2   
completions	            r   bingrI   ;   s    5H77\RWXZR[\\D8ia(NOOPHG{{!)$;S	 +"&s)
 (//"=EEhPRS
z*+ Nr   c                     d}|t        d| i      z  }d}dd|ii}t        |fi |}g }|j                  r+|j                         }|d   D ]  }|j	                  |        |S )Nz%https://search.brave.com/api/suggest?r+   allcookiescountryr$   r   r	   r,   r'   r-   )	r!   r"   urlrM   r   respr0   r1   r2   s	            r   braverQ   O   sx    
1C9c5\""CG)W-.FsfDGww $		G 	!DNN4 	!Nr   c                    d}t        |t        t        |             z         }g }|j                  rPt        j
                  j                  |j                        }|j                  d      D cg c]  }t        |       }}|S c c}w )Nz9https://lookup.dbpedia.org/api/search.asmx/KeywordSearch?)QueryStringz//Result/Label//text())
r	   r   dictr,   lxmletree
fromstringcontentxpathstr)r!   r"   autocomplete_urlrP   r0   domxs          r   dbpediar^   _   sr    R)DU,C"DDEDGwwjj##DLL1#&99-E#FGa3q6GGN Hs   .Bsxng_localec                     t         d   j                  }| |j                  ||j                        d}dt	        |      z   }t        |      }g }|j                  r#|j                         }t        |      dkD  r|d   }|S )z=Autocomplete from DuckDuckGo. Supports DuckDuckGo's languages
duckduckgo)r+   klz%https://duckduckgo.com/ac/?type=list&r$   )	r   traits
get_region
all_localer   r	   r,   r'   len)r!   r_   rc   r   rO   rP   r0   js           r   ra   ra   k   s}     \"))FV->->?D
 2IdO
CCs8DGwwIIKq6A:dGNr   c                 *   t        j                  d|it        d   j                        }d}t	        | d|d   d   d      }g }t        |j                  |d   |	            }|r|j                  r|j                  |j                  j                  d
      |j                  j                  dd      dz    }t        j                  |      }|d   D ]A  }	|j                  t        j                  j                  |	d         j!                                C |S )zAutocomplete from Google.  Supports Google's languages and subdomains
    (:py:obj:`searx.engines.google.get_google_info`) by using the async REST
    API::

        https://{subdomain}/complete/search?{args}

    searxng_localer   z*https://{subdomain}/complete/search?{args}zgws-wizparamshl)r+   clientrk   	subdomain)rm   r   []r$   r   )r   get_google_infor   rc   r   r	   formatr,   textfindr'   loadsr-   rU   htmlrW   text_content)
r!   r_   google_inforO   r   r0   rP   json_txtr1   r2   s
             r   google_completerz      s     %+$:$:<Lk;Z\cdl\m\t\t$uK
6Ch'-	
D GszzK$<4zHID99TYY^^C0499>>#r3JQ3NOzz(#G 	IDNN499//Q8EEGH	INr   c                     d}t        |j                  t        d| i                  j                         d   }|D cg c](  }|j	                  d      r|j	                  d      r'|* c}S c c}w )zAutocomplete from Mwmbl_.z-https://api.mwmbl.org/search/complete?{query}r+   r!   r$   zgo: zsearch: )r	   rr   r   r'   
startswith)r!   r"   rO   r0   results        r   mwmblr      sg     :CSZZie.EZFGLLNqQG ")pv0A0A&0IRXRcRcdnRoFppps   A.A.'A.c                     dt        | ddd       }t        |      }g }|j                  rB|j                         }|j                  d      r!|d   d   D ]  }|j	                  |d           |S )Nz"https://ac.search.naver.com/nx/ac?r'   r   )r+   r_formatstitemsrN   r!   r"   rO   r/   r0   r1   r2   s          r   naverr      sv    .yuRX`a9b/c.d
eC3xHG{{!)88GWa( (tAw'(Nr   c                     dt        d| d       }t        |      }g }|j                  r2|j                         }d|v r|d   D ]  }|j	                  |d           |S )Nzhttps://sug.so.360.cn/suggest?r'   )rr   wordr~   r   rN   r   s          r   qihu360searchr      sj    *9PU5V+W*X
YC3xHG{{!)tX -tF|,-Nr   c                     dt        d| i       }t        |      }g }|j                  r;|j                         }|j                  dg       D ]  }|j	                  |d           |S )Nzhttps://sugs.m.sm.cn/web?r+   rwrN   r   s          r   quarkr      sg    %ie&=%>
?C3xHG{{}}HHS"% 	&DNN49%	&Nr   c                    d}t        |j                  t        | t        |       dddd                  }g }|j                  r|j                         }|j                  dg       D cg c]V  }|j                  dd       d	k(  r?d
j                  |j                  dg       D cg c]  }|j                  dd
       c}      X }}}|S c c}w c c}}w )Nz-https://suggest.seznam.cz/fulltext/cs?{query}zjson-216)phrasecursorPositionrr   	highlightcountr|   r~   itemTypezItemType.TEXTr5   rs   )r	   rr   r   rf   r,   r'   rE   )r!   r"   rO   rP   r0   r1   r2   parts           r   seznamr      s    
9C

 CJ(adors 	 	
D Gwwyy{ 2.
xx
D)_< GGdhhvr6JKdTXXfb)KL
 

 N	 L
s   )9C"C	;	C	Cc                    d}t        |t        d| d      z         }g }|j                  r:t        |j                  ddd      }	 t        j                  d| d      }|d	   }|S |S # t
        j                  $ r Y |S w xY w)
Nz$https://sor.html5.qq.com/api/getsug?searxng)mkeyrn   ro   r5   )defaultz]]r$   )r	   r   r,   r   rs   r'   ru   JSONDecodeError)r!   r"   r.   rP   r0   raw_jsonr1   s          r   sogour      s    5Hx))E$BCCDDGww		3R8	::(2./D1gG N7N ## 	N	s   A' 'A>=A>c                    ddddddddd	d
d
}|j                  d      d   }|j                  |d      }| dd|d}dt        |       }dt               i}t        ||      }g }	|j                  r9	 |j                         }
t        |
      dk\  rt        |
d   t              r|
d   }	|	S |	S # t
        j                  $ r Y |	S w xY w)zgAutocomplete from Startpage's Firefox extension.
    Supports the languages specified in lang_map.
    danskdeutschenglishespanolfrancaisnorsk
nederlandspolski	portuguessvenska)
dadeenesfrnbnlplptsv-r   
opensearchzstartpage.defaultffx)r+   rr   segmentluiz&https://www.startpage.com/suggestions?z
User-Agent)headers   r$   )
splitr	   r   r   r,   r'   rf   
isinstancelistr   )r!   r_   lang_map	base_langr   
url_paramsrO   hrP   r0   r1   s              r   	startpager      s     H !!#&q)I
,,y)
,C )	J 39Z3H2I
JC 
}'AsADGww	99;D4yA~*T!Wd";q' N7N ## 	N	s   16B+ +CCc           
          d}t        j                  t        |j                  t	        d| i                  j
                        }|S )Nz5https://swisscows.ch/api/suggest?{query}&itemsCount=5r!   r|   )r'   ru   r	   rr   r   rs   )r!   r"   rO   r0   s       r   	swisscowsr   %  s:    
ACC

GUCS9T
(U$V$[$[\GNr   c           
      .   t         d   j                  j                  |d      }d}t        |j	                  t        | |dd                  }g }|j                  r9|j                         }|d   dk(  r!|d	   d
   D ]  }|j                  |d           |S )z2Autocomplete from Qwant. Supports Qwant's regions.qwanten_USz(https://api.qwant.com/v3/suggest?{query}2)r+   localeversionr|   statussuccessr1   r   value)	r   rc   rd   r	   rr   r   r,   r'   r-   )r!   r_   r   rO   rP   r0   r1   r2   s           r   r   r   ,  s    W$$//WEF
4Cszz	TW*X YzZ[DGwwyy{>Y&VW- .tG}-. Nr   c           	      6   t         d   j                  }|j                  |d      }|j                  d   j	                  |d      }t        ddd| dd	d
      }t	        d| d|       }g }|j                  r#|j                         }t        |      dkD  r|d   }|S )zIAutocomplete from Wikipedia. Supports Wikipedia's languages (aka netloc).	wikipediar   wiki_netloczen.wikipedia.orgr   r'   r   010)actionrr   formatversionsearch	namespacelimitzhttps://z/w/api.php?r$   )	r   rc   get_languagecustomr	   r   r,   r'   rf   )	r!   r_   
eng_traits	wiki_langr   r   rP   r0   r1   s	            r   r   r   <  s    %,,J''T:I!((7;;IGYZK" 	
	D +k$89DGwwyy{t9q=1gGNr   c                     d}t        j                  t        |j                  t	        t        |                         j                        }g }t        |      dkD  r|d   }|S )Nz-https://suggest.yandex.com/suggest-ff.cgi?{0})r   r$   )r'   ru   r	   rr   r   rT   rs   rf   )r!   r"   rO   rP   r0   s        r   yandexr   W  sQ    
9C::c#**Yt/?%@ABGGHDG
4y1}q'Nr   	360searchr3   rI   rQ   r^   ra   r   r   r   r   r   r   r   r   r   r   r   backendsbackend_namec                 v    t         j                  |       }|g S 	  |||      S # t        t        f$ r g cY S w xY wr7   )r   r	   r   r   )r   r!   r_   backends       r   search_autocompleter   w  sF    ll<(G	uk**34 	s   $ 88)r   N)r   r   )8__doc__r:   r8   r'   typingturllib.parser   
lxml.etreerU   	lxml.htmlhttpxr   searxr   searx.enginesr   r   searx.networkr	   r   r
   r    searx.exceptionsr   searx.utilsr   r   TYPE_CHECKINGsearx.extended_typesr   r   rZ   r   r3   rI   rQ   r^   ra   rz   r   r   r   r   r   r   r   r   r   r   r   r   rT   Callable__annotations__r   r   r   r   <module>r      sm   D     "     = 9 +??2)%
&
 C DI  3 49 ( C DI  	3 	c 	d3i 	c  S	 (3 S T#Y :	q 	qC 	qDI 	q C DI  C DI 
 
C 
DI 
# S T#Y , C DI  +S +s +tCy +\S  S	  3 49  S s tCy 6# S T#Y ::U: D: U	:
 w: *: o: U: U: U: U: f: U: : :  !:" f#:$sAJJSz49455
6 *c # C DQTI r   