Create twitter.js
Browse files- lib/twitter/twitter.js +41 -0
lib/twitter/twitter.js
ADDED
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import got from 'got';
|
2 |
+
import * as cheerio from 'cheerio';
|
3 |
+
import { TwitterDlArgsSchema, TwitterDLResponseSchema, TwitterDlSchema } from '../types/twitter-v1.js';
|
4 |
+
import { DEFAULT_HEADERS } from '../constant.js';
|
5 |
+
import { stringifyCookies, generateTokenId } from './util.js';
|
6 |
+
|
7 |
+
export async function twitterdl(url) {
|
8 |
+
TwitterDlArgsSchema.parse([url]);
|
9 |
+
|
10 |
+
const idMatch = url.match(/status\/(\d+)/) || url.match(/(\d+)/);
|
11 |
+
if (!idMatch) throw new Error("Invalid Twitter URL: Cannot extract tweet ID.");
|
12 |
+
|
13 |
+
const id = idMatch[1];
|
14 |
+
const token = generateTokenId(id);
|
15 |
+
|
16 |
+
try {
|
17 |
+
const data = await got(`https://api.redketchup.io/tweetAttachments-v6?id=${encodeURIComponent(token)}`, {
|
18 |
+
headers: {
|
19 |
+
...DEFAULT_HEADERS,
|
20 |
+
origin: 'https://redketchup.io',
|
21 |
+
referer: 'https://redketchup.io/',
|
22 |
+
}
|
23 |
+
}).json();
|
24 |
+
|
25 |
+
const json = TwitterDLResponseSchema.parse(data);
|
26 |
+
const media = json.includes?.media?.find((m) => m.type === 'video');
|
27 |
+
|
28 |
+
if (!media || !media.variants) {
|
29 |
+
throw new Error("No video found in this tweet.");
|
30 |
+
}
|
31 |
+
|
32 |
+
const result = media.variants
|
33 |
+
.filter((variant) => variant.content_type !== 'application/x-mpegURL')
|
34 |
+
.filter(Boolean);
|
35 |
+
|
36 |
+
return TwitterDlSchema.parse(result);
|
37 |
+
} catch (error) {
|
38 |
+
console.error("Error fetching Twitter video:", error.message);
|
39 |
+
throw new Error("Failed to fetch Twitter video. Please try again later.");
|
40 |
+
}
|
41 |
+
}
|