
    .7`j                        S r SSKJr  SSKrSSKrSSKJr  SSKrSr\R                  " S5      r
SrSr/ S	QrS
r/ SQr " S S\5      r " S S\5      r " S S\5      r " S S\5      rSS jr " S S5      rg)u   HTTP-обёртка над TGStat API: ретраи, маскирование токена, классификация ошибок.    )annotationsN)Anyzhttps://api.tgstat.ruztoken=[^&\s]+      )      r      )   r	      c                      \ rS rSrSrg)TGStatError    N)__name__
__module____qualname____firstlineno____static_attributes__r       "/home/rasp/tgstat-puller/tgstat.pyr   r      s    r   r   c                      \ rS rSrSrSrg)LimitReachedError   u>   Месячный лимит запросов исчерпан.r   Nr   r   r   r   __doc__r   r   r   r   r   r      s    Hr   r   c                      \ rS rSrSrSrg)RateLimitError   zPer-second rate limit.r   Nr   r   r   r   r   r      s     r   r   c                      \ rS rSrSrSrg)NotFoundErrorr   u:   Канал/пост не найден или удалён.r   Nr   r   r   r   r    r       s    Dr   r    c                .    [         R                  SU 5      $ )Nz	token=***)TOKEN_REsub)ss    r   
mask_tokenr%   "   s    <<Q''r   c                      \ rS rSrSS.SS jjrSS jrSS jrSSS	S	S
S
S.               SS jjrSS jrS	S	SS
S.           SS jjr	S	S	SS.         SS jjr
Srg	)TGStatClient&   g333333?)delayc                   Xl         X l        g )N)_token_delay)selftokenr)   s      r   __init__TGStatClient.__init__'   s    r   c           	        0 UESU R                   0En[         SU 3nS nSnSn  [        R                  " X2[        S9nUR                  S:X  a<  U[        S-
  :  a$  [        R                  " [        U   5        US-  nM\  [        S	5      e UR                  5       n	U	R                  S5      S:X  a=  SU	;  a  [        SU SU	< 35      e[        R                  " U R$                  5        U	S   $ U	R                  S5      =(       d    U	R                  S5      =(       d    SR'                  5       n
SU
;   a  SU
;   a  [)        U
5      eSU
;   d  SU
;   a  [+        U
5      e[,        R.                  " SU
5      (       a  [        U
5      e[1        UR2                  5      n[        SU SU	< SU S35      e! [        R
                   aO  nUnU[        S-
  :  a)  [        R                  " [        U   5        US-  n S nAGM  [        SU SU 35      UeS nAff = f! [          a$  n[        S
U SUR"                  S S  35      UeS nAff = f)Nr.   /r   )paramstimeout   znetwork error on /z: i  zHTTP 429 rate limit hitznon-JSON response from /   statusokresponsezunexpected shape from /errormessage limitreachedz	not founddeletedz\brate\bzTGStat /z returned error: z (url=))r+   API_BASErequestsgetDEFAULT_TIMEOUTRequestExceptionNETWORK_RETRIEStimesleepNETWORK_BACKOFFSr   status_codeRATE_LIMIT_RETRIESRATE_LIMIT_BACKOFFSr   json
ValueErrortextr,   lowerr   r    researchr%   url)r-   methodr3   rS   last_excnetwork_attemptrate_limit_attemptrexcdatar:   safe_urls               r   _requestTGStatClient._request+   sD   1F1GT[[1
!F8$%)QLL_M }}#%(:Q(>>JJ23EFG&!+&$%>??`vvx xx!T)T)%(?xr$&RSS

4;;'J''XXg&C$((9*=CJJLE%I$6'..e#yE'9#E**yye,,$U++!!%%(H0A$PXzYZ[\\G ,, Q"_q%88JJ/@A#q(O!$6vhb"FGSPQ"  `!$<VHBqvvds|n"UV\__`s5   F. H .H1H:HH
IH==Ic                *    U R                  SSU05      $ )Nzchannels/get	channelIdr\   )r-   
channel_ids     r   channels_getTGStatClient.channels_getZ   s    }}^k:-FGGr   2   r   Nr5   )r=   offset
start_timeend_timehide_deletedextendedc               R    UUUUUS.nUb  XHS'   Ub  XXS'   U R                  SU5      $ )N)r_   r=   re   hideDeletedri   	startTimeendTimezchannels/postsr`   )	r-   ra   r=   re   rf   rg   rh   ri   r3   s	            r   channels_postsTGStatClient.channels_posts]   sJ     $' "
 !",; (9}}-v66r   c                *    U R                  SSU05      $ )Nz
posts/statpostIdr`   )r-   post_ids     r   
posts_statTGStatClient.posts_statu   s    }}\Hg+>??r      )rf   rg   r=   ri   c               N    UUUS.nUb  X&S'   Ub  X6S'   U R                  SU5      $ )N)r_   r=   ri   rl   rm   zchannels/mentionsr`   )r-   ra   rf   rg   r=   ri   r3   s          r   channels_mentionsTGStatClient.channels_mentionsx   sD     $ "

 !",; (9}}0&99r   day)
start_dateend_dategroupc               J    XS.nUb  X%S'   Ub  X5S'   U R                  SU5      $ )N)r_   r|   	startDateendDatezchannels/subscribersr`   )r-   ra   rz   r{   r|   r3   s         r   channels_subscribers!TGStatClient.channels_subscribers   s:     0:!J!",; (9}}3V<<r   )r,   r+   )r.   strr)   floatreturnNone)rT   r   r3   zdict[str, Any]r   r   )ra   r   r   dict)ra   r   r=   intre   r   rf   
int | Nonerg   r   rh   r   ri   r   r   r   )rr   r   r   r   )ra   r   rf   r   rg   r   r=   r   ri   r   r   r   )
ra   r   rz   r   r{   r   r|   r   r   r   )r   r   r   r   r/   r\   rb   rn   rs   rw   r   r   r   r   r   r'   r'   &   s   58 -]^H !%#77 	7
 7 7 7 7 7 
70@ "&#:: 	:
 : : : 
:0 "&#== 	=
 = = 
= =r   r'   )r$   r   r   r   )r   
__future__r   rQ   rG   typingr   rB   rA   compiler"   rD   rF   rI   rK   rL   	Exceptionr   r   r   r    r%   r'   r   r   r   <module>r      s    K " 	   "::&'   	) 	I I![ !EK E(s= s=r   