
    y%j\                       d Z ddlmZ ddlZddlZddlZddlZddlZddl	Z	ddl
ZddlZddl
mZ dZdZdZdZh d	Zej                            ej                            e          d
          Zej                            ej                            e          d          Zd,dZd-d.dZd/dZd0dZd1d2d$Zd3d%Z	 	 	 d4d5d(Zd6d*Z e!d+k    r e" e                       dS )7a  Send a short text memo to the authenticated user's KakaoTalk My Chatroom.

Required environment:
  - KAKAO_REST_API_KEY
  - KAKAO_REFRESH_TOKEN

Optional environment:
  - KAKAO_CLIENT_SECRET
  - KAKAO_ACCESS_TOKEN
  - KAKAO_DASHBOARD_URL
  - DASHBOARD_PUBLIC_URL
  - KAKAO_LINK_URL
    )annotationsN)urlparsez#https://kauth.kakao.com/oauth/tokenz4https://kapi.kakao.com/v2/api/talk/memo/default/sendzhttps://finance.yahoo.comzcodex-us-equity-kakao>   ::1	127.0.0.1	localhostzkakao_send_log.jsonlzdashboard_public_url.txtnamestrreturn
str | Nonec           	     6   t           j                            |           }|r|S 	 t          j        dddt
          d| dgdddd	          }n# t          $ r Y d S w xY w|j        d
k    r2|j        	                                r|j        	                                S d S )Nsecurityzfind-generic-passwordz-sz-az-wFT   )checkcapture_outputtexttimeoutr   )
osenvironget
subprocessrunKEYCHAIN_SERVICE	Exception
returncodestdoutstrip)r   valueresults      outputs/send_kakao_memo.py
get_secretr    &   s    JNN4  E '  
 
 
    ttA&-"5"5"7"7}""$$$4s   %A 
AAurldatadict[str, str]headersdict[str, str] | Nonedictc                "   t           j                            |                              d          }t           j                            | |d          }|                    dd           |pi                                 D ]\  }}|                    ||           t           j                            |d          5 }t          j
        |                                                    d                    cd d d            S # 1 swxY w Y   d S )Nutf-8POST)r"   methodzContent-Typez/application/x-www-form-urlencoded;charset=utf-8   )r   )urllibparse	urlencodeencoderequestRequest
add_headeritemsurlopenjsonloadsreaddecode)r!   r"   r$   encodedreqkeyr   responses           r   	post_formr=   A   s/   l$$T**11'::G
.
 
 76
 
B
BCNN>#TUUU}"++-- # #
UsE""""			R		0	0 ;Hz(--//0099::; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;s   >9DDDstatustitler   detail
dict | strNonec                   t           j                            t           j        j                                                  | |t          |          |                                r4|                                                                d         d d         nd|d}	 t          t          dd          5 }|                    t          j        |d	          d
z              d d d            d S # 1 swxY w Y   d S # t          $ r Y d S w xY w)Nr   x    )	timestampr>   r?   message_charsmessage_first_liner@   ar(   encodingFensure_ascii
)dtdatetimenowtimezoneutc	isoformatlenr   
splitlinesopenSEND_LOGwriter5   dumpsr   )r>   r?   r   r@   recordhandles         r   write_send_logr]   K   sO   [__R[_55??AATDHJJLLXdjjll5577:4C4@@VX F(C'222 	HfLLF???$FGGG	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H   s6   C< 5-C/"C< /C33C< 6C37C< <
D
	D
c                     t          d          } t          d          }t          d          }|r;|r9d||d}t          d          }|r||d<   t          t          |          }|d         S | r| S t          d	          )
NKAKAO_ACCESS_TOKENKAKAO_REST_API_KEYKAKAO_REFRESH_TOKENrefresh_token)
grant_type	client_idrb   KAKAO_CLIENT_SECRETclient_secretaccess_tokenzuMissing Kakao credentials. Set KAKAO_REST_API_KEY and KAKAO_REFRESH_TOKEN, or provide a temporary KAKAO_ACCESS_TOKEN.)r    r=   	TOKEN_URL
SystemExit)direct_tokenrest_api_keyrb   payloadrf   	refresheds         r   get_access_tokenrn   [   s    233L233L455M 
) 
))%*
 

 ##899 	5'4GO$i11	(( 
	5      Flink_urlallow_local_linkboolc                    | pt                                           } t          |           }|j        r|j        st           S |s|j        t          v rt           S | S N)DEFAULT_LINKr   r   schemenetlochostnameLOCAL_HOSTS)rp   rq   parseds      r   normalize_link_urlr{   u   s]    (L//11HhF=   ; > >Oro   c                 (   dD ]} t          |           }|r|c S 	 t          t          d          5 }|                                                                }|r|cd d d            S 	 d d d            n# 1 swxY w Y   n# t
          $ r Y nw xY wd S )N)KAKAO_DASHBOARD_URLDASHBOARD_PUBLIC_URLKAKAO_LINK_URLr(   rJ   )r    rW   DASHBOARD_PUBLIC_URL_FILEr7   r   r   )r   r   r\   s      r   get_dashboard_linkr      s   Q  4   	LLL	+g>>> 	&KKMM''))E 	 	 	 	 	 	 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	    4s:   B *A6B *B 6A::B =A:>B 
BB   상세 보기button_titlec                   |                                  } | st          d          |pt                      pt          }t	          ||          }|t          k    rW|| vrSd| }dt          |          z
  }t          |           |k    r"| d |dz
                                           dz   } |  | } n2t          |           dk    r| d d                                         dz   } d| d	|  ||d
|dS )NzNo message text provided.)rq   u
   

상세: i     z...i  r   z

)web_urlmobile_web_url)object_typer   linkr   )r   ri   r   ru   r{   rU   rstrip)	r   r?   rp   r   rq   raw_link_urlsafe_link_urlsuffixmax_bodys	            r   build_messager      s.    ::<<D 64555C133C|L&|FVWWWM$$d)B)B///V$t99x(Q,'..0058D   	TSDSDz  ""U*$$d$$$+
 
 %  ro   intc            	        t          j                    } |                     dd           |                     dd           |                     dd           |                     d	d
           |                     dd           |                     dd           |                                 }|j        |j        nt
          j                                        }t          ||j	        |j
        |j        |j                  }|j        r&t          t          j        |dd                     dS 	 t#                      }t%          t&          dt          j        |d          idd| i          }n7# t(          $ r*}t+          d|j	        |t-          |                      d }~ww xY wt+          d|j	        ||           t          t          j        |d                     dS )Nz--titleu   US Equity Analyst 요약)defaultz	--messagez(Message text. If omitted, stdin is used.)helpz
--link-urlz*Button link URL. Overrides KAKAO_LINK_URL.z--button-titler   z--allow-local-link
store_true)actionz	--dry-run)rp   r   rq   F   )rM   indentr   template_objectrL   AuthorizationzBearer failuresuccess)argparseArgumentParseradd_argument
parse_argsmessagesysstdinr7   r   r?   rp   r   rq   dry_runprintr5   rZ   rn   r=   MEMO_URLr   r]   r	   )parserargsmessage_textr   rg   r   errors          r   mainr      s   $&&F
	+EFFF
*TUUU
+WXXX
(/BBB
,\BBB
L999D#'<#;4<<AQAQL#
&.  O | djuQGGGHHHq	'))
? O O OP6667
 

    y$*lCJJGGG 9dj,???	$*V%
0
0
01111s   4?E4 4
F(>%F##F(__main__)r   r	   r
   r   rt   )r!   r	   r"   r#   r$   r%   r
   r&   )
r>   r	   r?   r	   r   r	   r@   rA   r
   rB   )r
   r	   )F)rp   r   rq   rr   r
   r	   )r
   r   )Nr   F)r   r	   r?   r	   rp   r   r   r	   rq   rr   r
   r&   )r
   r   )#__doc__
__future__r   r   rP   rO   r5   r   r   r   urllib.parser,   urllib.requestr   rh   r   ru   r   ry   pathjoindirname__file__rX   r   r    r=   r]   rn   r{   r   r   r   __name__ri    ro   r   <module>r      s    # " " " " "       				     



         ! ! ! ! ! ! 2	A** ///7<<113IJJGLL)B)BD^__    6; ; ; ; ;       4       $  '"    >$ $ $ $N z
*TTVV

 ro   