twitter: add freebind support
This commit is contained in:
parent
4bd3f54f64
commit
930faea09a
2 changed files with 15 additions and 12 deletions
|
@ -62,7 +62,8 @@ export default async function(host, patternMatch, lang, obj) {
|
||||||
r = await twitter({
|
r = await twitter({
|
||||||
id: patternMatch.id,
|
id: patternMatch.id,
|
||||||
index: patternMatch.index - 1,
|
index: patternMatch.index - 1,
|
||||||
toGif: !!obj.twitterGif
|
toGif: !!obj.twitterGif,
|
||||||
|
dispatcher
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case "vk":
|
case "vk":
|
||||||
|
|
|
@ -37,14 +37,15 @@ function bestQuality(arr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
let _cachedToken;
|
let _cachedToken;
|
||||||
const getGuestToken = async (forceReload = false) => {
|
const getGuestToken = async (dispatcher, forceReload = false) => {
|
||||||
if (_cachedToken && !forceReload) {
|
if (_cachedToken && !forceReload) {
|
||||||
return _cachedToken;
|
return _cachedToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
const tokenResponse = await fetch(tokenURL, {
|
const tokenResponse = await fetch(tokenURL, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: commonHeaders
|
headers: commonHeaders,
|
||||||
|
dispatcher
|
||||||
}).then(r => r.status === 200 && r.json()).catch(() => {})
|
}).then(r => r.status === 200 && r.json()).catch(() => {})
|
||||||
|
|
||||||
if (tokenResponse?.guest_token) {
|
if (tokenResponse?.guest_token) {
|
||||||
|
@ -52,7 +53,7 @@ const getGuestToken = async (forceReload = false) => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const requestTweet = async(tweetId, token, cookie) => {
|
const requestTweet = async(dispatcher, tweetId, token, cookie) => {
|
||||||
const graphqlTweetURL = new URL(graphqlURL);
|
const graphqlTweetURL = new URL(graphqlURL);
|
||||||
|
|
||||||
let headers = {
|
let headers = {
|
||||||
|
@ -83,7 +84,7 @@ const requestTweet = async(tweetId, token, cookie) => {
|
||||||
graphqlTweetURL.searchParams.set('features', tweetFeatures);
|
graphqlTweetURL.searchParams.set('features', tweetFeatures);
|
||||||
graphqlTweetURL.searchParams.set('fieldToggles', tweetFieldToggles);
|
graphqlTweetURL.searchParams.set('fieldToggles', tweetFieldToggles);
|
||||||
|
|
||||||
let result = await fetch(graphqlTweetURL, { headers });
|
let result = await fetch(graphqlTweetURL, { headers, dispatcher });
|
||||||
updateCookie(cookie, result.headers);
|
updateCookie(cookie, result.headers);
|
||||||
|
|
||||||
// we might have been missing the `ct0` cookie, retry
|
// we might have been missing the `ct0` cookie, retry
|
||||||
|
@ -92,25 +93,26 @@ const requestTweet = async(tweetId, token, cookie) => {
|
||||||
headers: {
|
headers: {
|
||||||
...headers,
|
...headers,
|
||||||
'x-csrf-token': cookie.values().ct0
|
'x-csrf-token': cookie.values().ct0
|
||||||
}
|
},
|
||||||
|
dispatcher
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
export default async function({ id, index, toGif }) {
|
export default async function({ id, index, toGif, dispatcher }) {
|
||||||
const cookie = await getCookie('twitter');
|
const cookie = await getCookie('twitter');
|
||||||
|
|
||||||
let guestToken = await getGuestToken();
|
let guestToken = await getGuestToken(dispatcher);
|
||||||
if (!guestToken) return { error: 'ErrorCouldntFetch' };
|
if (!guestToken) return { error: 'ErrorCouldntFetch' };
|
||||||
|
|
||||||
let tweet = await requestTweet(id, guestToken);
|
let tweet = await requestTweet(dispatcher, id, guestToken);
|
||||||
|
|
||||||
// get new token & retry if old one expired
|
// get new token & retry if old one expired
|
||||||
if ([403, 429].includes(tweet.status)) {
|
if ([403, 429].includes(tweet.status)) {
|
||||||
guestToken = await getGuestToken(true);
|
guestToken = await getGuestToken(dispatcher, true);
|
||||||
tweet = await requestTweet(id, guestToken)
|
tweet = await requestTweet(dispatcher, id, guestToken)
|
||||||
}
|
}
|
||||||
|
|
||||||
tweet = await tweet.json();
|
tweet = await tweet.json();
|
||||||
|
@ -124,7 +126,7 @@ export default async function({ id, index, toGif }) {
|
||||||
return { error: 'ErrorTweetProtected' }
|
return { error: 'ErrorTweetProtected' }
|
||||||
case "NsfwLoggedOut":
|
case "NsfwLoggedOut":
|
||||||
if (cookie) {
|
if (cookie) {
|
||||||
tweet = await requestTweet(id, guestToken, cookie);
|
tweet = await requestTweet(dispatcher, id, guestToken, cookie);
|
||||||
tweet = await tweet.json();
|
tweet = await tweet.json();
|
||||||
tweetTypename = tweet?.data?.tweetResult?.result?.__typename;
|
tweetTypename = tweet?.data?.tweetResult?.result?.__typename;
|
||||||
} else return { error: 'ErrorTweetNSFW' }
|
} else return { error: 'ErrorTweetNSFW' }
|
||||||
|
|
Loading…
Reference in a new issue