randydev commited on
Commit
3929273
·
verified ·
1 Parent(s): 619e592

Create twitter.js

Browse files
Files changed (1) hide show
  1. 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
+ }