
    Odj                        S r SSKJr  SSKJrJrJr  SSKJr  SSKrSr	Sr
SrS	rS
rSSS.rSSS.r " S S\5      r " S S\5      rSS jrSS jrSS jrSS jr S   SS jjr S SS jjrg) u  Долгоживущие токены Meta: обновление и предупреждение о протухании.

Токен живёт 60 дней и обновляется одним запросом — но только пока он ещё жив.
Пропустить окно значит идти переавторизовываться руками через браузер, поэтому
рефреш делается заранее, а не в последний день.
    )annotations)datetime	timedeltatimezone)CallableN<   2   5         z0https://graph.instagram.com/refresh_access_tokenz.https://graph.threads.net/refresh_access_token)	instagramthreadsig_refresh_tokenth_refresh_tokenc                      \ rS rSrSrSrg)RefreshFailedError   u0   Обновить токен не удалось. N__name__
__module____qualname____firstlineno____doc____static_attributes__r       /home/rasp/meta-puller/auth.pyr   r      s    :r   r   c                      \ rS rSrSrSrg)NoTokenError"   ur   Токена нет в базе — нужна первичная авторизация через setup_auth.py.r   Nr   r   r   r   r   r   "   s    |r   r   c                N    [         R                  " U R                  SS5      5      $ )NZz+00:00)r   fromisoformatreplace)moments    r   _parser&   &   s    !!&..h"?@@r   c                R    [        U5      [        U 5      -
  R                  5       S-  $ )NQ )r&   total_seconds	issued_atnows     r   	_age_daysr-   *   s$    3K&++::<uDDr   c                &    [        X5      [        :  $ N)r-   REFRESH_AFTER_DAYSr*   s     r   needs_refreshr1   .   s    Y$(:::r   c                &    [        X5      [        :  $ r/   )r-   ALARM_AFTER_DAYSr*   s     r   token_alarmr4   2   s    Y$(888r   c           	        SSK nUb  UO[        S5      R                  nU=(       d    [        n[        U   nSn[        [        5       GH  n	 UR                  U[        U   US.SS9n
U
R                  5       nUR                  S5      nU(       am  [        U5      [        UR                  S	[        S
-  5      S9-   R                  [        R                  5      R!                  S5      nUR#                  XUX=S9  Us  $ [%        UR                  S5      =(       d    0 R                  SS5      5      R'                  US5      nU	[        S-
  :  d  GM  U" [,        SU	-  -  5        GM     [/        SR1                  X5      5      e! [        R(                  [*        4 a%  n[%        U5      R'                  US5      n SnAN{SnAff = f)u   Меняет живой токен на свежий. Старый в базе не трогает, пока не получен новый.r   Ntime )
grant_typeaccess_tokenr   )paramstimeoutr9   
expires_inr(   )secondsz%Y-%m-%dT%H:%M:%SZ)r+   
expires_aterrormessageu   ответ без access_tokenz***   r   z{}: {})db
__import__sleeprequestsREFRESH_URLSrangeMAX_RETRIESgetGRANT_TYPESjsonr&   r   TOKEN_TTL_DAYS
astimezoner   utcstrftime
save_tokenstrr$   RequestException
ValueErrorBACKOFF_BASE_SECONDSr   format)db_pathplatformtokenr,   rD   session	db_moduleurl
last_errorattemptresppayload	new_tokenr>   excs                  r   refreshrb   6   s    &EJv,>,D,DE!G
x
 CJ%	T;;s)(3U,LUW  YDiikG  N3I$SkI#KKnu6LM-O O*X\\*884H+I  $$W	/2 % K  gkk'28b==;= >>EgeU>S [1_$&!w,78' &( X__XB
CC )):6 	8S))%7J	8s   +FG F;;G c           	     |   SSK nUR                  X5      nUc  [        SR                  X5      5      eUS   US   p[	        X5      (       d  US4$  [        XXrX4S9S4$ ! [         aS  n	[        X5      (       a5  [        [        X5      -
  n
USR                  X[        U
5      U5      4s Sn	A	$ US4s Sn	A	$ Sn	A	ff = f)u  Отдаёт рабочий токен и, если пора тревожиться, текст предупреждения.

Неудачный рефреш сам по себе не повод падать: старый токен ещё живой, а
следующий прогон попробует снова. Кричим, только когда запас подходит к
концу — чтобы осталось время переавторизоваться руками.
r   Nuq   нет токена для {} — пройди первичную авторизацию: python setup_auth.py {}rX   r+   )rD   rY   u   токен {} не обновляется ({}), протухнет через {} дн. — нужна переавторизация: python setup_auth.py {})rB   
load_tokenr   rU   r1   rb   r   r4   rL   r-   int)rV   rW   r,   rD   rY   rZ   rowrX   r+   ra   	days_lefts              r   ensure_tokenrh   V   s     


w
1C
{&&,fX&@B 	B 7|S%59((d{	w%ESUYYY y&&&9)BBIUU[U[3y>8V=> > d{s*   A 
B;(?B6'B;-B60B;6B;)r%   rQ   returnr   )r+   rQ   r,   rQ   ri   float)r+   rQ   r,   rQ   ri   bool)NN)
rW   rQ   rX   rQ   r,   rQ   rD   Callable[[float], None]ri   rQ   )rW   rQ   r,   rQ   rD   rl   )r   
__future__r   r   r   r   typingr   rE   rL   r0   r3   rH   rT   rF   rJ   RuntimeErrorr   r   r&   r-   r1   r4   rb   rh   r   r   r   <module>rp      s    # 2 2      D?
 $!; ;}< }AE;9
 <@D*DDGDB AE/r   