
    ThN@              	           d dl Z d dlZd dlZd dlZd dlZdddd daddddd	d
addddddddddddgddddgdZg ag a	d Z
d Zd Zd Zd Zd  Zd! Zd" Zd# Zd$ Zd% Zd& Zd' Zed(k(  rdZer e       Zer
yyy))    Nzh
   )keywordlanguagelimit	namespaceTF
links_onlyJSONz./saved_results)include_full_textinclude_links_datamedia_actionformatpathu   人工智能uD   人工智能（英语：Artificial Intelligence，缩写为 AI）...u*   这是完整的维基百科文章内容...u*   https://zh.wikipedia.org/wiki/人工智能u   深度学习u*   https://zh.wikipedia.org/wiki/深度学习Internal)anchor_texturltypeGitHubzhttps://www.github.comExternalzAI_Diagram.jpgzOhttps://upload.wikimedia.org/wikipedia/commons/4/4b/Artificial_Intelligence.pngImage)	file_namer   r   )titlesummaryfull_contentfull_urllinksmediac                  b    t        j                  t         j                  dk(  rd       yd       y)u?   清空命令行屏幕 (在不同系统上使用不同的命令)ntclsclearN)ossystemname     wikicli_saver.pyclear_screenr(   .   s    IIrww$e4G4r&   c                  ,    t        j                  d      S )u   获取当前时间戳字符串z%Y%m%d_%H%M%S)timestrftimer%   r&   r'   get_timestampr,   2   s    ==))r&   c                 H   t        d| d    d| d    d       t        j                  d       | d   st        d       g S g }t        dd      D ]9  }t        j                         }| d    d	| |d
<   ||d<   |j                  |       ; t        dt        |       d       |S )u   
    [TODO] 真实的维基百科 API 调用函数。
    它应该根据 config['keyword'] 和 config['language'] 调用 MediaWiki API
    获取搜索结果列表，并对每个结果调用另一个 API 获取 full_content, links, media 等信息。
    u(   
[INFO] 正在使用配置执行搜索: r   z @ r   ...   u    [ERROR] 关键词不能为空。   u    结果 r   idu   [SUCCESS] 找到 u    条结果。)printr*   sleeprangeMOCK_RESULTcopyappendlen)configresultsiress       r'   wikipedia_api_callr=   8   s     
5fY6G5HFS]L^K__b
cdJJqM)01	 G1a[  +,HQC8GD	s	  
c'l^=
9:Nr&   c                 j    g }t        dt        |        d| d       t        j                  d       |S )uh   
    [TODO] 真实的媒体文件下载函数。
    使用 requests 库下载文件到 save_dir。
    u   [INFO] 正在下载 u    个媒体文件到 r.   r/   )r2   r8   r*   r3   )
media_listsave_dirdownloaded_pathss      r'   download_mediarB   P   s;    
 	 Z 11EhZs
ST 	JJqMr&   c                 2    t        j                  | dd      S )u"   [TODO] 格式化为 JSON 字符串F   )ensure_asciiindent)jsondumps)	data_lists    r'   format_to_jsonrJ   g   s    ::ieA>>r&   c                 D    g d}t         d   r|j                  d       g }y)u!   [TODO] 格式化为 CSV 字符串)r   r   r   r   links_countztitle,summary
...)SAVE_CONFIGr7   )rI   keyscsv_datas      r'   format_to_csvrP   k   s(     ,D'(M"H  r&   c           
          d}| D ][  }|d|d    dz  }||d    dz  }t         d   r4|dz  }|j                  d	g       D ]  }|d
|d    d|d    d|d    dz  } |dz  }] |S )u&   [TODO] 格式化为 Markdown 字符串 z# r   z

r   
r   u
   ## 链接
r   z* [r   z](r   z) (r   z)
z---

)rM   get)rI   mditemlinks       r'   format_to_markdownrX   x   s    	B
4=/&&
n%&b))+,-B"-D/04;-s4<.PSTT .
i  Ir&   c                     t                t        d       t        d       t        d       t        d       t        d       t        d      j                         } | dk(  rt	                y| dk(  rt                y| d	k(  rt        d
       t        d       y| dk(  rt        d       yt        d       t        j                  d       y)u	   主菜单u   --- WikiCLI-Saver 主菜单 ---u   1. 执行新的高级搜索u   2. 查看/管理已保存结果u   3. 帮助与关于u   0. 退出程序   请输入选项: 123ua   
[INFO] WikiCLI-Saver 是一个用于维基百科高级搜索和数据保存的命令行工具。u   按任意键返回主菜单...0u)   
[INFO] 感谢使用，程序已退出。F)   [ERROR] 无效选项，请重新输入。r/   T)r(   r2   inputstripsearch_config_menumanage_menur*   r3   choices    r'   	main_menurf      s    N	
+,	
'(	
+,	
	
&'--/F}  
3  
3rs./  
3:;9:

1r&   c                     	 t                t        d       t        dt        d   xs d        t        dt        d           t        dt        d    d	       t        d
t        d    d       t        d       t        d       t        d      j	                         } | dk(  r!t        d      j	                         t        d<   n| dk(  r:t        d      j	                         j                         xs	 t        d   t        d<   n| dk(  r	 t        t        d            t        d<   n| dk(  r!t        d      j	                         t        d<   nv| dk(  rKt        d   s"t        d       t        j                  d       |t        t              at        r1t                y| dk(  ryt        d       t        j                  d       # t        $ r t        d       Y w xY w)u   2.1 搜索配置菜单u   --- 2.1 搜索配置菜单 ---u3   1. 输入/修改搜索关键词 (必填): Current: r   u	   未设置u.   2. 设置语言版本 (默认：zh): Current: r   u.   3. 限制结果数量 (默认：10): Current: r   u    条u/   4. 设置搜索类型 (命名空间): Current: r   u    (文章/主空间)u   5. 执行搜索u   0. 返回主菜单rZ   r[   u   请输入搜索关键词: r\   u)   请输入语言代码 (如: zh, en, de): r]   u$   请输入结果数量限制 (1-50): u#   [ERROR] 请输入有效的数字。4u,   请输入命名空间编号 (如 0, 6, 14): 5u&   [ERROR] 请先设置搜索关键词。r/   r^   r_   N)r(   r2   CONFIGr`   ra   lowerint
ValueErrorr*   r3   r=   current_resultsresults_display_menurd   s    r'   rb   rb      s    ./CF9DUDdYdCefg>vj?Q>RST>vg>OtTU?{@S?TTghi "#*+113S= %&B C I I KF9s]!&'R!S!Y!Y![!a!a!c!ygmnxgyF:s]="%e,R&S"Tw s]"'(V"W"]"]"_F;s])$>?

108O$&s]=>JJqMK &  =;<=s   G GGc                  t   t         st        d       y	 t                t        dt        t                d       t	        t               D ]&  \  } }t        d| dz    d|d    d	|d
   dd  d       ( t        d       t        d       t        d       t        d       t        d       t        d       t        d      j                         j                         }|j                         rdt        |      cxk  rt        t               k  rqn nnt        |      dz
  }t        d       t        dt         |   d           t        dt         |   d           t        dt         |   d
           t        d       n|dk(  rt        t                y|j                  d      r	 |dd j                  d      D  cg c]/  } | j                         st        | j                               dz
  1 }} |D  cg c]'  } d| cxk  rt        t               k  sn n	t         |    ) }} |rt        |       yt        d       t        j                  d       n.|d!k(  ry|d"k(  rg a yt        d#       t        j                  d       mc c} w c c} w # t        $ r# t        d        t        j                  d       Y 7w xY w)$u   2.2 结果展示与操作菜单u+   [INFO] 当前没有搜索结果可展示。Nu   --- 2.2 搜索结果 (共 	    条) ---[r/   ]. r   z (r      z...)   
--- 操作 ---u.    [数字]  - 查看指定结果的完整摘要u,    S       - 保存当前搜索的全部结果u<    P [1,2] - 保存指定的单个或多个结果 (如: P 1,5)u    R       - 重新配置搜索    0       - 返回主菜单   请输入操作: u   
--- 结果详情 ---u   标题: u   链接: r   u   摘要:    按任意键返回...SzP    ,r   u&   [ERROR] 选中的结果编号无效。u5   [ERROR] 格式错误，请使用 P 1,5,8 的形式。Rr^      [ERROR] 无效操作。)rn   r2   r(   r8   	enumerater`   ra   upperisdigitrl   save_config_menu
startswithsplitr*   r3   rm   )r;   r<   actionindexindicesselected_resultss         r'   ro   ro      ss    ;<
*3+?*@	JK0FAsAacU#c'l^2c)nSb.A-B$GH 1 	 !>?<=LM-.*+*+11399;>>S[ HC4H HK!OE*+H_U3G<=>?H_U3J?@ABH_U3I>?@A)*s]_-t$7=abz7G7G7LZ7L!PQPWPWPY3qwwy>A-7LZ@G#i11PQKhTWXgThKhOA$6 #i#$%56BCJJqM s]s] O+,JJqMe < [#i  MN

1sB   $J :JJ.J 4JJ J 0 J 
J )J76J7c                    t        |       }	 t                t        d| d       t        d       t        dt        d   rdnd        t        dt        d	   rdnd        t        d
t        d    d       t        d       t        dt        d    d       t        dt	                dt        d   j                                 t        dt        d           t        d       t        d       t        d      j                         j                         }|dk(  rt        d    t        d<   n2|dk(  rt        d	    t        d	<   n|dk(  rAt        d      j                         j                         }|dv r
|t        d<   nt        d       n|dk(  rAt        d      j                         j                         }|d v r
|t        d<   nt        d       n|d!k(  r!t        d"       t        j                  d#       nh|d$k(  r,t        d%      j                         xs	 t        d   t        d<   n7|d&k(  rt        |        y)|d'k(  ry)t        d(       t        j                  d#       Y)*u   2.3 数据保存设置菜单u    --- 2.3 数据保存设置 (共 rq   u   
A. 内容深度配置u.   1. 保存文章全文 (默认: Yes): Current: r   YesNou)   2. 包含页面内链接文本: Current: r   u    3. 媒体内容处理: Current: r   u&    (可选: links_only / download_files)u   
B. 格式与路径配置u    4. 选择保存格式: Current: r   u    (可选: JSON, CSV, MD)u/   5. 指定保存文件名: Default: wiki_search_.u    6. 指定保存路径: Current: r   u   
E. 确认并执行保存u$   0. 取消操作并返回上一菜单rZ   r[   r\   r]   uA   请输入新的媒体处理方式 (links_only / download_files): )r	   download_filesu   [ERROR] 输入无效。rh   u%   请输入保存格式 (JSON/CSV/MD): )r
   CSVMDri   uL   [INFO] 文件名将在执行保存时自动生成，请在路径中查看。r/   6u   请输入新的保存路径: Er^   u   [ERROR] 无效选项。N)r8   r(   r2   rM   r,   rk   r`   ra   r   r*   r3   execute_save)results_to_savenum_resultsre   r   fmts        r'   r   r     sG    o&K
0YGH'(>TgHhunr>stu9;OcCd%jn9opq0^1L0MMstu*+0X1F0GG_`a??PPQR]^fRgRmRmRoQpqr0V1D0EFG*+45*+11399;S=3>?R3S/SK+,s]4?@T4U0UK,-s]^_eegmmoF99.4N+/0s]?@FFHNNPC++(+H%/0s]abZZ]s]"'(G"H"N"N"P"gT_`fTgKs])s]+,JJqMa r&   c                    t        j                  t        d   d       t               }d| }t        d   j	                         }|dk(  rt        |       }n1|dk(  rt        |       }n |dk(  rt        |       }nt        d	|        y
d
}t        d   dk(  rt         j                  j                  t        d   | d      }t        j                  |d       g }| D ]#  }|j                  |j                  dg              % t        ||      }t        dt        |       d       t         j                  j                  t        d   | d|       }		 t        |	dd      5 }
|
j!                  |       d
d
d
       t        d|	        |rt        d|        t"        j%                  |	       t'        d       y
# 1 sw Y   HxY w# t(        $ r#}t        d|        t'        d       Y d
}~y
d
}~ww xY w)u   执行文件保存操作r   T)exist_okwiki_search_r   rG   csvrU   u   [FATAL] 未知的保存格式: Nr   r   _mediar   u   [INFO] 成功下载 u    个媒体文件。r   wutf-8encodingu"   
[SUCCESS] 数据保存成功到: u!   [SUCCESS] 媒体文件保存到: rx   u   [FATAL] 保存文件失败: )r"   makedirsrM   r,   rk   rJ   rP   rX   r2   r   joinextendrT   rB   r8   openwritehistory_filesr7   r`   	Exception)data_to_save	timestampbase_filename	extensioncontent	media_dir	all_mediarV   rA   main_file_pathfes               r'   r   r   >  s    KKF#d3 I"9+.MH%++-I F .	e	-	d	$\2/	{;< I>"&66GGLLV!4v6NO	
I-	 DTXXgr23 ! *)Y?$S)9%:$;;NOP WW\\+f"5-)7UVN'.#8AGGG 9 	3N3CDE5i[AB^,%& 98  ',QC01%&&'s1   G F81AG 8G=G 	G0G++G0c            	         	 t         D  cg c]$  } t        j                  j                  |       s#| & }} t	                t        d       |st        d       nDt        |      D ]6  \  }}t        d|dz    dt        j                  j                  |              8 t        d       t        d       t        d       t        d	       t        d
       t        d      j                         j                         }|j                         rdt        |      cxk  rt        |      k  rn n|t        |      dz
     }t        dt        j                  j                  |       d       	 t        |dd      5 } t        d      D ]/  }| j!                         }|s nt        |j                                1 ddd       t        d       nL|j%                  d      r	 t        |dd j                               dz
  }d|cxk  rt        |      k  rn n||   }t        dt        j                  j                  |       d      j                         j'                         }	|	dk(  rWt        j(                  |       t         j)                  |       t        dt        j                  j                  |       d       nt        d       nt        d       t+        j,                  d       n-|d k(  r|d!k(  ryt        d"       t+        j,                  d       c c} w # 1 sw Y   jxY w# t"        $ r}t        d|        Y d}~d}~ww xY w# t"        $ r}t        d|        Y d}~d}~ww xY w)#u   2.4 数据管理菜单u!   --- 2.4 已保存结果管理 ---u+   [INFO] 当前没有已保存文件记录。rr   r/   rs   ru   u6    [数字]  - 查看指定文件内容 (打印前10行)u*    D [数字]- 删除指定文件 (如: D 1)u    R       - 刷新文件列表rv   rw   z
--- u    (前10行) ---rr   r   r   Nu   [ERROR] 读取文件失败: rx   zD rz   r   u   确认删除文件 u    吗? (y/n): yz
[SUCCESS] u    已删除。u   [INFO] 取消删除。u   [ERROR] 编号无效。u   [ERROR] 删除失败: r|   r^   r}   )r   r"   r   existsr(   r2   r~   basenamer`   ra   r   r   rl   r8   r   r4   readliner   r   rk   remover*   r3   )
r   current_historyr;   fpathr   liner   r   file_to_deleteconfirms
             r'   rc   rc   p  s     '4Imrww~~a7H1mI12?@%o65!A#c"''"2"25"9!:;< 7 	 !FG:;-.*+*+11399;>>S[ HC4H H#CKM2EF277++E23?CD:%w71"2Y zz|#Udjjl+ ' 8 )*t$4F12J,,./!34O 44%4U%;N#&9"'':J:J>:Z9[[h$ijpprxxzG#~		.1%,,^<
277+;+;N+K*LMZ[6734 JJqMs]s]+,JJqMy  J. 87
  :4QC899:&  4.qc2334sS   $LL(L) 6>L4L) C6M L&!L) )	M2MM	M/M**M/__main__)r"   rG   r   r*   requestsrj   rM   r5   rn   r   r(   r,   r=   rB   rJ   rP   rX   rf   rb   ro   r   r   rc   __name__runningr%   r&   r'   <module>r      s   	  
   	
   U@<&/[eop )A:V
 '  0A  KR  	S 5*0.? 6(T9v5n0'd@J zG
+  r&   