
    iT^                       S r SSKJrJrJr  SSKJrJrJr  SSK	J	r	J
r
  SSKrSSKrSr\S	-   r " S
 S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S  S!\5      r " S" S#\5      r " S$ S%\5      r " S& S'\5      r " S( S)\5      r " S* S+\5      r " S, S-\5      r  " S. S/\5      r! " S0 S1\5      r" " S2 S3\5      r# " S4 S5\5      r$ " S6 S7\5      r% " S8 S9\5      r& " S: S;\5      r' " S< S=\5      r( " S> S?5      r)\	" S@SSA9SB 5       r*g)CzExtractors for https://x.com/   )	ExtractorMessageDispatch   )textutil	exception)cachememcache    NzM(?:https?://)?(?:www\.|mobile\.)?(?:(?:[fv]x)?twitter|(?:fix(?:up|v))?x)\.comz
/([^/?#]+)c                       \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S  r"S! r#S" r$S# r%S$r&g%)&TwitterExtractor   z!Base class for twitter extractorstwitter)
{category}z{user[name]}z{tweet_id}_{num}.{extension}z{tweet_id}_{retweet_id}_{num}z.x.com)
auth_tokenzhttps://x.comfirefoxc                 D    [         R                  " X5        US   U l        g )Nr   )r   __init__userselfmatchs     I/app/mltbenv/lib/python3.13/site-packages/gallery_dl/extractor/twitter.pyr   TwitterExtractor.__init__!   s    4'!H	    c                    U R                  SS5      U l        U R                  SS5      U l        U R                  SS5      U l        U R                  SS5      U l        U R                  SS5      U l        U R                  SS5      U l        U R                  S	S5      U l        U R                  S
S5      U l        U R                  SS5      U l	        U R                  SS5      U l
        U R                  S5      U l        U R                  SS5      U l        U R                  SS5      U l        U R                  S:H  U l        U R                  =(       d    U R                  U l        U R                  SS5      (       d#  [         R"                  =U l        =U l        U l        S U l        S U l        S U l        0 U l        U R3                  5         g )NunavailableFztext-tweetsarticlesTretweetsrepliestwitpicpinnedquotedadscardszcards-blacklistvideospreviewsytdl	transform)configr   textonlyr   r    r!   r"   r#   r$   r%   r&   cards_blacklistvideos_filesvideos_previewsvideos_ytdlr'   r   identity_transform_community_transform_tweet_transform_user_cursor_user	_user_obj_user_cache_init_sizesr   s    r   _initTwitterExtractor._init%   sx   ;;}e<M59J5J6{{9d3{{9e4kk(E2kk(E2;;ue,[[%0
#{{+<= KK$7#{{:u=,,6''?4+?+?{{;-- (,}}5D% 5%$
r   c                     U R                  S5      nUc  SU l        SU l        g [        U[        5      (       a  UR                  S5      nUS   U l        USS  U l        g )Nsizeorig)	4096x4096largemediumsmall,r   r   )r+   _size_image_size_fallback
isinstancestrsplit)r   r>   s     r   r9   TwitterExtractor._init_sizesA   sY    {{6"<%D"KD$$$zz##AwD"&qr(Dr   c              #     #    U R                  5         [        U 5      U l        U R                  5       nU R	                  SS5      (       a
  [        5       OS nU R                  (       a%  [        R                  " S5      R                  U l
        U R                  5       nU R	                  S5      (       a  U R                  U5      nU GH  nSU;   a  US   nOUnU R                  (       d'  SU;   a!  U R                  R                  SUS   5        MJ  U R                   (       d'  S	U;   a!  U R                  R                  S
US   5        M  SU;   an  U R"                  (       a<  U R"                  S:X  aM  US   U R$                  (       a  U R&                  S   OUS   :w  a!  U R                  R                  SUS   5        M  Ub?  US   U;   a"  U R                  R                  SUS   5        GM$  UR)                  US   5        SU;   aQ  UR+                  S5      =(       d    UR+                  S5      =(       d    SnU R                  R-                  SXeS   5        U R/                  XT5      nU(       d  U R0                  (       d  GM  U R3                  U5      nUR5                  U5        [7        U5      US'   [8        R:                  SU4v   UR=                  SS 5        UR=                  SS 5        UR=                  SS 5        [?        US5       H[  u  US'   n	U	R5                  U5        U	R=                  S5      n
SU	;  a  [        R@                  " X5        [8        RB                  X4v   M]     GM     g 7f)NuniqueTz&https?(://twitpic\.com/(?!photos/)\w+)expandlegacyretweeted_status_id_strzSkipping %s (retweet)id_strquoted_by_id_strzSkipping %s (quoted tweet)in_reply_to_user_id_strr   user_id_strrest_idzSkipping %s (reply)zSkipping %s (previously seen)withheld_scope	full_textr    z	'%s' (%s)count	source_idsource_usersensitive_flagsr   numurl	extension)"login
TwitterAPIapimetadatar+   setr"   r   refindall_find_twitpictweets_expand_tweetsr    logdebugr$   r!   r6   r7   addgetwarning_extract_filesr,   r3   updatelenr   	Directorypop	enumeratenameext_from_urlUrl)r   rb   seen_tweetsrg   tweetdatatxtfilestdatafiler]   s              r   itemsTwitterExtractor.itemsL   s    

d#==?#{{8T::ce<<!%9";;B7  ;;x  ((0FE5 X==%>$%F6XG;;#5#=;T(^L(D0LLLLF*'26**T^^I.346
 4d8nE&>[0HHNN7hIX/4'hh{+Etxx/?E2  c>B''4E))%0ELL" ZE'N##R..IIk4(IImT*II'.&/q&9"edE"hhuod*))#4kk3,, ':a s   M*M,c                 t   / nSU;   a   U R                  XS   S   U5        U R                  (       a  SU;   a   U R                  X#5        U R                  (       a  SU;   a   U R                  X#5        U R                  (       a   U R                  X5        U$ U$ ! [         aZ  nU R                  R                  U5        U R                  R	                  SUS   UR
                  R                  U5         S nANS nAff = f! [         a[  nU R                  R                  U5        U R                  R	                  SUS   UR
                  R                  U5         S nAGNS nAff = f! [         a[  nU R                  R                  U5        U R                  R	                  SUS   UR
                  R                  U5         S nAGNVS nAff = f! [         a[  nU R                  R                  U5        U R                  R	                  S	US   UR
                  R                  U5         S nAU$ S nAff = f)
Nextended_entitiesmediaz/%s: Error while extracting media files (%s: %s)rP   cardz.%s: Error while extracting Card files (%s: %s)articlez1%s: Error while extracting article files (%s: %s)z1%s: Error while extracting TwitPic files (%s: %s))_extract_media	Exceptionri   	tracebackrm   	__class____name__r&   _extract_cardr   _extract_articler"   _extract_twitpic)r   rx   rw   rz   excs        r   rn   TwitterExtractor._extract_files   s   $&A##23G<eE ::&E/A""50 ==Y%/A%%e3 <<A%%d2 uC  A""3'  ENCMM$:$:CA AA  A""3'  DNCMM$:$:CA AA  A""3'  GNCMM$:$:CA AA  A""3'  GNCMM$:$:CA A Asb   B D #E* G 
C?%AC::C?
E'AE""E'*
G4AG

G
H7AH22H7c                 f   S nU GH  nSU;   ao  US   n/ nSU;   a  UR                  S5        SU;   a  UR                  S5        SU;   a  UR                  S5        Uc  [        U5      nOUR                  U5        UnOSnS	U;   a\  US	   nUR                  S
5      S:X  aB  U R                  R                  SUS   UR                  S5      5        U R                  (       d  M  SU;   Ga  U R                  (       a  SU R                   SUS    3n	U	SS.n
OSU R                  (       a@  US   n[        US   S S9nUS   UR                  SS5      UR                  SS5      S-  S.n
OS n
U
b~  UR                  S5      U
S'   US   R                  SS5      U
S'   US   R                  S S5      U
S '   UR                  S!5      U
S"'   XjS#'   U R                  X5        UR                  U
5        U R                  (       d  GM  S$US'   S%U;   a{  US%   n	U	S&   S':X  a   U	R                  S'5      u  pnUS(U-   S)-   -  nOU	R                  S*5      S   S*-   n[        R                  " U	XR                   -   U R#                  U5      S+.5      n
OUR                  SUS,   05        GM  UR                  S5      U
S'   US   R                  SS5      U
S'   US   R                  S S5      U
S '   UR                  S!5      U
S"'   XjS#'   U R                  X5        UR                  U
5        GM     Uc  SO
[%        U5      US#'   g )-Nsensitive_media_warningadult_contentNudityother	Sensitivegraphic_violenceViolence ext_media_availabilitystatusUnavailablezMedia unavailable (%s - '%s')rP   reason
video_infoytdl:/i/web/status/mp4)r]   r^   variantsc                 &    U R                  SS5      $ )Nbitrater   )rl   )vs    r   <lambda>1TwitterExtractor._extract_media.<locals>.<lambda>   s    aeeIq&9r   )keyr]   r   r   duration_millis  )r]   r   durationtypeoriginal_infowidthheightext_alt_textdescriptionr[   previewmedia_url_https.?format=&name==)r]   	_fallback	media_url)appendrc   ro   rl   ri   rm   r   r0   rootr.   max_extract_media_sourcer/   
rpartitionr   rt   rE   _image_fallbacksorted)r   rw   entitiesrz   flags_tweetr   flags_mediaflagsextr]   r|   r   variantbase_fmts                   r   r   TwitterExtractor._extract_media   s]   E(E1#$=>"k1LL*k)LL-%4LL,&"%e*K&&u-# '5045778$5HH$$%D%*8_cggh6GI++ u$##!$))N5?:KLC#&U;D&&!&|!4J!":.9G
 %,EN$+KK	1$=$.NN-q%248%9D  D##(99V#4DL$)/$:$>$>w$JDM%*?%;%?%?!%LDN*/))N*CD'.9*+..t;LL&++ )f E)-.r7c>#&>>##6LDSJ,x77D>>#.q1C7D,,S!%(8(8!8!%!5!5d!;3 
 eU;%789 99V,DL!/266wBDM"?377!DDN"'))N";D&1"#&&t3LLe j %B6++> 	 r   c                     SUS'   SU;   a>   [         R                  " US   5      US'   U R                  US   S   S   S   5      US'   g g ! [         a     g f = f)Nr   rY   source_status_id_stradditional_media_inforZ   user_resultsresult)r   	parse_intr4   r   )r   destr   s      r   r   &TwitterExtractor._extract_media_source  s    [!U*$(NN01%3[!&*&:&:12=A#%%-/'0]#	 +  s   <A 
AAc              #   >   #    U R                    H	  nX-   v   M     g 7fN)rF   )r   r   r   s      r   r    TwitterExtractor._image_fallback!  s     &&C* 's   c                     US    Hc  nUS   U   nUS   R                  S5      =(       d    S H7  nUR                  S5      =(       d    S H  nUR                  SU05        M     M9     Me     g )N
componentscomponent_objectsrx   conversation_previewr   	mediaUrlsr]   rl   r   )r   rw   rx   rz   component_idcomconvr]   s           r   _extract_components$TwitterExtractor._extract_components%  sm     .L*+L9CF(>?E2E88K06B6CLL%. 7 F /r   c                    US   nSU;   a  US   nUS   R                  S5      S   nUS   n[        U[        5      (       a  US    Vs0 s H  nUS   US   _M     nnU R                  =n(       a&  XG;   a  g S	U;   a  US	   S
   nX;   d  US-   U-   U;   a  g US;   a  S H  n	S H  n
X-   nX;   d  M  X[   R	                  S5      nU(       d  M*  SU;   d  M2  US   R                  S5      u  pn
U(       a)  X-  nXR
                  -   US'   U R                  U5      US'   UR                  U5            g    M     OdUS:X  a^  [        R                  " US   S
   5      nSU;   a#  U R                  XS   R                  5       U5        SU;   a  U R                  XU5        g U R                  S:X  aC  UR	                  S5      =(       d    US   nSU R                   SU 3nUR                  SU05        g g s  snf )Nr   rN   name:r   binding_valuesr   value
vanity_urlstring_value)summarysummary_large_image)photo_image_full_size_summary_photo_image_thumbnail_image_)originalx_largerA   rC   image_valuer]   r   r   unified_cardmedia_entitiesr   r)   rT   rP   r   r   )r   rG   listr-   rl   rE   r   r   r   
json_loadsr   valuesr   r&   r   )r   rw   rz   r   r   bvalsbvalcbldomainprefixr>   r   r   r   seprx   tweet_idr]   s                     r   r   TwitterExtractor._extract_card,  s(   V}t>DF|&&s+A.%&eT""!%&6!79!7 %[$w-/!7  9 &&&3&{u$|,^<=D3J$73$>55/ FD -C| %
} = 5Ue^.3El.E.Eh.OODt" $/36F6F/Fe595I5I$5Ok 2!LL/" F/ ^#??5#8#HID4'## 0188:EC"d*((e<::yy+>uXH$))N8*=CLL%&  I9s   	G0c           
         US   S   S   nUR                  S5      =n(       a,  US   nUR                  US   US   US   US	   US
   SS.5        US    H/  nUS   nUR                  US   US   US   US	   US
   SS.5        M1     g )Nr   article_resultsr   cover_media
media_infomedia_id	media_keyoriginal_img_urloriginal_img_widthoriginal_img_heightzarticle:cover)r   r   r]   r   r   r   r   r   )r   rw   rz   r   r   infos         r   r   !TwitterExtractor._extract_article]  s    	"#45h?KK..5.&DLL":.";/!"45!"67!"78,  -.E&DLL":.";/!"45!"67!"78,  /r   c                    0 nUS   R                  S5      =(       d    S Hl  nUR                  S5      =(       d    UR                  S5      =(       d    SnU(       a  SU;  d  SU;   a  MJ  UR                  S	5      (       a  S
USS  -   nS X4'   Mn     U R                  UR                  S5      =(       d    UR                  S5      =(       d    S5       H  nS US
U-   '   M     U Hc  nU R                  USS9nUR                  S:  a  M%  [
        R                  " UR
                  SS5      =n(       d  MP  UR                  SU05        Me     g )Nr   urlsr   expanded_urlr]   rW   z//twitpic.com/z/photos/zhttp:https   rV   r   F)fatal  zname="twitter:image" value="")rl   
startswithrf   requeststatus_coder   extrr   )r   rw   rz   r  r]   responses         r   r   !TwitterExtractor._extract_twitpicv  s2    $((06B6C''.)ASWWU^ArC*#5s9J~~g&&AB'DI 7 %%		+&A%))F*;ArCC"&D3C
 C||Cu|5H##s*iiMM#A3H Hs HeS\* r   c                 
	   SU;   a  US   nOUn[        US   5      nSU;   a  US   nOSU;   a   US   S   S   nOUS   nU R                  U5      nUS	:  a  U R                  US
-	  S-   S-  5      nO U R                  US   S5      nUR                  S5      nUR                  n0 SU_S[        R                  " U" S5      5      _S[        R                  " U" S5      5      _S[        R                  " U" S5      5      _S[        R                  " U" S5      5      _SS_SU_SU_SU R                  =(       d    U_SUS   _SU(       a  [        R                  " USS5      OS_S U" S!5      _S"U" S"5      _S#U" S#5      _S$U" S$5      _S%U" S%5      _S&U" S&5      _S'U" S'5      0EnS(U;   a   [        US(   S)   5      US*'   OSUS*'   S+U;   a  US+   S,   S   n	U	S-   n
U	S.   nO%U" S/5      =(       d    U" S-5      =(       d    Sn
US0   nS1U;   a  U R                  US1   S2   S   5      US3'   UR                  S45      =n(       a  U Vs/ s H  oS-   PM	     snUS4'   UR                  S55      =n(       a7  U Vs/ s H&  n[        R                  " US   5      US6   US7   S8.PM(     snUS9'   [        R                   " U
5      n
UR                  S:5      =n(       a"  U H  n U
R#                  US;   US<   5      n
M     U
R%                  S=5      u  nnnUR'                  S>5      (       a  UOU
US?'   S@U;   a  SAUS@'   SBU;   a   USB   SC   S-   USD'   SFU;   a  USF   USG'   SHU;   a  USH   USI'   SJU;   a  U R+                  XSJ   SK   S   5        US   (       a1  SLUS7    SMUS?    3US?'   U R                  US   S
-	  S-   S-  5      USN'   U$ ! [         a0    U R                  R                  SU5        [        R
                  n GNf = f! [         a    [        R
                  n GNf = f! [         a	    SUS*'    GNnf = fs  snf s  snf ! [         a     GMw  f = f! [         a#    U R                  R)                  SEUSB   5         GN5f = f)ONrN   rP   authorcorer   r   z%s: Missing 'author' datar   l    @bdC r      )r   
created_at%a %b %d %H:%M:%S %z %Ysourcer   
retweet_idrO   quote_idrQ   reply_idin_reply_to_status_id_strconversation_idconversation_id_strrY   r   datelang><rW   	sensitivepossibly_sensitiver[   favorite_countquote_countreply_countretweet_countbookmark_countviewsrX   
view_count
note_tweetnote_tweet_resultsr   
entity_setrV   r   author_community_relationshipcommunity_results	communityhashtagsuser_mentionsscreen_namer   )idr   nickmentionsr  r]   r   zhttps://t.co/contentr#   Tbirdwatch_pivotsubtitle	birdwatchz*Unable to extract 'birdwatch' note from %sin_reply_to_screen_namereply_to	quoted_byquote_byr   r   zRT @z: date_original)intKeyErrorri   rm   r   NONEr4   parse_timestampparse_datetimer   rl   r   r   r6   r  r2   unescapereplacer   r  rj   r   )r   rw   rN   r   r  r!  r  tgetr{   noter;  r   r4  tr9  ur  r]   ry   r   tcos                        r   r3   !TwitterExtractor._transform_tweet  s   u8_FFvh'(u8_Fu_#v~6x@
 6]F%%f-**''b.$55=?D!**<(*CE 8$zz
h
dnn./1
 dnn'(*	
 dnn013
 t~~*+ -
 a
 d
 f
 djj2F
 fVn
 VdiiS9
  d#78!
" t$56#
$ d#34%
& d=1'
( d=1)
* d?3+
, d#34-
2 e(&)%.*A&Bl# #$E,5 &';<XFD6lGL)H;'=4<=2Gj)H*e3!%!:!:56$&&.0"1E+  ||J//8/4< =Hq6H =E*||O4484
  	!!  ! nnQx[1-(&	"  	!!E* --(<<''4'%ooc%j#n:MNG 
 ((-Q"%.."A"A3wiu"E(O%9+,Z8@ k"
 %. &'@ AE*&  &{ 3E*&(&&127;A>@!%fVn%5Ri8H7IJE)%)%9%9%+/@@DH&JE/" U  #  !<hG#  !yy!B  (&'l#(& !>!!     9K$%6799se   O 4P -P# P97-P>Q>Q 6O?>O?P P #P65P6
QQ)RRc                     UR                  S5      =(       d    US   n U R                  SU 3   $ ! [         a    0 s $ f = f! [         a     Of = fS =n=pE UR                  S5      =n(       a  US   S   S   nO! [         a     Of = f UR                  S5      =n(       a  US   S   S   nO! [         a     Of = f UR                  S	5      =n(       a  US
   S   nO! [         a     Of = f[        R
                  " U5      UR                  S5      UR                  S5      U R                  UR                  SS5      S-  5      UR                  S5      UR                  S5      UR                  S5      UR                  SS5       Vs/ s H  owS   PM	     Os  snf snUUUS.=U R                  SU 3'   nU$ )NrP   rT   zC#admin_resultsr   r  r6  creator_resultscustom_banner_mediar   r  r   r   r  r   r   is_nsfwrolemember_countrulesr   )r7  r   r   r!  nsfwrV  rW  rX  admincreatorbanner)rl   rE  r8   r   r   r   rG  )	r   r   cidrZ  r[  r\  resultsrulecdatas	            r   r2   %TwitterExtractor._transform_community  s   	''(#5s9~C	##bJ//	  	I	
  		 $(''	''/22w2)&1-@ 			''"344w4!(+F3MB 			''"788w8 ./AB 		 ..%GGFO77=1((q)AD)HIGGI&GGFOGGN3/2www/CD/Ct6l/CD0
 	
2cU$u s\   2 A A A
AA#A> >
B
B#B3 3
C ?C  C% %
C21C2F c                     UR                  S5      =(       d    US   n U R                  U   $ ! [         a    0 s $ f = f! [         a     Of = fSU;   a  US   nUS   nOU=p4UR                   nU" S5      (       a"  U R                  R	                  SU" S5      5        US   n[
        R                  " U5      UR                  S	5      UR                  S
5      U R                  US   S5      U" SS5      U" S5      U" S5      U" S5      U" S5      U" S5      U" S5      S.=U R                  U'   nSU;   aV  US   R                  S5      US'   US   S   US'   US   S   US'   US   R                  SS5      R                  SS5      US'   O0US   US'   US   US'   US   US'   US    R                  SS5      US'   US   nUS   R                  S!5      =n	(       a3  U	 H-  n
 UR                  U
S"   U
S#   5      nM  ! [         a     M+  f = f   XS'   S"U;   a7  US"   S!   S$   n
U
R                  S#5      =(       d    U
R                  S"5      US"'   U$ )%NrT   rP   r  rN   rU   z'%s'r   r   r6  r   r  r  profile_banner_urlrW   favourites_countfollowers_countfriends_countlisted_countmedia_countstatuses_count)r7  r   r8  r!  profile_bannerrd  re  rf  rg  rh  ri  locationverificationverifiedprivacy	protectedavatar	image_url_normal.r   profile_imageprofile_image_url_httpsr  r]   r  r   )	rl   rE  r8   ri   rm   r   r   rH  rJ  )r   r   uidr  rN   lgetr   udatadescrr  r]   s              r   r4    TwitterExtractor._transform_user4  s   	((9%7hC
	##C((  	I	  		 T><D(^F  Dzz !!HHVT-%89*% $s 3 $ 7 $ 0 $ 3 3\"$=!? $%92 > $%7 8 $%6 7 $_ 5 $^ 4 $] 3 $%5 6)
 	
 T> $Z 0 4 4Z @E* $^ 4Z @E*!%i!=E+%)(^%7%7R&!!(S!9 /" !%Z 0E* $Z 0E*!%k!2E+%)*C%D%L%LC&!E/" }%M*..v6646!MM#e*c.6IJE  
  %mH5/&)!,C77>2DcggenE%Ls/   / A >>
AA$G>>
HHc                 <    Xl         U R                  U5      U l        g r   )r7   r4   r6   )r   r   s     r   _assign_userTwitterExtractor._assign_userv  s    ))$/
r   c              #     #    U R                  S5      nU(       a  US:X  a   [        nU R                  S-   R                  nOUS:X  a   [        nU R                  S-   R                  nOZUS:X  a   [
        nU R                  S-   R                  nO4US:X  a   [        nU R                  S	-   R                  nOS nUR                  nU H"  nX5S
'   [        R                  U" U5      U4v   M$     g 7f)Nusersr   z/i/user/{rest_id}timelinez/id:{rest_id}/timeliner   z/id:{rest_id}/mediarg   z/id:{rest_id}/tweets
_extractor)	r+   TwitterUserExtractorr   
format_mapTwitterTimelineExtractorTwitterMediaExtractorTwitterTweetsExtractorr   Queue)r   r~  userfmtclsr   r   s         r   _users_resultTwitterExtractor._users_resultz  s     ++g&'V+&C9922>>C
"*C9977CCC'C9944@@C (C9955AACC$$CD!$--TD00 s   C(C*c              #     #    [        5       nU H  nSU;   a  US   OUnUR                  S5      nU(       d-  USL a  Uv   O!US   nU R                  R                  SU5        MU  XR;   a  U R                  R	                  SU5        Mx  UR                  U5         U R                  R                  U5       S h  vN   M     g  N	! [         a    Uv    M  f = f7f)NrN   r   FrP   z*Unable to expand %s (no 'conversation_id')z*Skipping expansion of %s (previously seen))	rc   rl   ri   rm   rj   rk   ra   tweet_detailr   )r   rg   seenrw   objr]  tids          r   rh   TwitterExtractor._expand_tweets  s     uE%-%6%/EC''/0C%<Kh-CHH$$DcK{@#GHHSM8800555# " 6 s<   BCC7C8C<CCCCCCc           
      "    USS US0 S0 US./0S.$ )NFz><r   )r   r   )rP   r   r"  r   r  r   r   r   r   r   r]   rP   s       r   _make_tweetTwitterExtractor._make_tweet  s6    #()+%("
 	
r   c                     U R                  SS5      nU(       d  [        R                  U l        g [	        U[
        5      (       a  U$ g )NcursorT)r+   r   r1   _update_cursorrG   rH   r   r  s     r   _init_cursorTwitterExtractor._init_cursor  s8    Xt,"&--D$$M %r   c                 J    U R                   R                  SU5        Xl        U$ Nz
Cursor: %s)ri   rj   r5   r  s     r   r  TwitterExtractor._update_cursor  s    |V,r   c                     0 $ )zReturn general metadatar   r:   s    r   rb   TwitterExtractor.metadata  s    	r   c                     g)z Yield all relevant tweet objectsNr   r:   s    r   rg   TwitterExtractor.tweets  s    r   c                 t    U R                   (       a'  U R                  R                  SU R                   5        g g )NzDUse '-o cursor=%s' to continue downloading from the current position)r5   ri   r  r:   s    r   finalizeTwitterExtractor.finalize  s+    <<HHMM 67;||E r   c                     U R                  U R                  5      (       a  g U R                  5       u  pU(       a  U R                  [	        XU5      5      $ g r   )cookies_checkcookies_names_get_auth_infocookies_update_login_impl)r   usernamepasswords      r   r_   TwitterExtractor.login  sM    d0011!002&&{48'LMM r   )r5   rf   rF   rE   r2   r3   r4   r  r6   r8   r7   r%   ra   r   r&   r-   r#   r$   r!   r    r,   r"   r   r   r'   r.   r/   r0   N)'r   
__module____qualname____firstlineno____doc__categorydirectory_fmtfilename_fmtarchive_fmtcookies_domainr  r   browserr   r;   r9   r}   rn   r   r   r   r   r   r   r   r3   r2   r4   r{  r  rh   r  r  r  rb   rg   r  r_   __static_attributes__r   r   r   r   r      s    +H2M1L1KN#MDG8	+B-H(TX?t//'b2+4vp*X@D01,.
$
/E
Nr   r   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	TwitterHomeExtractori  z$Extractor for Twitter home timelineshomez(/home(?:/fo(?:llowing|r[-_ ]?you()))?/?$zhttps://x.com/homec                     U R                   S   c  U R                  R                  5       $ U R                  R                  5       $ )Nr   )groupsra   home_latest_timelinehome_timeliner:   s    r   rg   TwitterHomeExtractor.tweets  s6    ;;q>!880022xx%%''r   r   Nr   r  r  r  r  subcategoryBASE_PATTERNpatternexamplerg   r  r   r   r   r  r    s    .KHHG"G(r   r  c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	TwitterNotificationsExtractori  z-Extractor for Twitter notifications timelinesnotificationsz/(?:notifications|i/timeline())zhttps://x.com/notificationsc                 6    U R                   R                  5       $ r   )ra   notifications_devicefollowr:   s    r   rg   $TwitterNotificationsExtractor.tweets  s    xx2244r   r   Nr  r   r   r   r  r    s    7!K??G+G5r   r  c                   6    \ rS rSrSrSr\S-   rSrS r	S r
Srg	)
TwitterSearchExtractori  z$Extractor for Twitter search resultssearchz!/search/?\?(?:[^&#]+&)*q=([^&#]+)zhttps://x.com/search?q=QUERYc                 F    S[         R                  " U R                  5      0$ )Nr  )r   unquoter   r:   s    r   rb   TwitterSearchExtractor.metadata  s    $,,tyy122r   c                    [         R                  " U R                  R                  SS5      5      nS nUR	                  5        H<  nUR                  S5      nUR                  S5      (       d  M,  U(       a  S n  O	USS  nM>     Ub+   U R                  U R                  R                  U5      5        U R                  R                  U5      $ ! [         a     N'f = f)N+r:  z()from:   )r   r  r   rJ  rI   stripr  r{  ra   user_by_screen_namerE  search_timeline)r   queryr   items       r   rg   TwitterSearchExtractor.tweets  s    TYY..sC89KKMD::d#Dw''D8D " !!$((">">t"DE xx''..  s   *C 
CCr   N)r   r  r  r  r  r  r  r  r  rb   rg   r  r   r   r   r  r    s$    .KAAG,G3/r   r  c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	TwitterHashtagExtractori  zExtractor for Twitter hashtagshashtagz/hashtag/([^/?#]+)zhttps://x.com/hashtag/NAMEc              #   z   #    U R                    SU R                   3nS[        0n[        R                  X4v   g 7f)Nz/search?q=%23r  r   r   r  r   r  r   r]   rx   s      r   r}   TwitterHashtagExtractor.items  s7     =445mmS&&   9;r   Nr   r  r  r  r  r  r  r  r  r}   r  r   r   r   r  r    s    (K22G*G'r   r  c                   ,    \ rS rSrSr\S-   rSrS rSr	g)r  i  zExtractor for a Twitter userz@/(?:([^/?#]+)/?(?:$|\?|#)|i(?:/user/|ntent/user\?user_id=)(\d+))zhttps://x.com/USERc                 *   U R                   u  pUb  SU-   nU R                   SU S3nU R                  [        US-   4[        US-   4[
        US-   4[        US-   4[        US-   4[        US-   4[        US	-   4[        US
-   4[        US-   44	S5      $ )Nid:/r  photoheader_photor  rg   r   with_replies
highlightslikes)r  )r  r   _dispatch_extractorsTwitterInfoExtractorTwitterAvatarExtractorTwitterBackgroundExtractorr  r  r  TwitterRepliesExtractorTwitterHighlightsExtractorTwitterLikesExtractor)r   r   user_idr   s       r   r}   TwitterUserExtractor.items"  s    7?D))AdV1%((!7#8')>?%
):;#9"8$)>?')<="8
*
 
 
	r   r   N)
r   r  r  r  r  r  r  r  r}   r  r   r   r   r  r    s     & : :G #Gr   r  c                   B    \ rS rSrSrSr\S-   rSrS r	S r
S rS	 rS
rg)r  i5  z%Extractor for a Twitter user timeliner  z/timeline(?!\w)zhttps://x.com/USER/timelinec                 t    U R                   (       a'  U R                   R                  S5      S   =(       d    S $ g )Nr  r   )r5   	partitionr:   s    r   r  %TwitterTimelineExtractor._init_cursor;  s+    <<<<))#.q19T9r   c                     U(       a<  U R                   U-   U l        U R                  R                  SU R                  5        U$ S U l        U$ r  )_cursor_prefixr5   ri   rj   r  s     r   r  'TwitterTimelineExtractor._update_cursor@  sB    ..7DLHHNN<6   DLr   c              #   .  #    SnU R                  SS5      nU(       d  [        R                  U l        O[	        U[
        5      (       a  X l        OS nU(       a@  UR                  S5      S   nUR                  S5      u  p4n[        R                  " US5      nOSnUS::  aH  SU l
        S nU R                  5       " U R                  5       H  nUv   M	     Uc  U(       d  g US	   nS
=p1O%U R                  R                  U R                  5        SU R                  S    SW 3nU R                   (       a  US-  nUS
::  av  SU S3U l
        U(       a  U R                  U l        U R"                  (       d?  S nU R                  R%                  US-   5       H  nUv   M	     Ub  U R                  S 5      $ S=p1US::  aW  SU S3U l
        U(       a  U R                  U l        U R                  R%                  U5       S h  vN   U R                  S 5      $ g  N7f)NFr  Tr  r   r   r   z1/rT   r   r  r   z max_id:z( include:retweets include:nativeretweets2_z filter:links   3_)r+   r   r1   r  rG   rH   r5   r  r   r   r  _select_tweet_sourcer   ra   _user_id_by_screen_namer6   r    r,   r  )r   resetr  stater   r   rw   r  s           r   rg   TwitterTimelineExtractor.tweetsH  s    Xt,"&--D$$!LF$$S)!,E!&!5EhNN5!,EEA:"&D E224TYY? @}VY'HEEHH,,TYY7 

6*+8H:>==??EA:$&xj"2D#22==!XX55eo6MNEK O$..t44EA:$&xj"2D#22xx//666&&t,,  7s   G:H<H=Hc                    U R                  S5      nUb  US:X  aN  U R                  (       d  U R                  (       a  U R                  R                  $ U R                  R
                  $ US:X  a  U R                  R                  $ US:X  a  U R                  R
                  $ US:X  a  U R                  R                  $ [        R                  " SU S35      e)Nstrategyautorg   r   r  zInvalid strategy '')	r+   r    r,   ra   user_tweets
user_mediauser_tweets_and_repliesr	   AbortExtraction)r   r  s     r   r  -TwitterTimelineExtractor._select_tweet_source  s    ;;z*x61}}xx+++xx***x88'''w88&&&~%88333''*<XJa(HIIr   )r5   r  r  N)r   r  r  r  r  r  USER_PATTERNr  r  r  r  rg   r  r  r   r   r   r  r  5  s0    /K//G+G
<-|Jr   r  c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	r  i  z2Extractor for Tweets from a user's Tweets timelinerg   z/tweets(?!\w)zhttps://x.com/USER/tweetsc                 L    U R                   R                  U R                  5      $ r   )ra   r  r   r:   s    r   rg   TwitterTweetsExtractor.tweets  s    xx##DII..r   r   Nr   r  r  r  r  r  r  r  r  rg   r  r   r   r   r  r    s    <K--G)G/r   r  c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	r  i  z=Extractor for Tweets from a user's timeline including repliesr!   z/with_replies(?!\w)zhttps://x.com/USER/with_repliesc                 L    U R                   R                  U R                  5      $ r   )ra   r  r   r:   s    r   rg   TwitterRepliesExtractor.tweets  s    xx//		::r   r   Nr  r   r   r   r  r    s    GK33G/G;r   r  c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	r  i  z6Extractor for Tweets from a user's highlights timeliner  z/highlights(?!\w)zhttps://x.com/USER/highlightsc                 L    U R                   R                  U R                  5      $ r   )ra   user_highlightsr   r:   s    r   rg   !TwitterHighlightsExtractor.tweets  s    xx''		22r   r   Nr  r   r   r   r  r    s    @K11G-G3r   r  c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	r  i  z1Extractor for Tweets from a user's Media timeliner   z/media(?!\w)zhttps://x.com/USER/mediac                 L    U R                   R                  U R                  5      $ r   )ra   r  r   r:   s    r   rg   TwitterMediaExtractor.tweets      xx""499--r   r   Nr  r   r   r   r  r    s    ;K_,G(G.r   r  c                   6    \ rS rSrSrSr\S-   rSrS r	S r
Srg	)
r  i  zExtractor for liked tweetsr  z/likes(?!\w)zhttps://x.com/USER/likesc                     SU R                   0$ )N
user_likes)r   r:   s    r   rb   TwitterLikesExtractor.metadata  s    dii((r   c                 L    U R                   R                  U R                  5      $ r   )ra   r"  r   r:   s    r   rg   TwitterLikesExtractor.tweets  r  r   r   N)r   r  r  r  r  r  r  r  r  rb   rg   r  r   r   r   r  r    s#    $K_,G(G).r   r  c                   6    \ rS rSrSrSr\S-   rSrS r	S r
Srg	)
TwitterBookmarkExtractori  zExtractor for bookmarked tweetsbookmarkz/i/bookmarks()zhttps://x.com/i/bookmarksc                 6    U R                   R                  5       $ r   )ra   user_bookmarksr:   s    r   rg   TwitterBookmarkExtractor.tweets  s    xx&&((r   c                     [         R                  X5      nU R                  [        US   =(       d    S5      S-	  S-  5      US'   U$ )N	sortIndexr      r   date_bookmarked)r   r3   rG  rD  )r   rw   r{   s      r   r3   )TwitterBookmarkExtractor._transform_tweet  sI     11$>#'#7#7{#(q)R/47$9 r   r   N)r   r  r  r  r  r  r  r  r  rg   r3   r  r   r   r   r'  r'    s$    )K..G)G)r   r'  c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	TwitterListExtractori  zExtractor for Twitter listsr   z/i/lists/(\d+)/?$zhttps://x.com/i/lists/12345c                 L    U R                   R                  U R                  5      $ r   )ra   list_latest_tweets_timeliner   r:   s    r   rg   TwitterListExtractor.tweets  s    xx33DII>>r   r   Nr  r   r   r   r2  r2    s    %K11G+G?r   r2  c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	TwitterListMembersExtractori  z'Extractor for members of a Twitter listzlist-membersz/i/lists/(\d+)/membersz#https://x.com/i/lists/12345/membersc                     U R                  5         U R                  [        U 5      R                  U R                  5      5      $ r   )r_   r  r`   list_membersr   r:   s    r   r}   !TwitterListMembersExtractor.items  s0    

!!*T"2"?"?		"JKKr   r   Nr  r   r   r   r7  r7    s     1 K66G3GLr   r7  c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	TwitterFollowingExtractori  zExtractor for followed users	followingz/following(?!\w)zhttps://x.com/USER/followingc                     U R                  5         U R                  [        U 5      R                  U R                  5      5      $ r   )r_   r  r`   user_followingr   r:   s    r   r}   TwitterFollowingExtractor.items  0    

!!*T"2"A"A$))"LMMr   r   Nr   r  r  r  r  r  r  r  r  r}   r  r   r   r   r<  r<    s     &K00G,GNr   r<  c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	TwitterFollowersExtractori  z Extractor for a user's followers	followersz/followers(?!\w)zhttps://x.com/USER/followersc                     U R                  5         U R                  [        U 5      R                  U R                  5      5      $ r   )r_   r  r`   user_followersr   r:   s    r   r}   TwitterFollowersExtractor.items  rA  r   r   NrB  r   r   r   rD  rD    s     *K00G,GNr   rD  c                   8    \ rS rSrSrSrSrSr\S-   r	Sr
S rS	rg
)TwitterCommunityExtractori  z!Extractor for a Twitter communityr3  )r   Communitiesz#{community[name]} ({community[id]})z"C_{community[id]}_{tweet_id}_{num}z/i/communities/(\d+)z!https://x.com/i/communities/12345c                     U R                   (       a%  U R                  R                  U R                  5      $ U R                  R	                  U R                  5      $ r   )r,   ra   community_tweets_timeliner   community_media_timeliner:   s    r   rg    TwitterCommunityExtractor.tweets  s;    ==8855dii@@xx00;;r   r   N)r   r  r  r  r  r  r  r  r  r  r  rg   r  r   r   r   rJ  rJ    s+    +K<M6K44G1G<r   rJ  c                   `    \ rS rSrSrSr\R                  r\R                  r\	S-   r
SrS rSrg)	TwitterCommunitiesExtractori  z*Extractor for followed Twitter communitiescommunitiesz/([^/?#]+)/communities/?$zhttps://x.com/i/communitiesc                 L    U R                   R                  U R                  5      $ r   )ra   communities_main_page_timeliner   r:   s    r   rg   "TwitterCommunitiesExtractor.tweets  s    xx66tyyAAr   r   N)r   r  r  r  r  r  rJ  r  r  r  r  r  rg   r  r   r   r   rQ  rQ    s6    4K-;;M+77K99G+GBr   rQ  c                   :    \ rS rSrSrSrSr\S-   rSr	S r
S rS	rg
)TwitterEventExtractori!  z)Extractor for Tweets from a Twitter Eventevent)r   Eventsz {event[id]} {event[short_title]}z/i/events/(\d+)zhttps://x.com/i/events/12345c                 P    SU R                   R                  U R                  5      0$ )NrX  )ra   
live_eventr   r:   s    r   rb   TwitterEventExtractor.metadata)  s     ,,TYY788r   c                 L    U R                   R                  U R                  5      $ r   )ra   live_event_timeliner   r:   s    r   rg   TwitterEventExtractor.tweets,  s    xx++DII66r   r   N)r   r  r  r  r  r  r  r  r  r  rb   rg   r  r   r   r   rW  rW  !  s+    3K9M//G,G97r   rW  c                   H    \ rS rSrSrSr\S-   rSrS r	S r
S rS	 rS
 rSrg)TwitterTweetExtractori0  zExtractor for individual tweetsrw   z7/([^/?#]+|i/web)/status/(\d+)/?(?:$|\?|#|photo/|video/)zhttps://x.com/USER/status/12345c                 B    [         R                  X5        US   U l        g )Nr   )r   r   r   r   s     r   r   TwitterTweetExtractor.__init__7  s    !!$.ar   c                 ^   U R                  S5      =n(       a%  US:H  U l        U R                  U R                  5      $ U R                  S5      nUS:X  d$  US;   a9  U R                  R
                  S   (       a  U R                  U R                  5      $ U R                  U R                  5      $ )Nconversations
accessibleztweet-endpointdetail)Nr	  x-twitter-auth-type)r+   _accessible_tweets_conversationr   ra   headers_tweets_detail_tweets_single)r   re  endpoints      r   rg   TwitterTweetExtractor.tweets;  s     KK88=8 - =D,,T]];;;;/0x8~#=  !67&&t}}55""4==11r   c              #     #    U R                   R                  U5      n U R                  US   S   S   5        Uv   U R                  (       d  g  US   nUS   R                  S	5      nU(       d  g U R                   R                  U5      nX2S   S
'   Uv   MI  ! [         a3    [        R
                  " SUR                  S5      =(       d    S S35      ef = f7f)Nr  r   r   r
  r   r   rT   rN   quoted_status_id_strrQ   )ra   tweet_result_by_rest_idr{  rE  r	   r  rl   r$   )r   r   rw   	parent_ids       r   rm  $TwitterTweetExtractor._tweets_singleG  s     00:	=eFmN;HEF
 {{i(IX**+ABHHH44X>E2;(O./K   	=++EIIh'8=9;= =	=s   CB A C=CCc                 :   / nU R                   R                  U5       Hy  nUS   U:X  d  UR                  S5      U:X  d  M#  U R                  c  U R	                  US   S   S   5        UR                  U5        US   R                  S5      nU(       a  Mx    U$    U$ )NrT   _retweet_id_strr  r   r   rN   rq  )ra   r  rl   r7   r{  r   )r   r   rg   rw   s       r   rl  $TwitterTweetExtractor._tweets_detail^  s    XX**84EY8+II/0H<>>)%%eFmN&CH&MNe$ ?../EFx 5 r   c                 8   U R                   R                  U5      n/ nU HN  nUR                  U5        US   U:X  d  UR                  S5      U:X  d  M4  U R	                  US   S   S   5          O   U R
                  (       a  gU$ [        R                  " X25      $ )NrT   rv  r  r   r   r   )ra   r  r   rl   r{  ri  	itertoolschain)r   r   rg   bufferrw   s        r   rj  *TwitterTweetExtractor._tweets_conversationn  s    &&x0EMM% Y8+II/0H<!!%-"?"IJ  Mv..r   )ri  r   N)r   r  r  r  r  r  r  r  r  r   rg   rm  rl  rj  r  r   r   r   ra  ra  0  s7    )K - -G/G!
2. /r   ra  c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	TwitterQuotesExtractori  zExtractor for quotes of a Tweetquotesz&/(?:[^/?#]+|i/web)/status/(\d+)/quotesz&https://x.com/USER/status/12345/quotesc              #   z   #    U R                    SU R                   3nS[        0n[        R                  X4v   g 7f)Nz/search?q=quoted_tweet_id:r  r  r  s      r   r}   TwitterQuotesExtractor.items  s8     5dii[A45mmS&&r  r   Nr  r   r   r   r~  r~    s    )KFFG6G'r   r~  c                   4    \ rS rSrSrSrSr\S-   rSr	S r
Srg	)
r  i  z#Extractor for a user's profile datar  )r   z{name}z/infozhttps://x.com/USER/infoc                     [        U 5      nU R                  nUR                  S5      (       a  UR                  USS  5      nOUR	                  U5      n[        [        R                  SU R                  U5      445      $ )Nr  r   rW   )	r`   r   r  user_by_rest_idr  iterr   rq   r4   )r   ra   r6  r   s       r   r}   TwitterInfoExtractor.items  sr    ii!!%((&&{127D**;7Dg''T-A-A$-GHJKKr   r   N)r   r  r  r  r  r  r  r  r  r  r}   r  r   r   r   r  r    s$    -K,MX%G'G	Lr   r  c                   4    \ rS rSrSrSrSr\S-   rSr	S r
Srg	)
r  i  rp  zavatar {date}.{extension}zAV_{user[id]}_{date}z/photozhttps://x.com/USER/photoc                     U R                   R                  U R                  5        U R                  nUS   S   nUS:X  a  gUR	                  SS5      nUR                  SS5      S	   nU R                  XU5      4$ )
Nrp  rq  zNhttps://abs.twimg.com/sticky/default_profile_images/default_profile_normal.pngr   rr  r   r  r   r   )ra   r  r   r7   rJ  rsplitr  r  s       r   rg   TwitterAvatarExtractor.tweets  s|    ((3~~8n[) H Ikk*c*C#A&  F355r   r   Nr   r  r  r  r  r  r  r  r  r  rg   r  r   r   r   r  r    s%    K.L(KY&G(G6r   r  c                   4    \ rS rSrSrSrSr\S-   rSr	S r
Srg	)
r  i  
backgroundzbackground {date}.{extension}zBG_{user[id]}_{date}z/header_photozhttps://x.com/USER/header_photoc                 *   U R                   R                  U R                  5        U R                  n US   S   nUR	                  SS5      u  p4[        [        U5      S-  S-
  S-  5      nU R                  XU5      4$ ! [
        [        4 a     gf = f)	NrN   rc  r  r   r   r   r  r   )
ra   r  r   r7   r  rE  
ValueErrorrH   rD  r  )r   r   r]   r   	timestamprP   s         r   rg   !TwitterBackgroundExtractor.tweets  s    ((3~~	x.!56C::c1-LA c)nt+m;BC  F355	 *% 		s   A? ?BBr   Nr  r   r   r   r  r    s&    K2L(K--G/G6r   r  c                   0    \ rS rSrSrSrSrSrS rS r	Sr
g	)
TwitterImageExtractori  r   imagez<https?://pbs\.twimg\.com/media/([\w-]+)(?:\?format=|\.)(\w+)z6https://pbs.twimg.com/media/ABCDE?format=jpg&name=origc                     [         R                  " X5        UR                  5       u  U l        U l        [
        R                  U 5        g r   )r   r   r  r7  r   r   r9   r   s     r   r   TwitterImageExtractor.__init__  s2    4'!LLN$$T*r   c              #     #    SU R                    SU R                   S3nU R                   U R                  [        R                  X5      S.n[        R
                  SU4v   [        R                  XR                  -   U4v   g 7f)Nzhttps://pbs.twimg.com/media/r   r   )filenamer^   r   rW   )r7  r   r   r   r   rq   ru   rE   )r   r   rx   s      r   r}   TwitterImageExtractor.items  su     -dggYhtxxjO )99$E
 T))kk4"2"22D88s   BB)r   r7  N)r   r  r  r  r  r  r  r  r   r}   r  r   r   r   r  r    s     HKMGFG+

9r   r  c                   \   \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS/S jrS rS rS rS rS rS rS rS rS rS rS rS rS rS r\" SS9S 5       r\" SS9S 5       rS r \!" S S!9S" 5       r"S# r#\!" S$S!9S% 5       r$S0S& jr%S1S' jr&S( r'  S2S) jr(S/S* jr)S+ r*S, r+S- r,S.r-g)3r`   i  Nc                 t   Xl         UR                  U l        SU l        SU l        [        R
                  U l        UR                  nUR                  nUR                  S5      nUb  US:X  a  UR                  SUS9nOS nU(       d%  [        R                  " 5       nUR                  SXSS9  UR                  SUS9nSUR                  S	-   S
S U(       a  SOS USSS SSSSS.U l        0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_S S!_S"S_S#S$_S%S$_S&S$_SS'S$S$S$S$S$S$S$S$S$S S(S)S*.EU l        SS+S+SSS+SSSSS+SS,.U l        0 S-S+_S.S+_S/S+_S0S_S1S_S2S+_S3S_S4S_S5S+_S6S+_S7S_S8S_S9S+_S:S_S;S_S<S_S=S_0 S>S_S?S_S@S_SAS_SBS_SCS+_SDS+_SES_SFS+_SGS_SHS_SIS_SJS_SKS_SLS_SMS_SNS+_ESOS+0EU l        g )PNzhttps://x.com/i/apiTcsrfcookiesct0r   r   z*/*r  zapplication/jsonOAuth2Sessionenyesemptycorszsame-originzoBearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA)AcceptRefererzcontent-typex-guest-tokenrh  x-csrf-tokenzx-twitter-client-languagezx-twitter-active-userx-client-transaction-idzSec-Fetch-DestzSec-Fetch-ModezSec-Fetch-Siteauthorization!include_profile_interstitial_type1include_blockinginclude_blocked_byinclude_followed_byinclude_want_retweetsinclude_mute_edgeinclude_can_dminclude_can_media_taginclude_ext_is_blue_verifiedinclude_ext_verified_typeinclude_ext_profile_image_shapeskip_statuscards_platformzWeb-12include_cardsinclude_ext_alt_texttrue"include_ext_limited_action_resultsinclude_quote_countextended20zmediaStats,highlightedLabel,parodyCommentaryFanLabel,voiceInfo,birdwatchPivot,superFollowMetadata,unmentionInfo,editControl,article)include_reply_count
tweet_modeinclude_ext_viewsinclude_entitiesinclude_user_entitiesinclude_ext_media_colorinclude_ext_media_availability#include_ext_sensitive_media_warning$include_ext_trusted_friends_metadatasend_error_codessimple_quoted_tweetr  rX   r   F)$hidden_profile_subscriptions_enabledpayments_enabledrweb_xchat_enabled4profile_label_improvements_pcf_label_in_post_enabledrweb_tipjar_consumption_enabledverified_phone_label_enabled highlights_tweets_tab_ui_enabled0responsive_web_twitter_article_notes_tab_enabled&subscriptions_feature_can_gift_premium/creator_subscriptions_tweet_preview_api_enabledAresponsive_web_graphql_skip_user_profile_image_extensions_enabled2responsive_web_graphql_timeline_navigation_enabledrweb_video_screen_enabledr  r  r  r  r  r  r  r   premium_content_api_read_enabled4communities_web_enable_tweet_community_results_fetch)c9s_tweet_anatomy_moderator_badge_enabled7responsive_web_grok_analyze_button_fetch_trends_enabled2responsive_web_grok_analyze_post_followups_enabledresponsive_web_jetfuel_frame,responsive_web_grok_share_attachment_enabledarticles_preview_enabled%responsive_web_edit_tweet_api_enabled:graphql_is_translatable_rweb_tweet_is_translatable_enabled"view_counts_everywhere_api_enabled'longform_notetweets_consumption_enabled8responsive_web_twitter_article_tweet_consumption_enabled tweet_awards_web_tipping_enabled-responsive_web_grok_show_grok_translated_post0responsive_web_grok_analysis_button_from_backend1creator_subscriptions_quote_tweet_preview_enabled)freedom_of_speech_not_reach_fetch_enabledstandardized_nudges_misinfoGtweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled*longform_notetweets_rich_text_read_enabled(longform_notetweets_inline_media_enabled,responsive_web_grok_image_annotation_enabled.responsive_web_grok_imagine_annotation_enabled>responsive_web_grok_community_note_auto_translation_is_enabled$responsive_web_enhance_cards_enabled)	extractorri   r   _nsfw_warningr   
json_dumps_json_dumpsr  r  r+   rl   generate_tokenrc   rk  paramsfeaturesfeatures_pagination)r   r  r  r  r  
csrf_tokenr   s          r   r   TwitterAPI.__init__  s   "==)	!??##"11'<49, U>BJJ,,.JKKzKA[[n[E
  ~~+.!6@?d&)-%*'+%$+/
""
/"
"
 !#"
 "3	"

 $S"
  "
 c"
 $S"
 +C"
 ("
 .s"
 3"
 h"
 S"
 #F"
  1&!"
" "6#"
$ $'$!' &%+'-.4394: &#)7?"
H 59 %"'DH/3,104@D6:?C:?BF
($
'($
($
 !%($
 CD	($

 .t($
 +E($
 >t($
+,0($
:;@($
 /($
 CD($
 8($
 Fu($
  A$!($
" +D#($
$ ;D%($
& ''($
( 4T)($
* I$+($
, 1$-($
. 6t/($
0 G1($
2 /3($
4 <U5($
6 ?7($
8 @9($
: 8;($
< *4=($
>9:>A($
B 9$C($
D 7E($
F ;DG($
H =dI($
J:;@M($
N 3EO($
 r   c                    SnUSSSS.nU R                   R                  5       nUS	 SSSSS.nU R                  U5      U R                  U5      U R                  U5      S.nU R                  X&5      S   S	   S
   nSU;   a  US   nUR	                  S5      S:X  a_  UR	                  S5      nUS;   a  [
        R                  " SS9eUS:X  a  [
        R                  " SS9e[
        R                  " SU S35      eU$ )Nz3/graphql/qxWQxcMLiTPcavz9Qy5hwQ/TweetResultByRestIdF)tweetIdwithCommunityincludePromotedContent	withVoicer  TwithArticleRichContentStatewithArticlePlainTextwithGrokAnalyzewithDisallowedReplyControls	variablesr  fieldTogglesrx   tweetResultr   rw   
__typenameTweetUnavailabler   )NsfwViewerHasNoStatedAgeNsfwLoggedOutz
NSFW Tweet)message	ProtectedzProtected TweetzTweet unavailable ('z'))r  copyr  _callrl   r	   AuthRequiredr  )	r   r   rn  r  r  field_togglesr  rw   r   s	            r   rr  "TwitterAPI.tweet_result_by_rest_idi  s#   H"&+	
	 ++00201+/$)$+0	
 !,,Y7 ,,X6 ,,];

 

8,V4]CHMe'NE99\"&88YYx(FFF,,\BB$,,5FGG++.B6(",MNNr   c           	      L    SnUSSSSSSSS.nSSSSS.nU R                  X#SUS9$ )	Nz+/graphql/iFEr5AcP121Og4wx9Yqo3w/TweetDetailprofileFT)focalTweetIdreferrerwith_rux_injectionsr  r  &withQuickPromoteEligibilityTweetFieldswithBirdwatchNotesr   r  )(threaded_conversation_with_injections_v2r  )_pagination_tweets)r   r   rn  r  r  s        r   r  TwitterAPI.tweet_detail  s^    @$!#(&+!6;"&

	 ,0$)$+0	
 &&9' ' ) 	)r   c                     SnU R                  U5      U R                  R                  SS5      SSSS.nSS0nU R                  X#US9$ )	Nz*/graphql/E8Wq-_jFSaU7hxVcuOPR9g/UserTweetslimit2   FT)userIdrX   r  r  r   r  r  r  r  r+   r  r   r6  rn  r  r  s        r   r  TwitterAPI.user_tweets  sf    ?22;?^^**7B7&+6;
	 #E
 &&} ' > 	>r   c                     SnU R                  U5      U R                  R                  SS5      SSSS.nSS0nU R                  X#US9$ )	Nz4/graphql/-O3QOHrVn1aOm_cF5wyTCQ/UserTweetsAndRepliesr!  r"  FT)r#  rX   r  r  r   r  r  r$  r%  s        r   r  "TwitterAPI.user_tweets_and_replies  sf    I22;?^^**7B7&+!
	 #E
 &&} ' > 	>r   c                     SnU R                  U5      U R                  R                  SS5      SSS.nSS0nU R                  X#US9$ )	Nz4/graphql/gmHw9geMTncZ7jeLLUUNOw/UserHighlightsTweetsr!  r"  FT)r#  rX   r  r   r  r  r$  r%  s        r   r  TwitterAPI.user_highlights  sc    I22;?^^**7B7&+	
	 #E
 &&} ' > 	>r   c                     SnU R                  U5      U R                  R                  SS5      SSSSS.nSS0nU R                  X#US9$ )	Nz)/graphql/jCRhbOzdgOHp6u9H4g2tEg/UserMediar!  r"  FTr#  rX   r  withClientEventTokenr  r   r  r  r$  r%  s        r   r  TwitterAPI.user_media  si    >22;?^^**7B7&+$)"'
	 #E
 &&} ' > 	>r   c                     SnU R                  U5      U R                  R                  SS5      SSSSS.nSS0nU R                  X#US9$ )	Nz%/graphql/TGEKkJG_meudeaFcqaxM-Q/Likesr!  r"  FTr,  r  r  r$  r%  s        r   r"  TwitterAPI.user_likes  si    :22;?^^**7B7&+$)"'
	 #E
 &&} ' > 	>r   c                 f    SnU R                   R                  SS5      SS.nU R                  XSSS9$ )	Nz)/graphql/pLtjrO4ubNh996M_Cubwsg/Bookmarksr!  r"  F)rX   r  )bookmark_timeline_v2r     )stop_tweetsr  r+   r  r   rn  r  s      r   r*  TwitterAPI.user_bookmarks  sH    >^^**7B7&+
	 &&!E '  	r   c                 f   U R                   R                  nUcF  U" S5      =n(       a5  SSSSSS.R                  UR                  5       U5      R	                  5       nOSnSnUU" S	S
5      SUSS.nU" SS5      nUS;   a  U R
                  nOS nU" S5      nUb  US:X  a  SnU R                  XESXS9$ )Nzsearch-resultsTopLatestPeopleMediaLists)topliver   r   r   z./graphql/4fpceYZ6-YQCx_JSl_Cn_A/SearchTimelinezsearch-limitr.  typed_queryF)rawQueryrX   querySourceproductwithGrokTranslatedBiozsearch-paginationmax_id>   r7  maxidrE  zsearch-stopr	  r   )search_by_raw_queryr  r  )r4  update_variables)r  r+   rl   lower
capitalize_update_variables_search_maxidr  )	r   r  rC  cfgrn  r  pgnrH  r4  s	            r   r  TwitterAPI.search_timeline  s    nn##?.//w/"%%$$ #gmmow/

  #C,(%*
	 %x0++#BB#-(+"7K&&B# ' H 	Hr   c                     SnU R                  SU05      U R                  SSS.5      S.nU R                  X#5      S   S   S   $ )	Nz./graphql/2W09l7nD7ZbxGQHXvfB22w/CommunityQuerycommunityIdF)#c9s_list_members_action_api_enabledc9s_superc9s_indication_enabledr  r  rx   communityResultsr   )r  r  )r   community_idrn  r  s       r   community_queryTwitterAPI.community_query!  sl    C))|+  ((7<38* 	
 

8,+--57 	8r   c                 n    SnUU R                   R                  SS5      SSSS.nU R                  X#S5      $ )	Nz7/graphql/Nyt-88UX4-pPCImZNUl9RQ/CommunityTweetsTimeliner!  r"  	CommunityRecencyT)rP  rX   displayLocationrankingModer  )rT  r   ranked_community_timeliner  r5  r   rU  rn  r  s       r   rM  $TwitterAPI.community_tweets_timeline/  sK    L'^^**7B7*$!
	 && 	r   c                 j    SnUU R                   R                  SS5      SS.nU R                  X#S5      $ )Nz6/graphql/ZniZ7AAK_VVu1xtSx1V-gQ/CommunityMediaTimeliner!  r"  T)rP  rX   r  )rT  r   rN  r  r5  r^  s       r   rN  #TwitterAPI.community_media_timeline=  sE    K'^^**7B7!
	
 && 	r   c                 h    SnU R                   R                  SS5      SS.nU R                  X#S5      $ )Nz;/graphql/p048a9n3hTPppQyK7FQTFw/CommunitiesMainPageTimeliner!  r"  T)rX   r  )viewercommunities_timeliner  r5  r   r6  rn  r  s       r   rT  )TwitterAPI.communities_main_page_timelineI  sD    3 ^^**7B7!
	 &&:< 	<r   c                 l    SnU R                   R                  SS5      SSSS.nU R                  XS5      $ )Nz,/graphql/DXmgQYmIft1oLP6vMkJixw/HomeTimeliner!  r"  FT)rX   r  latestControlAvailabler  r  home_timeline_urtr5  r6  s      r   r  TwitterAPI.home_timelineT  sH    A^^**7B7&+&*!	
	 &&!>@ 	@r   c                 j    SnU R                   R                  SS5      SSS.nU R                  XS5      $ )Nz2/graphql/SFxmNKWfN9ySJcXG_tjX8g/HomeLatestTimeliner!  r"  FT)rX   r  rh  ri  r5  r6  s      r   r  TwitterAPI.home_latest_timeline_  sE    G^^**7B7&+&*
	
 &&!>@ 	@r   c                     SU S3nU R                   R                  5       nSUS'   SUS'   SUS'   U R                  X#5      $ )Nz/2/live_event/timeline/z.jsonrecaptimeline_idr  urtget_annotations)r  r  _pagination_restr   event_idrn  r  s       r   r^  TwitterAPI.live_event_timelinei  sQ    ,XJe<!!# '}u$* !$$X66r   c                     SU S3nU R                   R                  5       nSUS'   SUS'   U R                  X#5      S   S   U   $ )	Nz/1.1/live_event/1/z/timeline.json0rX   r  rq  twitter_objectslive_events)r  r  r  rt  s       r   r[  TwitterAPI.live_eventq  s]    'z@!!#wu

8,"$$133;= 	>r   c                 h    SnUU R                   R                  SS5      S.nU R                  X#S5      $ )Nz8/graphql/06JtmwM8k_1cthpFZITVVA/ListLatestTweetsTimeliner!  r"  listIdrX   )r   tweets_timeliner  r5  r   list_idrn  r  s       r   r4  &TwitterAPI.list_latest_tweets_timeliney  sB    M^^**7B7
	 &&!HJ 	Jr   c                 4    SnUSS.nU R                  X#S5      $ )Nz+/graphql/naea_MSad4pOb-D6_oVv_g/ListMembersd   r}  )r   members_timeliner  )_pagination_usersr  s       r   r9  TwitterAPI.list_members  s1    @
	 %%!IK 	Kr   c                     SnU R                   R                  5       nU R                  R                  SS5      US'   U R	                  X5      $ )Nz#/2/notifications/device_follow.jsonr!  r"  rX   )r  r  r  r+   rs  )r   rn  r  s      r   r  %TwitterAPI.notifications_devicefollow  sD    8!!#..//<w$$X66r   c                 T    SnU R                  U5      SSSS.nU R                  X#5      $ )Nz)/graphql/i6PPdIMm1MO7CpAqjau7sw/Followersr  Fr#  rX   r  rD  r  r  re  s       r   rG  TwitterAPI.user_followers  8    >22;?&+%*	
	 %%h::r   c                 T    SnU R                  U5      SSSS.nU R                  X#5      $ )Nz5/graphql/fxEl9kp1Tgolqkq8_Lo3sg/BlueVerifiedFollowersr  Fr  r  re  s       r   user_followers_verified"TwitterAPI.user_followers_verified  s8    J22;?&+%*	
	 %%h::r   c                 T    SnU R                  U5      SSSS.nU R                  X#5      $ )Nz)/graphql/SaWqzw0TFAWMx1nXWjXoaQ/Followingr  Fr  r  re  s       r   r?  TwitterAPI.user_following  r  r   r   )keyargc                     SnU R                   nU R                  SU05      U R                  U5      S.nU R                  X$5      S   S   S   $ )Nz,/graphql/8r5oa_2vD0WkhIAOkY4TTA/UserByRestIdr#  rS  rx   r   r   )r  r  r  )r   rT   rn  r  r  s        r   r  TwitterAPI.user_by_rest_id  s_    A==))'+  ((2	
 zz(+F3F;HEEr   c                     SnU R                   R                  5       nSUS'   SUS'   U R                  USS.5      U R                  U5      U R                  SS05      S.nU R                  X$5      S	   S
   S   $ )Nz0/graphql/ck5KkZ8t5cOmoLssopN99Q/UserByScreenNameT<subscriptions_verification_info_is_identity_verified_enabled6subscriptions_verification_info_verified_since_enabledF)r6  rD  withAuxiliaryUserLabelsr  rx   r   r   )r  r  r  r  )r   r6  rn  r  r  s        r   r  TwitterAPI.user_by_screen_name  s    E==%%'37 	 0 	1 .2 	 * 	+ ))*).+  ((2 ,,)4. 	
 zz(+F3F;HEEr   c                 t   Sn UR                  S5      (       a  U R                  USS  5      nOU R                  U5      nU R                  R	                  U5        US   $ ! [
         aM    U(       a/  UR                  S5      S:X  a  [        R                  " US   S5      e[        R                  " S	5      ef = f)
Nr   r  r   rT   r
  UserUnavailabler  Fr   )	r  r  r  r  r{  rE  rl   r	   NotFoundError)r   r6  r   s      r   r  "TwitterAPI._user_id_by_screen_name  s    	6%%e,,++KO<//<NN''-	?" 	6.2CC--d9ouEE--f55		6s   AA   AB7i  )maxagec           	      ~    SnU R                   R                  S5        [        U R                  US SSS5      S   5      $ )Nz/1.1/guest/activate.jsonzRequesting guest tokenPOSTFzhttps://api.x.comguest_token)ri   r  rH   r  )r   rn  s     r   _guest_tokenTwitterAPI._guest_token  sD    -./4::dFE+>

  	r   c                     U R                  5       nXR                  S   :w  aG  XR                  S'   U R                  R                  R	                  SXR                  R
                  S9  g g )Nr  gtr  )r  rk  r  r  rc   r  )r   r  s     r   _authenticate_guestTwitterAPI._authenticate_guest  s]    ''),,77,7LL)NN""&&k..*G*G ' I 8r   i0*  c                 8   U R                   R                  S5        SSKJn  UR	                  5       nUR                  U R                  5        U R                  R                  R                  SU R                  R                  S9nU(       a  X0R                  S'   U$ )Nz$Initializing client transaction keysr   )transaction_idr  r  r  )ri   r  rW   r  ClientTransaction
initializer  r  rl   r  rk  )r   r  ctr  s       r   _client_transactionTwitterAPI._client_transaction  sx    <=%--/
dnn% ^^++//$..77 0 9
+5LL(	r   c                     U R                   c  U R                  5       [        l         XR                  SS5      S  nU R                   R	                  X#5      U R
                  S'   g )Nr     r  )client_transactionr  r`   findgenerate_transaction_idrk  )r   r]   methodpaths       r   _transaction_idTwitterAPI._transaction_id  sX    ""*,0,D,D,FJ)88C#$%##;;FI 	./r   c                    Uc  U R                   OUU-   n U(       a6  U R                  S   (       a  U R                  Xc5        OU R                  5         U R                  R                  XcUU R                  S S9nUR                  R                  S5      =n(       a  XR                  S'   [        UR                  R                  SS5      5      n	U	S:  a.  U	[        R                  " SS5      ::  a  U R                  U5        M   UR                  5       n
U
R                  S	5      nU(       d  U
$ SnU H  nUR                  S
5      =(       d    SnU R                  R!                  SU5        SU;   aq  SnU R                  R#                  S5      S:w  a  [$        R&                  " U5      eU R                  R)                  U5        U R                  R+                  S5        SnM  SU;   a  [$        R,                  " SU S35      eUR/                  5       R1                  S5      (       d  M  SnM     U(       a9  U R                  S   (       a  U R                  R!                  S5        GMQ  SUl        UR2                  S:  a  U
$ UR2                  S;   a+  U R                  S   (       d  [$        R4                  " SS5      eUR2                  S:X  a  U R                  U5        GM   SR7                  S U 5       5      n[$        R,                  " UR2                   SUR:                   S U S!35      e! [         a    S	S
UR                  040n
 GN5f = f! [8         a     Naf = f)"NTrh  )r  r  rk  r  r  r  zx-rate-limit-remaining   r   errorsr  FUnspecifiedzAPI error: '%s'z"this account is temporarily lockedzAccount temporarily lockedlockedwaitzPress ENTER to retry.zCould not authenticate your
  timeoutzRetrying API request  r  )i  r  zauthenticated cookiesr  i  z, c              3   *   #    U  H	  oS    v   M     g7f)r  Nr   ).0es     r   	<genexpr>#TwitterAPI._call.<locals>.<genexpr>K  s     "@AY<s   r:  z ())r   rk  r  r  r  r  r  rl   rD  random	randrange_handle_ratelimitjsonr  r   ri   rj   r+   r	   AuthorizationErrorrm   inputr  rI  r  r  r  joinr   r   )r   rn  r  r  authr   r]   r  r  	remainingrx   r  retryerrormsgs                  r   r  TwitterAPI._call  s    Ltyydh><< 56((5,,.~~--6D . 2H
 &--11%88z8/9^,H,,001I1MNI1}f.>.>q!.D!D&&x0A}} XXh'FEii	*;m0#673>6C~~,,X6&@'::3??HH$$S)NN(()@A E1S8#33auAJ??YY[++I66 E!  $ << 56HHNN#9: ,/H(##c)%%3%:;,,+Z9 9%%,&&x0"@"@@ ++''((//):"VHAFH He  A Ix}}#="?@A^  s$   L* M *M	M	
MMc              #     #    U R                   nUR                  5       =n(       a  XBS'   UR                  S:H  nSn U R                  X5      nUS   S   nU(       d  UR	                  S 5      $ US   S   n	US   S	   n
S =p/ nS
nU HL  nSU;   a
  US   S   nM  SU;   d  M  US   S   nUS   R                  U5      (       d  M>  US   S   S   S   nMN     U H  nUS   R
                  nU" S5      (       a"  UR                  US   S   S   S   S   5        MA  U" S5      (       a(  UR                  US   S   S   S   S   S S S2   5        Mv  U" U5      (       a+  US   S   S   nUR                  SS5      (       d  SnUS   nM  U" S5      (       d  M  UR                  S US   S   S     5       5        M     U H  n X   nS"U;   a]  U	R                  US"   5      nU(       a  U(       d  M2  US#   US"'   US#   US$'   UnO&U(       a  U
US%      US&'   S'U;   a  S'U;  a  US'   US''   U
US%      US('   Uv   S)U;   d  M  U	R                  US)   5      =n(       d  M  UR                  5       nU
US%      US&'   US(   S*   US+'   US#   US,'   Uv   M     U(       a  U	(       d  U(       d  UR	                  S 5      $ UR	                  U5      US'   GM  ! [         a!    U R                  R                  S!U5         GM<  f = f7f)-Nr  r   )cursor-bottom-zsq-cursor-bottomTr  instructionsglobalObjectsrg   r~  r   
addEntriesentriesreplaceEntryentryentryIdr;  	operationr   )tweet-zsq-I-t-r  rw   r7  homeConversation-timelineModulerb   conversationMetadataallTweetIdsstopOnEmptyResponsezconversationThread-c              3   h   #    U  H(  nUS    R                  S5      (       d  M  US    SS v   M*     g7f)r  r  r  N)r  )r  r  s     r   r  .TwitterAPI._pagination_rest.<locals>.<genexpr>  s6      %$OD	?55h? ,Y+$Os   22r}   Skipping %s (deleted)rO   rP   rv  rS   r  r   r   rq  r6  rA  rQ   )r  r  r    r  r  r  r   extendrl   rE  ri   rj   r  )r   rn  r  r  r  original_retweetsbottomrx   r  rg   r~  r   	tweet_idsr  instrr  entry_startswithrw   retweetr$   s                       r   rs  TwitterAPI._pagination_restR  s    ~~&&((6(%8!]]j87::h/D
+N;L**400/*84F)'2E $$HIG &5(#L1)<G#u,!.1':EY'226::"'	"2;"?#+#--4#6 & !#(#3#>#> #$9::$$i(0;GDTJL &&9::$$i()9::F/11>@@D"FG &f--"9-k:8DF!::&;TBB#'#G_F%&;<<$$ %$))$45E$Fw$O% ) !6 &",E
 -5$jj/H)IJG(&$=DX=N 9:5:8_ 12 ' */0F*Gh.'9 35 @ '(; < ""56 %eM&: ;f)U2!'E2H,I!JJvJ!'+01F+Gx(.3FmM.J{+5:8_12$= &B &**400#226:F8m l   HHNN#:HEsK   BK<!K<CK<*K< KA6K<>K<A3K<&K94K<8K99K<c           	   #     #    U R                   nUR                  S:H  n	UR                  (       a  SOS n
UnS n[        UR	                  S5      =n[
        5      (       aS  UR                  5       nUR                  5         U R                  R                  SUS   5        UR                  5       US'   OSnSS 0nUR                  5       =n(       a  XS'   Uc  U R                  nU(       a  U R                  U5      US	'   U(       a  U R                  U5      US
'    U R                  U5      US'   U R                  X5      n Uc  US   S   S   S   S   S   nOUS   nU H  nUU   nM
     US   nS nS nU H  nUR	                  S5      nUS:X  a$  U(       a  UR                  US   5        M7  US   nM>  US:X  a  US   nMK  US:X  a  U
b  US   n
M[  M]  US:X  d  Me  US   nUS   R!                  S5      (       d  M  US   S   nM     Uc  U(       d  UR#                  S 5      $ Sn/ nS =n=nn SnU
b-  [        U
[@        5      (       a  SU
S6'   UR+                  U
5        S n
U GH  nUS   R                   n!U!" S75      (       a  UR+                  U5        M3  U!" S85      (       a2  SU;   a  UR                  US   S9   5        M_  UR+                  U5        Mr  U!" S:5      (       a  UR                  US   S9   5        M  U!" S;5      (       a'  US   S<   n"SS=U"S>   00U"S?'   UR+                  U5        M  U!" S5      (       d  M  US   nS<U;   a  US<   nUR	                  S@S5      (       d  SnUR	                  S5      nGM     U
b  UR0                  c  S n#OUR0                  S+   R	                  SA5      =n#(       a  SBU#S!   -   n#[C        U5       Hm  u  n$nUS   RE                  U#5      (       d  M!   UR	                  S5      =(       d    USC   S<   S?   S   n
SDU
;   a  U
SD   n
SU
S6'   UU$	 URG                  S!U5          O   A#S n
U GH  n UR	                  S5      =(       d    USC   S<   n"SEU";   aY  URJ                  (       dH  UR                  R                  SFUR	                  S5      =(       d    SGRM                  SH5      SI   5        M  U"S?   S   nS=U;   a  U RO                  UUS=   5      nU(       d  M  SDU;   a  USD   nUS+   n%UR	                  SJ5      USJ'   U c   USL   SM   S     Sn SOU%;   a   U%SO   S   n&SDU&;   a  U&SD   n&U	(       a  U&SP   U&S+   SQ'   USP   U&SR'   U&nOZU&SP   U%SQ'   U&SL   SM   S   USS'   U&S+   n'STU&;   a  U&ST   UST'   SUU';   a  SUU%;  a  U'SU   U%SU'   SVU';   a  SVU%;  a  U'SV   U%SV'   U'SW   U%SW'    Uv   SYU;   d  GM   USY   S   n)USL   SM   S   SL   S1   U)S+   SZ'   USP   U)S+   S['   UR	                  SJ5      U)SJ'   U)v   GM     U (       a  GM  U(       a  UnUnOzUS!::  aM  U(       d  UR#                  S 5      $ U R                  R                  S]US   5        UR                  5       US'   GMV  U R                  R                  S^X-
  S-   U5        US-  nU(       a  XR	                  S5      :X  a,  U R                  R                  S_5        UR#                  S 5      $ Uc  UR#                  U5      US'   O	U" X/U5      nGM  ! [$         Ga    UR                  R                  U5        UR	                  S5      =n(       a  Uc%  SnUR'                  SS 5      nUS!:  a  [)        S"5      n/ nSnU HX  nUR+                  S#UR	                  S$5      =(       d    UR	                  S%5       S&35        UR	                  S'5      S(:X  d  MV  SnMZ     U R                  R-                  S)WUS-   S*R/                  U5      5        U(       a  UU::  a	  US-  n GM  UR0                  =n(       a  US+   nUR	                  S,5      (       a  U R2                  S-   (       aX  UR'                  S.5      (       aB  S Ul        UR6                  S/	 S U R2                  S-'   UR                  R9                  S05         GM  [:        R<                  " US1   S2-   5      eUR	                  S35      (       a  [:        R<                  " US1   S4-   5      e[:        R>                  " S55      ef = f! [H         a     GNf = f! [P         aK    UR                  R                  SKUR	                  S5      =(       d    SGRM                  SH5      SI   5         GM;  f = f! [P         a#    U R                  R-                  SN5        Sn    GM  f = f! [H         aM  n(UR                  R                  SXUR	                  SP5      U(RR                  RT                  U(5         S n(A(GM  S n(A(ff = f! [P         a0    UR                  R                  S\UR	                  SP5      5         GM  f = f7f)`Nr   TrX   zUsing 'count: %s'r  Fr  r  r  r  rx   r   r   r  r  r   TimelineAddEntriesr  TimelineAddToModulemoduleItemsTimelinePinEntryr  TimelineReplaceEntryr  r  r;  r   r   r  r   zretries-api	   r   infz- 'r  r   r
  r  ServerzAPI errors (%s/%s):
%s
rN   
blocked_byrh  logoutr   zRetrying API request as guestr6  z blocked your accountro  z's Tweets are protectedz,Unable to retrieve Tweets from this timeliner#   r  )zprofile-grid-zsearch-grid-zcommunities-grid-r}   )r  zprofile-conversation-zconversationthread-z
tombstone-itemContent	tombstonetombstoneInfotweet_resultsr  pinned_tweet_ids_strz-tweet-r  rw   promotedMetadatazSkipping %s (ad)rW   -r   r-  r  r  r   z7Received Tweet results without 'core' data ... Retryingretweeted_status_resultrT   rO   rv  r  r.  r   rU   rV   z%s:  %s: %squoted_status_resultrA  rQ   zSkipping quote of %s (deleted)zSwitching to 'count: %s'zNo Tweet results (%s/%s)zNo continuation cursor)+r  r    r#   rG   rl   r   r  reverseri   rj   rr   r  r  r  r  r  r  r  LookupErrorr+   floatr   rm   r  r7   rk  cookies_filer  r  r	   r  r  dictrs   endswithinsertr   r%   r   _process_tombstonerE  r   r   )*r   rn  r  r  r4  rH  r  r  r  r  pinned_tweetstop_tweets_maxapi_retriesrX   r  r  rx   r  r   r  r  
instr_typer  r  	api_trieserrsrvr  r   rg   rw   
last_tweetr  eswr  r#   idxrN   r  rtlegacyr   r$   s*                                             r   r  TwitterAPI._pagination_tweets  s     ~~!]]j8#{{t%y}}W55et<<JJLEMMOHHNN.b	:!&IgEt$&&((6("(h//H!%!1!1(!;F:%)%5%5m%DF>""&"2"29"=F;::h/DID<$(L$8$B:$N%/%11?%AL $(<L#'3C'8  $#/#?L)E!&6!2J!%99"#NN5+;<&+I&6G#'<<"'"6#'99'3+0>L 4#'== %g +667GHH%*9%5g%>F *  ?!#22488 GX F)--E-JI'J|T,J,J)-X&l+# I&11x==MM%( / 0 0 !E)eI&6w&?@e, 1 2 2 MM%	"27";<&& +M:D!Ko1F#GH )MM%()**"9-F$.!'!6!::&;TBB $#ZZ0F9 !< '>>)!F#~~h7;;. 0 0V 0&2F&/&7
U +44V<<%%*YYy%9%JU6]%2%44C%EEM%O !- $+l#:3?3HL9=X 6$*3K &a 7 " '8  #"YYy1BU6]*,D)T1$((."YYy17RCCCHKM ! 1(;E"e+ $ 7 7!5#5!7$$%' %g"8_F).;)?E+& =fn5h? % -6#!"()B"CH"M"g-&-g&6G, '	 2 $H-.GH9>y9IG$56$+E !(	 2 ##<= !( ? I "(O (/x'8H+w66=l6Kl 32h>$7v$E$,-@$A !'': ;  08;$4F$B$,-=$> !''7 8 3;;2GF;/ )U2!!&'=!>x!H!&M.9(C#%%24 x(5 @EY?Ox();<.3ii.D{+$m  z -"
!..t44959E%*YY[	'".#1A5H q V}}X'>>78**400'&*&9&9&&A	(#,Y
K	I J  (Dt$!XXh//6/"*$%	&*kk-&C&?*/,KCC#

Sy)9)JQUU6](K1#MN55?h6"&C $
 HH$$%>%.Atyy~OyK7!Q	 >>)4)>Dxx--<<(=> $H 5 504D- $\ :BFDLL)>? HHMM*IJ$':: /2IIK K+..':: /2KKM M  //BD DO(DH $- % $%6   HHNN/9-3??DQGI 	 $ (( *D E $	L % !)!IIi0#--2H2H#O !	!$ $ !<!IIi02 !	!sF  D:h>=B[> [> 8&[> h>[> !Dh>8B'h>$Ad/h>=A=d:h><*d&h>($dh>e7h>$/f'h>Af'-	h><Ah>D h>>B>d Adh>Bd"h>&A%dh>
dh>dh>Ae4/h>3e44h>7'f$h>#f$$h>'
g>1Ag92h>9g>>h>5h;6h>:h;;h>c              #   ,  #    U R                   nUR                  5       =n(       a  XRS'   S U R                  U R                  5      S.n S =pWU R                  U5      US'   U R	                  X5      S   n Uc  US   S   S   S   S   n	OU H  n
X   nM	     US   n	 U	 Hs  nUS	   S
:X  d  M  US    H\  nUS   R                  S5      (       a   US   S   S   S   nSU;   a  Uv   M7  M9  US   R                  S5      (       d  MT  US   S   nM^     Mu     U(       a  UR                  S5      (       d  U(       d  UR                  S 5      $ UR                  U5      US'   GM  ! [
         a    UR                  S 5      s $ f = f! [
         a     M  f = f7f)Nr  rS  r  rx   r   r   r  r  r   r  r  r  zuser-r;  r  r   rT   r  r   )z-1|z0|)r  r  r  r  r  rE  r  r  )r   rn  r  r  r  r  r  r  rx   r  r   r  r   s                r   r  TwitterAPI._pagination_users  s    ~~&&((6("(h))$*B*BC

 !!F"&"2"29"=F;::h/7D	1<$(L$::$F%/%11?%AL  $#y  $#'#7L &=$88!&y!1 +66w??/(-i(8(G)7)99A)C
 $-#4*.J $5"9-889IJJ%*9%5g%>F "2 & V..}==U**400"&"5"5f"=IhC   1**4001 $, % $%sg   A2F5E" 	F
E" F-!FF%FAF"F =F?F  F
FFFFc                    U R                   R                  S5      nUS:X  a  [        R                  " S5      eUR                  R                  S5      nU(       a  S OSnU(       a  [        U[        5      (       a  SU;   a  UR                  S5      u  p%nUS:X  am  [        U SS5      n[        R                  " U5      nS	U S
U S3nXv:  a  [        R                  " U5      eU R                  R                  U5        US-   U l        ODUS:X  a"  S n[        R                  " U5      =(       d    SnOU R                  R                  SU5        U R                   R!                  X4S9  g )N	ratelimitabortzRate limit exceededzx-rate-limit-resetg      N@r   _ratelimit_amtr   zRate limit exceeded (r  r  r  z$Unsupported 'ratelimit' setting '%s')untilseconds)r  r+   r	   r  rk  rl   rG   rH   r  getattrr   r   ri   rm   r  parse_floatr  )	r   r  rlr   r!  r   r\   amtr  s	            r   r  TwitterAPI._handle_ratelimit  s-   ^^"";/=++,ABB  $$%9:$T*R%%#)c*JB3W}d$4a8nnS)-cU!C5::#33C88  %&)Ag#v**3/74  !GL%9r   c                 @   UR                  S5      =(       d    US   S   nUS   R                  S5      S   nUR                  " S5      (       a4  U R                  (       a#  SU l        U R                  R                  SU5        U R                  R                  S	XC5        g )
NrichTextr   r  r  r   zAge-restrictedFz"%s"zSkipping %s ('%s'))rl   r   r  r  ri   rm   rj   )r   r  r  r   r   s        r   r  TwitterAPI._process_tombstone	  s    j)>Yv->G#..s3A6??+,,!!%*"  .+X<r   c                 v    UR                  S5      =(       d    US   S   nS[        [        U5      S-
  5      -   n[        R                  " S5      R                  XQS   5      u  pgU(       a  XaS'   O
U SU 3US'   [        U R                  SS 5      =n(       a)  UR                  S	5      S
    S	U S3U R                  l	        S US'   U$ ! [         ad  n	U R                  R                  R                  SU	R                  R                  U	5        U R                  R                  U5      US'    S n	A	U$ S n	A	ff = f)NrP   rN   zmax_id:r   z\bmax_id:\d+rA  r:  r  r   r   r  r  zTFailed to update 'max_id' search query (%s: %s). Falling back to 'cursor' pagination)rl   rH   rD  r   rd   subnr"  r  r  r  r   ri   rj   r   r   r  )
r   r  r  rw   r   rE  r  nr   r   s
             r   rK  )TwitterAPI._update_variables_search_maxid#	  s8   	Hyy*GeHoh.GHS]1_!55Fww/44*-/HE(-*%+0'6((;	*% 1A4HHvH'',Q/0(1= -"&Ih   	HNN$$./2}}/E/EsL #'.."?"?"GIh	Hs   CC
 

D8AD33D8)
r  r  r  r  r  r  rk  ri   r  r   r   )GET)r.  TN)Nr   NNN).r   r  r  r  r  r   rr  r  r  r  r  r  r"  r*  r  rV  rM  rN  rT  r  r  r^  r[  r4  r9  r  rG  r  r?  r   r  r  r  r
   r  r  r  r  r  rs  r  r  r  r  rK  r  r   r   r   r`   r`     s8   A
F!F)0>>>> > %HN8
	<	@@7>JK7;;; Q	F 	F QF F&6 $ I % JLH\];@ GK8<_LB	*>X:4	=r   r`   i3)r  r  c                 <    U R                   R                  S5        0 $ )NzSLogin with username & password is no longer supported. Use browser cookies instead.)ri   r  )r  r  r  s      r   r  r  <	  s    HHNN 2 3Ir   )+r  commonr   r   r   rW   r   r   r	   r
   r   ry  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r'  r2  r7  r<  rD  rJ  rQ  rW  ra  r~  r  r  r  r  r`   r  r   r   r   <module>r1     s   $ 0 0 $ $ #  @m+ANy ANH	(+ 	(5$4 5/- />	'. 	'8%5 4^J/ ^JB/- /;. ;3!1 3., .
., 
./  ?+ ?L"2 LN 0 NN 0 N< 0 <	B"2 	B7, 7N/, N/b	'- 	'L+ L&6- 6,6!1 6*9I 90V Vr" i" #r   