Update lib/facebook.js
Browse files- lib/facebook.js +41 -81
lib/facebook.js
CHANGED
@@ -1,105 +1,65 @@
|
|
1 |
-
import got from
|
2 |
-
import * as cheerio from
|
3 |
-
import { FacebookDlArgsSchema,
|
4 |
-
import { DEFAULT_HEADERS } from
|
5 |
|
6 |
-
export async function facebookdl(url) {
|
7 |
FacebookDlArgsSchema.parse(arguments);
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
const
|
14 |
-
|
15 |
-
|
16 |
-
|
|
|
17 |
|
18 |
const form = {
|
19 |
k_exp,
|
20 |
k_token,
|
21 |
q: url,
|
22 |
-
lang:
|
23 |
-
web:
|
24 |
-
v:
|
25 |
-
w:
|
26 |
};
|
|
|
27 |
const data = await got.post(k_url_search, {
|
28 |
-
headers: {
|
29 |
-
|
30 |
-
referer: 'https://fdownloader.net/'
|
31 |
-
},
|
32 |
-
form
|
33 |
}).json();
|
34 |
|
35 |
const $ = cheerio.load(data.data);
|
36 |
|
37 |
-
const
|
38 |
-
const
|
39 |
-
|
40 |
-
|
41 |
-
const thumbnail = $('.thumbnail > .image-fb > img').attr('src');
|
42 |
-
const duration = $('.content > .clearfix > p').text() || undefined;
|
43 |
-
const video = $('table.table').eq(0).find('tbody > tr').map((_, el) => {
|
44 |
const $el = $(el);
|
45 |
-
const
|
46 |
-
const
|
47 |
-
|
48 |
-
if (
|
49 |
-
return {
|
50 |
-
quality,
|
51 |
-
download: () => Promise.resolve(url)
|
52 |
-
};
|
53 |
}
|
54 |
-
// TODO:
|
55 |
-
return false;
|
56 |
}).toArray().filter(Boolean);
|
57 |
|
58 |
const audio = [];
|
59 |
-
const audioUrl = $(
|
60 |
-
|
61 |
-
quality:
|
62 |
-
|
63 |
-
|
|
|
64 |
|
65 |
-
const result = {
|
66 |
-
thumbnail,
|
67 |
-
duration,
|
68 |
-
video,
|
69 |
-
audio
|
70 |
-
};
|
71 |
console.log(result);
|
72 |
return FacebookDlSchema.parse(result);
|
73 |
}
|
74 |
|
75 |
-
export async function convert(
|
76 |
-
url,
|
77 |
-
|
78 |
-
ftype,
|
79 |
-
videoUrl,
|
80 |
-
videoType,
|
81 |
-
videoCodec,
|
82 |
-
audioUrl,
|
83 |
-
audioType,
|
84 |
-
fquality,
|
85 |
-
fname,
|
86 |
-
exp,
|
87 |
-
token
|
88 |
-
) {
|
89 |
-
const data = await got.post(url, {
|
90 |
-
form: {
|
91 |
-
ftype,
|
92 |
-
v_id,
|
93 |
-
videoUrl,
|
94 |
-
videoType,
|
95 |
-
videoCodec,
|
96 |
-
audioUrl,
|
97 |
-
audioType,
|
98 |
-
fquality,
|
99 |
-
fname,
|
100 |
-
exp,
|
101 |
-
token,
|
102 |
-
cv: 'v2'
|
103 |
-
}
|
104 |
});
|
105 |
-
}
|
|
|
1 |
+
import got from "got";
|
2 |
+
import * as cheerio from "cheerio";
|
3 |
+
import { FacebookDlArgsSchema, FacebookDlSchema } from "../lib/types/facebook-v1.js";
|
4 |
+
import { DEFAULT_HEADERS } from "./constant.js";
|
5 |
|
6 |
+
export default async function facebookdl(url) {
|
7 |
FacebookDlArgsSchema.parse(arguments);
|
8 |
+
|
9 |
+
const html = await got("https://fdownloader.net/en", { headers: { ...DEFAULT_HEADERS } }).text();
|
10 |
+
|
11 |
+
const k_url_search = /k_url_search="(.*?)"/.exec(html)?.[1] || null;
|
12 |
+
const k_exp = /k_exp="(.*?)"/.exec(html)?.[1] || null;
|
13 |
+
const k_token = /k_token="(.*?)"/.exec(html)?.[1] || null;
|
14 |
+
|
15 |
+
if (!k_url_search || !k_exp || !k_token) {
|
16 |
+
throw new Error("Failed to extract necessary tokens.");
|
17 |
+
}
|
18 |
|
19 |
const form = {
|
20 |
k_exp,
|
21 |
k_token,
|
22 |
q: url,
|
23 |
+
lang: "en",
|
24 |
+
web: "fdownloader.net",
|
25 |
+
v: "v2",
|
26 |
+
w: "",
|
27 |
};
|
28 |
+
|
29 |
const data = await got.post(k_url_search, {
|
30 |
+
headers: { ...DEFAULT_HEADERS, referer: "https://fdownloader.net/" },
|
31 |
+
form,
|
|
|
|
|
|
|
32 |
}).json();
|
33 |
|
34 |
const $ = cheerio.load(data.data);
|
35 |
|
36 |
+
const thumbnail = $(".thumbnail > .image-fb > img").attr("src") || null;
|
37 |
+
const duration = $(".content > .clearfix > p").text() || null;
|
38 |
+
|
39 |
+
const video = $("table.table").eq(0).find("tbody > tr").map((_, el) => {
|
|
|
|
|
|
|
40 |
const $el = $(el);
|
41 |
+
const quality = $el.find("td").eq(0).text().trim();
|
42 |
+
const downloadUrl = $el.find("td").eq(2).find("a").attr("href");
|
43 |
+
|
44 |
+
if (downloadUrl) {
|
45 |
+
return { quality, download: () => Promise.resolve(downloadUrl) };
|
|
|
|
|
|
|
46 |
}
|
|
|
|
|
47 |
}).toArray().filter(Boolean);
|
48 |
|
49 |
const audio = [];
|
50 |
+
const audioUrl = $("#audioUrl").attr("value") || null;
|
51 |
+
if (audioUrl) {
|
52 |
+
audio.push({ quality: "128kbps", download: () => Promise.resolve(audioUrl) });
|
53 |
+
}
|
54 |
+
|
55 |
+
const result = { thumbnail, duration, video, audio };
|
56 |
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
console.log(result);
|
58 |
return FacebookDlSchema.parse(result);
|
59 |
}
|
60 |
|
61 |
+
export async function convert(url, v_id, ftype, videoUrl, videoType, videoCodec, audioUrl, audioType, fquality, fname, exp, token) {
|
62 |
+
return got.post(url, {
|
63 |
+
form: { ftype, v_id, videoUrl, videoType, videoCodec, audioUrl, audioType, fquality, fname, exp, token, cv: "v2" },
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
});
|
65 |
+
}
|