+
    ޛi$                         R t ^ RIt^ RIt^ RIt^ RIt^ RIHtHt ^ RIt^ RItR t	R t
RR ltR tR tRR ltR	 tR
 tRR ltR t]R8X  d
   ]! 4        R# R# )uD   
Ghost CMS Admin API Client
支持：发布、更新、删除文章
N)datetime	timedeltac                 f    R\         P                  ! RR4      R\         P                  ! RR4      /p V # )u   从环境变量获取配置api_urlGHOST_API_URL admin_api_keyGHOST_ADMIN_API_KEY)osgetenv)configs    A/Users/tonyclaw/.openclaw/workspace/skills/ghost/scripts/ghost.py
get_configr      s3     	299_b1#8"=F M    c           
     (   V '       d   RV 9  d   R# V P                  R^4      w  r\        P                  ! R\        P                  ! 4       R\        P                  ! 4       \        ^R7      ,           RR/\        P                  V4      RR	V/R
7      pV# )u    生成 Ghost Admin API JWT Token:Niatexp)minutesaudz/admin/HS256kid)	algorithmheaders)splitjwtencoder   utcnowr   bytesfromhex)api_keykey_idsecrettokens   &   r   generate_tokenr$      s|    c(]]3*NF JJ8??$8??$y';;9	

 	f	E Lr   c                B    \        V 4      pRRV 2/pV'       d   WR&   V# )u   获取请求头AuthorizationzGhost zContent-Type)r$   )r    content_typer#   r   s   &&  r   get_headersr(   ,   s1    7#E6%)G ".Nr   c                   \         P                  P                  V4      '       g   \        RV 24       R# V R,           R2p ^ RIp\        VR4      ;_uu_ 4       pR\         P                  P                  V4      VR3/p\        V R,          R4      pVP                  ! W%VR	7      pVP                  4        VP                  4       pVP                  R
4      ;'       g*    VP                  R/ .4      ^ ,          P                  R
4      p	V	'       d   \        RV	 24       V	uuRRR4       # \        RV 24        RRR4       R#   + '       g   i     R# ; i  \         d   p
\        RT
 24        Rp
?
R# Rp
?
ii ; i)u    上传图片到 Ghost 获取 URLu   ❌ 图片不存在: Nr   z/images/upload/rbfilez
image/jpegr   )filesr   urlimagesu   ✅ 图片上传成功: u"   ⚠️  图片上传返回异常: u   ❌ 图片上传失败: )r
   pathexistsprintrequestsopenbasenamer(   postraise_for_statusjsonget	Exception)r   
image_pathr-   r2   fr,   r   responsedata	image_urles   &&         r   upload_imager@   6   sA   77>>*%%%j\23I
/C*d##qbgg..z:A|LME!&"94@G}}SwGH%%'==?DQQ488Hrd+CA+F+J+J5+QI0<=  $# :4&AB $###"  (,-sI   E B5EE 
E +E:E E	E E E<#E77E<c                    V P                  4       p \        P                  ! RRV 4      p \        P                  ! RRV 4      p V R,          # )u   生成 slugz[^\w\s-]r   z[\s]+-:Nd   N)lowerresub)texts   &r   slugifyrH   V   s;    ::<D66+r4(D66(C&D:r   c                r   V R,           R2pRRTRTR\        V4      RTRT;'       g    R	/./pV'       d&   V U	u. uF  p	R
V	/NK	  	  up	VR,          ^ ,          R&   V'       d   WhR,          ^ ,          R&   \        V R,          4      p
 \        P                  ! WxV
R7      pVP	                  4        VP                  4       pVR,          ^ ,          p\        R4       \        RVR,           24       \        RVR,           24       \        RVP                  RR4       24       \        RVR,           24       V# u up	i   \        P                  P                   dX   p\        RT 24       \        TP                  R4      '       d#   \        RTP                  P                   24        Rp?R# Rp?ii ; i)u   创建新文章r   z/posts/?source=htmlpoststitlehtmlslugstatusexcerptr   nametagsfeature_imager   r7   r   u   ✅ 文章创建成功   ID: id      标题:    URL: r-   N/A      状态: u   ❌ 创建失败: rG         错误详情: N)rH   r(   r2   r5   r6   r7   r1   r8   
exceptionsRequestExceptionhasattrr<   rG   )r   rK   contentrN   rQ   rO   rR   r-   	post_datatagr   r<   r=   r5   r?   s   &&&&&&&        r   create_postra   ]   s    I2
3C 	UGGENfw}}"
 I BF(G$3&#$(G	'1f%1>'1o.&12G==gF!!#}}G}Q&(T
|$%DM?+,%/012DN+,-% )H& // "1#&'1::v&&%ajjoo%678	s   D;	B1E   F6AF11F6c                   V R,           RV R2pR/ ./pRV9   d   VR,          VR,          ^ ,          R&   RV9   d   VR,          VR,          ^ ,          R&   RV9   d   VR,          VR,          ^ ,          R&   R	V9   d   VR	,          VR,          ^ ,          R	&   R
V9   d-   VR
,           Uu. uF  pRV/NK	  	  upVR,          ^ ,          R
&   \        V R,          4      p \        P                  ! W4VR7      pVP                  4        VP	                  4       pVR,          ^ ,          p	\        R4       \        RV	R,           24       \        RV	R,           24       V	# u upi   \        P                  P                   dX   p
\        RT
 24       \        T
P                  R4      '       d#   \        RT
P                  P                   24        Rp
?
R# Rp
?
ii ; i)u   更新文章r   /posts//rJ   rK   r^   rL   rN   rO   rQ   rP   r   rS   u   ✅ 文章更新成功rT   rU   rV   u   ❌ 更新失败: rG   rZ   N)r(   r2   putr6   r7   r1   r[   r\   r]   r<   rG   )r   post_idkwargsr-   update_datar`   r   r<   r=   r5   r?   s   &&,        r   update_postri      s   Iwwiq
1CRD/K&+1'?GQ(F*0*;GQ'6,28,<GQ)F-3I->GQ	*DJ6N*SNSFC=N*SGQ'&12G<<wG!!#}}G}Q&(T
|$%DM?+, +T // "1#&'1::v&&%ajjoo%678	s    +EA>E# #GAGGc                   V R,           RV R2p\        V R,          4      p \        P                  ! W#R7      pVP                  4        \	        R4       \	        RV 24       R#   \        P
                  P                   dX   p\	        R	T 24       \        TP                  R
4      '       d#   \	        RTP                  P                   24        Rp?R# Rp?ii ; i)u   删除文章r   rc   rd   r   r   u   ✅ 文章删除成功rT   Tu   ❌ 删除失败: rG   rZ   NF)
r(   r2   deleter6   r1   r[   r\   r]   r<   rG   )r   rf   r-   r   r<   r?   s   &&    r   delete_postrm      s    Iwwiq
1C&12G
??38!!#&(y!"// "1#&'1::v&&%ajjoo%678	s   A A% %CACCc           	        V R,           RV 2p\        V R,          4      p \        P                  ! W#R7      pVP                  4        VP	                  4       pVR,          p\        R\        V4       R24       \        R4       V F  pVR,          R	8X  d   R
MRp\        V RVR,           RVR,           24       \        RVR,           RVR,          R,           24       \        RVP                  RR4       24       \        4        K  	  V#   \        P                  P                   d   p	\        RT	 24        Rp	?	R# Rp	?	ii ; i)u   列出文章r   z/posts/?limit=r   rk   rJ   u   📄 最近 u    篇文章:rN   	publishedu   🟢u   🟡z [rU   z] rK   rY   u    | 更新: 
updated_at:N
   NrW   r-   rX   u   ❌ 获取失败: Nz<------------------------------------------------------------)	r(   r2   r8   r6   r7   r1   lenr[   r\   )
r   limitr-   r   r<   r=   rJ   r5   rN   r?   s
   &&        r   
list_postsrt      s.   I~eW
5C&12G<<5!!#}}WSZL45hD#H~<V&FVHBtDzl"T']O<=KX/{4;Mc;R:STUHTXXeU3456G  // "1#&'s   C.D E	0EE	c                  
   \        4       p V R ,          '       d   V R,          '       gC   \        R4       \        R4       \        R4       \        R4       \        P                  ! ^4       \	        \        P
                  4      ^8  d   \        R4       \        R\        P
                  ^ ,           R24       \        R\        P
                  ^ ,           R	24       \        R\        P
                  ^ ,           R
24       \        R\        P
                  ^ ,           R24       \        P                  ! ^4       \        P
                  ^,          pVR8X  EdT   \	        \        P
                  4      ^8  d"   \        R4       \        P                  ! ^4       \        P
                  ^,          p\        P
                  ^,          pRpRp\        \        P
                  R,          ^4       F  w  rgVR8X  dF   V^,           \	        \        P
                  4      8  d!   \        P
                  V^,           ,          pKQ  VR8X  g   KZ  V^,           \	        \        P
                  4      8  g   K  \        P
                  V^,           ,          P                  R4      pK  	  \        WW4V4       R# VR8X  Ed   \	        \        P
                  4      ^8  d"   \        R4       \        P                  ! ^4       \        P
                  ^,          p/ p	\        \        P
                  R,          ^4       EFT  w  rgVR8X  dI   V^,           \	        \        P
                  4      8  d$   \        P
                  V^,           ,          V	R&   KU  VR8X  dI   V^,           \	        \        P
                  4      8  d$   \        P
                  V^,           ,          V	R&   K  VR8X  dI   V^,           \	        \        P
                  4      8  d$   \        P
                  V^,           ,          V	R&   K  VR8X  g   K  V^,           \	        \        P
                  4      8  g   EK$  \        P
                  V^,           ,          P                  R4      V	R&   EKW  	  \        W3/ V	B  R# VR8X  dd   \	        \        P
                  4      ^8  d"   \        R4       \        P                  ! ^4       \        P
                  ^,          p\        W4       R# VR8X  dN   \	        \        P
                  4      ^8  d!   \        \        P
                  ^,          4      M^
p
\        W
4       R# \        R V 24       \        R!4       R# )"r   r   uG   ❌ 错误: 请设置环境变量 GHOST_API_URL 和 GHOST_ADMIN_API_KEYu   
示例:z=export GHOST_API_URL="https://your-blog.com/ghost/api/admin/"z/export GHOST_ADMIN_API_KEY="your-admin-api-key"u   用法:z  uG    create "标题" "内容" [--status draft|published] [--tags tag1,tag2]u?    update <post_id> [--title "新标题"] [--content "新内容"]z delete <post_id>z listcreateu-   ❌ 错误: 创建文章需要标题和内容draftN:   NNz--statusz--tags,updateu&   ❌ 错误: 更新文章需要 post_id:   NNz--titlerK   z	--contentr^   rN   rQ   rl   u&   ❌ 错误: 删除文章需要 post_idlistu   ❌ 未知命令: u-   支持的命令: create, update, delete, list)r   r1   sysexitrr   argv	enumerater   ra   ri   rm   intrt   )r   commandrK   r^   rN   rQ   iargrf   rg   rs   s              r   mainr      s   \F)F?$;$;WXkMN?@
388}qi388A;-jkl388A;-bcd388A;-012388A;-u%&hhqkG(sxx=1ABHHQK((1+  a0FAj QUS]%:!a%QUS]%:xxA,,S1	 1 	F7D9	H	sxx=1:;HHQK((1+  a0FAiAECM$9"%((1q5/w#ACHH(=$'HHQUOy!
"q1us388}'<#&88AE?x QUS]%:!$!a%!6!6s!;v 1 	F.v.	H	sxx=1:;HHQK((1+F$	F	$'MA$5CHHQK 26! 	"7),-=>r   __main__)zapplication/json)rw   NNN)rq   )__doc__r7   r}   r
   rE   r   r   r2   r   r   r$   r(   r@   rH   ra   ri   rm   rt   r   __name__ r   r   <module>r      sl   
  
 	 	 (  
(@'R!F$2J?X zF r   