@@ -31,14 +31,20 @@ const commonHeaders = {
31
31
"accept-language" : "en"
32
32
}
33
33
34
- const getGuestToken = async ( ) => {
34
+ let _cachedToken
35
+ const getGuestToken = async ( forceReload = false ) => {
36
+ if ( _cachedToken && ! forceReload ) {
37
+ return _cachedToken ;
38
+ }
39
+
35
40
const tokenResponse = await fetch (
36
41
'https://api.twitter.com/1.1/guest/activate.json' ,
37
42
{ method : 'POST' , headers : commonHeaders }
38
43
) . then ( r => r . status === 200 && r . json ( ) ) . catch ( ( ) => { } )
39
44
40
- if ( tokenResponse ?. guest_token )
41
- return tokenResponse . guest_token
45
+ if ( tokenResponse ?. guest_token ) {
46
+ return _cachedToken = tokenResponse . guest_token
47
+ }
42
48
}
43
49
44
50
const requestTweet = ( tweetId , token ) => {
@@ -69,8 +75,15 @@ export default async function({ id }) {
69
75
let guestToken = await getGuestToken ( ) ;
70
76
if ( ! guestToken ) return { error : 'ErrorCouldntFetch' } ;
71
77
72
- const tweet = await requestTweet ( id , guestToken ) . then ( t => t . json ( ) ) ;
73
-
78
+ let tweet = await requestTweet ( id , guestToken ) ;
79
+
80
+ if ( [ 403 , 429 ] . includes ( tweet . status ) ) { // get new token & retry
81
+ guestToken = await getGuestToken ( true ) ;
82
+ tweet = await requestTweet ( id , guestToken ) ;
83
+ }
84
+
85
+ tweet = await tweet . json ( ) ;
86
+
74
87
// {"data":{"tweetResult":{"result":{"__typename":"TweetUnavailable","reason":"Protected"}}}}
75
88
if ( tweet ?. data ?. tweetResult ?. result ?. __typename !== "Tweet" ) {
76
89
return { error : 'ErrorTweetUnavailable' }
0 commit comments