bilaku commited on
Commit
03f5af4
·
verified ·
1 Parent(s): e819a54

Update tt.js

Browse files
Files changed (1) hide show
  1. tt.js +372 -80
tt.js CHANGED
@@ -1,96 +1,388 @@
1
- const axios = require("axios");
2
- const cheerio = require("cheerio");
3
 
4
- async function dxzTikTokDownload(url) {
5
- try {
6
- if (!url) throw new Error("Where is the link?");
7
- if (!/tiktok\.com/i.test(url)) throw new Error("Invalid TikTok URL");
8
-
9
- const { data: homeHtml, headers: homeHeaders } = await axios.get("https://musicaldown.com/en", {
10
- headers: {
11
- accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
12
- "accept-language": "en-US,en;q=0.9",
13
- "user-agent": "Mozilla/5.0 (Linux; Android 15; SM-F958 Build/AP3A.240905.015) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.86 Mobile Safari/537.36",
14
- referer: "https://musicaldown.com/",
15
- },
16
- timeout: 60000,
17
- });
18
 
19
- const cookie = homeHeaders["set-cookie"]
20
- ? homeHeaders["set-cookie"].map((c) => c.split(";")[0]).join("; ")
21
- : "";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
 
23
- const $ = cheerio.load(homeHtml);
24
- const formData = {};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
 
26
- $("#submit-form input").each((_, el) => {
27
- const name = $(el).attr("name");
28
- const value = $(el).attr("value");
29
- if (name) formData[name] = value || "";
30
- });
 
 
 
 
 
 
 
 
 
 
 
31
 
32
- const urlFieldName = Object.keys(formData).find((k) => !formData[k]);
33
- if (urlFieldName) formData[urlFieldName] = url;
 
 
 
 
 
 
 
 
 
 
 
 
34
 
35
- const payload = new URLSearchParams(formData).toString();
 
36
 
37
- const { data: resultHtml } = await axios.post("https://musicaldown.com/download", payload, {
38
- headers: {
39
- "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
40
- cookie,
41
- origin: "https://musicaldown.com",
42
- referer: "https://musicaldown.com/",
43
- accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
44
- "accept-language": "en-US,en;q=0.9",
45
- "user-agent": "Mozilla/5.0 (Linux; Android 15; SM-F958 Build/AP3A.240905.015) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.86 Mobile Safari/537.36",
46
- },
47
- timeout: 60000,
48
  });
 
49
 
50
- const $$ = cheerio.load(resultHtml);
51
-
52
- const title = $$(".video-desc").text().trim() || null;
53
- const username = $$(".video-author b").text().trim() || null;
54
- const avatar = $$(".img-area img").attr("src") || null;
55
- const styleBg = $$(".video-header").attr("style") || "";
56
- const cover = styleBg.match(/url\((.*?)\)/)?.[1] || null;
57
-
58
- const downloads = [];
59
- $$("a.download").each((_, el) => {
60
- const btn = $$(el);
61
- downloads.push({
62
- type: btn.attr("data-event")?.replace("_download_click", "") || null,
63
- quality: btn.text().trim() || null,
64
- url: btn.attr("href") || null,
65
- });
66
- });
67
 
68
- return {
69
- success: true,
70
- result: {
71
- title,
72
- author: {
73
- username,
74
- avatar,
75
- },
76
- cover,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  },
78
- downloads: downloads.filter((x) => x.url),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  };
80
- } catch (err) {
81
- return {
82
- success: false,
83
- message: "Failed to download TikTok (V2)",
84
- error:
85
- err?.response?.data?.message ||
86
- err?.response?.data?.error ||
87
- err.message,
88
- status: err?.response?.status || null,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  };
 
 
90
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91
  }
92
 
93
- // PUT TIKTOK LINK HERE
94
- dxzTikTokDownload("https://vt.tiktok.com/ZSaKKtvN1/")
95
- .then((res) => console.log(JSON.stringify(res, null, 2)))
96
- .catch(console.error);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const axios = require('axios');
2
+ const FormData = require('form-data');
3
 
4
+ function generateRandomDOB() {
5
+ const year = Math.floor(Math.random() * (2005 - 1970 + 1)) + 1970;
6
+ const month = String(Math.floor(Math.random() * 12) + 1).padStart(2, '0');
7
+ const day = String(Math.floor(Math.random() * 28) + 1).padStart(2, '0');
8
+ return `${year}-${month}-${day}`;
9
+ }
 
 
 
 
 
 
 
 
10
 
11
+ async function getToken() {
12
+ const url = 'https://www.meta.ai/api/graphql/';
13
+
14
+ const form = new FormData();
15
+ form.append('av', '0');
16
+ form.append('__user', '0');
17
+ form.append('__a', '1');
18
+ form.append('__req', 't');
19
+ form.append('__hs', '20477.HYP:kadabra_pkg.2.1...0');
20
+ form.append('dpr', '1');
21
+ form.append('__ccg', 'GOOD');
22
+ form.append('__rev', '1032408219');
23
+ form.append('__s', '95uk9b:pk21np:5pp1x5');
24
+ form.append('__hsi', '7598786093641174910');
25
+ form.append('__dyn', '7xeUjG1mxu1syUqxemh0no6u5U4e2C1vzEdE98K360CEbo1nEhw2nVEtwMw6ywaq221FwpUO0n24oaEnxO0Bo7O2l0Fwqo31w9O1lwlE-U2zxe2GewbS361qw82dUlwhE5m1pwg8fU1ck9zo2NwkQ0Lo6-m362WE3Gwxyo6O2G3W1nwOwbWEb8uwm85K2G1Rwgo6218wkE3PwiE6S');
26
+ form.append('__csr', 'gngZN5tGzh6KyqkyLRO4lFBGExlV9bLGy4Fk_qmECKEly9WQ7pEhwEwEwqEtzJ2t1S5U8801tPE4NcK06bobobUjw9Tw4Je6J0m4S4Q58b6610V2ci1ayci6E5J6VqAxG4Ejh1wBgG0Ro3Gzo1vXKi0TE0Au9U0mb8m9ho42azd09B05f2UKN0n6iw6ww7VIw1F86LTUOqn40toW3y1TwgE2YzoK5gI2WcDg0ufw4exC01GDK6Vo0-248qw5Ww20o1Z81JHBw1eN5gN5g0gJw-wNpoGUhg');
27
+ form.append('__hsdp', 'gcYYGe83Gaw9ycgPAhHu8gwx7EIZAoHaaymfxeWyWx2cxa4A7WzF8dpQu5omK68hwww5Dw5UwdO7E29wfu8g0xbwLw9W2W0Q84m2a2C7k2q6o3TzU1sU7S');
28
+ form.append('__hblp', '08Weyag4aEtAhHipA88hy8Cp3EjJzWx3WyRF6Bz8ix91yqEBGi3mt7xm5Gg-8x669Umxh0rE0Ai0T8uwuU11ox2U4-0EU2dwbq1DgdkfxGE7C1mwho8EaoXz45ubG4VoG0X8-0na1-wQwxwdy');
29
+ form.append('__sjsp', 'gcYBiFi20WyE2oz4cUOu8gpovQ');
30
+ form.append('__comet_req', '72');
31
+ form.append('lsd', 'AdJzP_b_qoc');
32
+ form.append('jazoest', '21052');
33
+ form.append('__spin_r', '1032408219');
34
+ form.append('__spin_b', 'trunk');
35
+ form.append('__spin_t', '1769230257');
36
+ form.append('__jssesw', '2');
37
+ form.append('__crn', 'comet.kadabra.KadabraAssistantRoute');
38
+ form.append('qpl_active_flow_ids', '947272388');
39
+ form.append('fb_api_caller_class', 'RelayModern');
40
+ form.append('fb_api_req_friendly_name', 'useKadabraAcceptTOSForTempUserMutation');
41
+ form.append('server_timestamps', 'true');
42
+ form.append('variables', JSON.stringify({
43
+ "dob": generateRandomDOB(),
44
+ "__relay_internal__pv__AbraQPDocUploadNuxTriggerNamerelayprovider": "meta_dot_ai_abra_web_doc_upload_nux_tour",
45
+ "__relay_internal__pv__AbraSurfaceNuxIDrelayprovider": "12177"
46
+ }));
47
+ form.append('doc_id', '25102616396026783');
48
+ form.append('fb_api_analytics_tags', '["qpl_active_flow_ids=947272388"]');
49
 
50
+ const headers = {
51
+ ...form.getHeaders(),
52
+ 'host': 'www.meta.ai',
53
+ 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0',
54
+ 'accept': '*/*',
55
+ 'accept-language': 'en-US,en;q=0.9',
56
+ 'referer': 'https://www.meta.ai/',
57
+ 'x-fb-friendly-name': 'useKadabraAcceptTOSForTempUserMutation',
58
+ 'x-fb-lsd': 'AdJzP_b_qoc',
59
+ 'x-asbd-id': '359341',
60
+ 'origin': 'https://www.meta.ai',
61
+ 'cookie': 'datr=sU90afPSYelxqmSaKqer58Hc; wd=1366x643',
62
+ 'sec-fetch-dest': 'empty',
63
+ 'sec-fetch-mode': 'cors',
64
+ 'sec-fetch-site': 'same-origin',
65
+ 'priority': 'u=0'
66
+ };
67
 
68
+ try {
69
+ const response = await axios.post(url, form, { headers });
70
+
71
+ if (response.data && response.data.data && response.data.data.xab_abra_accept_terms_of_service) {
72
+ const authData = response.data.data.xab_abra_accept_terms_of_service.new_temp_user_auth;
73
+ return {
74
+ access_token: authData.access_token,
75
+ graph_api_url: authData.graph_api_url,
76
+ user_id: authData.new_user.id
77
+ };
78
+ }
79
+ throw new Error('Failed to get token');
80
+ } catch (error) {
81
+ throw error;
82
+ }
83
+ }
84
 
85
+ function deepClean(obj) {
86
+ if (obj && typeof obj === 'object') {
87
+ if (Array.isArray(obj)) {
88
+ return obj.map(deepClean);
89
+ } else {
90
+ return Object.fromEntries(
91
+ Object.entries(obj)
92
+ .filter(([_, v]) => v !== null && v !== undefined)
93
+ .map(([k, v]) => [k, deepClean(v)])
94
+ );
95
+ }
96
+ }
97
+ return obj;
98
+ }
99
 
100
+ async function metaAI(text, prompt, accessToken) {
101
+ const url = 'https://graph.meta.ai/graphql?locale=user';
102
 
103
+ const generateRandomId = () => Math.floor(Math.random() * 9e18).toString();
104
+ const generateUUID = () => {
105
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
106
+ const r = Math.random() * 16 | 0;
107
+ const v = c === 'x' ? r : (r & 0x3 | 0x8);
108
+ return v.toString(16);
 
 
 
 
 
109
  });
110
+ };
111
 
112
+ const externalConversationId = generateUUID();
113
+ const threadSessionId = generateUUID();
114
+ const qplJoinId = Math.random().toString(16).substring(2, 19);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
 
116
+ async function sendMessage(message, isNewConversation, offlineThreadingId) {
117
+ const variables = {
118
+ message: { sensitive_string_value: message },
119
+ externalConversationId: externalConversationId,
120
+ offlineThreadingId: offlineThreadingId,
121
+ threadSessionId: threadSessionId,
122
+ isNewConversation: isNewConversation,
123
+ suggestedPromptIndex: null,
124
+ promptPrefix: null,
125
+ entrypoint: "KADABRA__CHAT__UNIFIED_INPUT_BAR",
126
+ attachments: [],
127
+ attachmentsV2: [],
128
+ activeMediaSets: [],
129
+ activeCardVersions: [],
130
+ activeArtifactVersion: null,
131
+ userUploadEditModeInput: null,
132
+ reelComposeInput: null,
133
+ qplJoinId: qplJoinId,
134
+ sourceRemixPostId: null,
135
+ gkPlannerOrReasoningEnabled: false,
136
+ selectedModel: "BASIC_OPTION",
137
+ conversationMode: null,
138
+ selectedAgentType: "PLANNER",
139
+ agentSettings: null,
140
+ conversationStarterId: null,
141
+ promptType: null,
142
+ artifactRewriteOptions: null,
143
+ imagineOperationRequest: null,
144
+ imagineClientOptions: { orientation: "VERTICAL" },
145
+ spaceId: null,
146
+ sparkSnapshotId: null,
147
+ topicPageId: null,
148
+ includeSpace: false,
149
+ storybookId: null,
150
+ messagePersistentInput: {
151
+ attachment_size: null,
152
+ attachment_type: null,
153
+ bot_message_offline_threading_id: (BigInt(offlineThreadingId) + 1n).toString(),
154
+ conversation_mode: null,
155
+ external_conversation_id: externalConversationId,
156
+ is_new_conversation: isNewConversation,
157
+ meta_ai_entry_point: "KADABRA__CHAT__UNIFIED_INPUT_BAR",
158
+ offline_threading_id: offlineThreadingId,
159
+ prompt_id: null,
160
+ prompt_session_id: threadSessionId
161
+ },
162
+ alakazam_enabled: true,
163
+ skipInFlightMessageWithParams: null,
164
+ __relay_internal__pv__KadabraSocialSearchEnabledrelayprovider: false,
165
+ __relay_internal__pv__KadabraZeitgeistEnabledrelayprovider: false,
166
+ __relay_internal__pv__alakazam_enabledrelayprovider: true,
167
+ __relay_internal__pv__sp_kadabra_survey_invitationrelayprovider: true,
168
+ __relay_internal__pv__enable_kadabra_partial_resultsrelayprovider: false,
169
+ __relay_internal__pv__AbraArtifactsEnabledrelayprovider: false,
170
+ __relay_internal__pv__KadabraMemoryEnabledrelayprovider: false,
171
+ __relay_internal__pv__AbraPlannerEnabledrelayprovider: false,
172
+ __relay_internal__pv__AbraWidgetsEnabledrelayprovider: false,
173
+ __relay_internal__pv__KadabraDeepResearchEnabledrelayprovider: false,
174
+ __relay_internal__pv__KadabraThinkHarderEnabledrelayprovider: false,
175
+ __relay_internal__pv__KadabraVergeEnabledrelayprovider: false,
176
+ __relay_internal__pv__KadabraSpacesEnabledrelayprovider: false,
177
+ __relay_internal__pv__KadabraProductSearchEnabledrelayprovider: false,
178
+ __relay_internal__pv__KadabraAreServiceEnabledrelayprovider: false,
179
+ __relay_internal__pv__kadabra_render_reasoning_response_statesrelayprovider: true,
180
+ __relay_internal__pv__kadabra_reasoning_cotrelayprovider: false,
181
+ __relay_internal__pv__AbraSearchInlineReferencesEnabledrelayprovider: true,
182
+ __relay_internal__pv__AbraComposedTextWidgetsrelayprovider: true,
183
+ __relay_internal__pv__KadabraNewCitationsEnabledrelayprovider: true,
184
+ __relay_internal__pv__WebPixelRatiorelayprovider: 1,
185
+ __relay_internal__pv__KadabraVideoDeliveryRequestrelayprovider: {
186
+ dash_manifest_requests: [{}],
187
+ progressive_url_requests: [{ quality: "HD" }, { quality: "SD" }]
188
  },
189
+ __relay_internal__pv__KadabraWidgetsRedesignEnabledrelayprovider: false,
190
+ __relay_internal__pv__kadabra_enable_send_message_retryrelayprovider: true,
191
+ __relay_internal__pv__KadabraEmailCalendarIntegrationrelayprovider: false,
192
+ __relay_internal__pv__ClippyUIrelayprovider: false,
193
+ __relay_internal__pv__kadabra_reels_connect_featuresrelayprovider: false,
194
+ __relay_internal__pv__AbraBugNubrelayprovider: false,
195
+ __relay_internal__pv__AbraRedteamingrelayprovider: false,
196
+ __relay_internal__pv__AbraDebugDevOnlyrelayprovider: false,
197
+ __relay_internal__pv__kadabra_enable_open_in_editor_message_actionrelayprovider: false,
198
+ __relay_internal__pv__BloksDeviceContextrelayprovider: { pixel_ratio: 1 },
199
+ __relay_internal__pv__AbraThreadsEnabledrelayprovider: false,
200
+ __relay_internal__pv__kadabra_story_builder_enabledrelayprovider: false,
201
+ __relay_internal__pv__kadabra_imagine_canvas_enable_dev_settingsrelayprovider: false,
202
+ __relay_internal__pv__kadabra_create_media_deletionrelayprovider: false,
203
+ __relay_internal__pv__kadabra_moodboardrelayprovider: false,
204
+ __relay_internal__pv__AbraArtifactDragImagineFromConversationrelayprovider: false,
205
+ __relay_internal__pv__kadabra_media_item_renderer_heightrelayprovider: 545,
206
+ __relay_internal__pv__kadabra_media_item_renderer_widthrelayprovider: 620,
207
+ __relay_internal__pv__AbraQPDocUploadNuxTriggerNamerelayprovider: "meta_dot_ai_abra_web_doc_upload_nux_tour",
208
+ __relay_internal__pv__AbraSurfaceNuxIDrelayprovider: "12177",
209
+ __relay_internal__pv__KadabraConversationRenamingrelayprovider: true,
210
+ __relay_internal__pv__AbraIsLoggedOutrelayprovider: true,
211
+ __relay_internal__pv__KadabraCanvasDisplayHeaderV2relayprovider: true,
212
+ __relay_internal__pv__AbraArtifactEditorDebugModerelayprovider: false,
213
+ __relay_internal__pv__AbraArtifactEditorDownloadHTMLEnabledrelayprovider: false,
214
+ __relay_internal__pv__kadabra_create_row_hover_optionsrelayprovider: false,
215
+ __relay_internal__pv__kadabra_media_info_pillsrelayprovider: true,
216
+ __relay_internal__pv__KadabraConcordInternalProfileBadgeEnabledrelayprovider: false,
217
+ __relay_internal__pv__KadabraSocialGraphrelayprovider: false
218
  };
219
+
220
+ const form = new FormData();
221
+ form.append('av', '0');
222
+ form.append('access_token', accessToken);
223
+ form.append('__user', '0');
224
+ form.append('__a', '1');
225
+ form.append('__req', 'v');
226
+ form.append('__hs', '20477.HYP:kadabra_pkg.2.1...0');
227
+ form.append('dpr', '1');
228
+ form.append('__ccg', 'GOOD');
229
+ form.append('__rev', '1032408219');
230
+ form.append('__s', '95uk9b:pk21np:5pp1x5');
231
+ form.append('__hsi', '7598786093641174910');
232
+ form.append('__dyn', '7xeUjG1mxu1syUqxemh0no6u5U4e2C1vzEdE98K360CEbo1nEhw2nVEtwMw6ywaq221FwpUO0n24oaEnxO0Bo7O2l0Fwqo31w9O1lwlE-U2zxe2GewbS361qw82dUlwhE5m1pwg8fU1ck9zo2NwkQ0Lo6-m362WE3Gwxyo6O2G3W1nwOwbWEb8uwm85K2G1Rwgo6218wkE3PwiE6S');
233
+ form.append('__csr', 'gngZN5tGzh6KyqkyLRO4lFBGExlV9bLGy4Fk_qmECKEly9WQ7pEhwEwEwqEtzJ2t1S5U8801tPE4NcK06bobobUjw9Tw4Je6J0m4S4Q58b6610V2ci1ayci6E5J6VqAxG4Ejh1wBgG0Ro3Gzo1vXKi0TE0Au9U0mb8m9ho42azd09B05f2UKN0n6iw6ww7VIw1F86LTUOqn40toW3y1TwgE2YzoK5gI2WcDg0ufw4exC01GDK6Vo0-248qw5Ww20o1Z81JHBw1eN5gN5g0gJw-wNpoGUhg');
234
+ form.append('__hsdp', 'gcYYGe83Gaw9ycgPAhHu8gwx7EIZAoHaaymfxeWyWx2cxa4A7WzF8dpQu5omK68hwww5Dw5UwdO7E29wfu8g0xbwLw9W2W0Q84m2a2C7k2q6o3TzU1sU7S');
235
+ form.append('__hblp', '08Weyag4aEtAhHipA88hy8Cp3EjJzWx3WyRF6Bz8ix91yqEBGi3mt7xm5Gg-8x669Umxh0rE0Ai0T8uwuU11ox2U4-0EU2dwbq1DgdkfxGE7C1mwho8EaoXz45ubG4VoG0X8-0na1-wQwxwdy');
236
+ form.append('__sjsp', 'gcYBiFi20WyE2oz4cUOu8gpovQ');
237
+ form.append('__comet_req', '72');
238
+ form.append('lsd', 'AdJzP_b_qoc');
239
+ form.append('jazoest', '21052');
240
+ form.append('__spin_r', '1032408219');
241
+ form.append('__spin_b', 'trunk');
242
+ form.append('__spin_t', '1769230257');
243
+ form.append('__jssesw', '2');
244
+ form.append('__crn', 'comet.kadabra.KadabraAssistantRoute');
245
+ form.append('fb_api_caller_class', 'RelayModern');
246
+ form.append('fb_api_req_friendly_name', 'useKadabraSendMessageMutation');
247
+ form.append('server_timestamps', 'true');
248
+ form.append('variables', JSON.stringify(variables));
249
+ form.append('doc_id', '24895882500088854');
250
+
251
+ const headers = {
252
+ ...form.getHeaders(),
253
+ 'host': 'graph.meta.ai',
254
+ 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0',
255
+ 'accept': '*/*',
256
+ 'accept-language': 'en-US,en;q=0.9',
257
+ 'referer': 'https://www.meta.ai/',
258
+ 'origin': 'https://www.meta.ai',
259
+ 'cookie': 'datr=sU90afPSYelxqmSaKqer58Hc; wd=1366x643',
260
+ 'sec-fetch-dest': 'empty',
261
+ 'sec-fetch-mode': 'cors',
262
+ 'sec-fetch-site': 'same-site'
263
  };
264
+
265
+ return await axios.post(url, form, { headers, responseType: 'text' });
266
  }
267
+
268
+ let response;
269
+
270
+ if (prompt && prompt.trim() !== '') {
271
+ const offlineThreadingId1 = generateRandomId();
272
+ await sendMessage(prompt, true, offlineThreadingId1);
273
+
274
+ await new Promise(resolve => setTimeout(resolve, 1000));
275
+
276
+ const offlineThreadingId2 = generateRandomId();
277
+ response = await sendMessage(text, false, offlineThreadingId2);
278
+ } else {
279
+ const offlineThreadingId = generateRandomId();
280
+ response = await sendMessage(text, true, offlineThreadingId);
281
+ }
282
+
283
+ const lines = response.data.split('\n').filter(line => line.trim());
284
+ const parsedData = lines.map(line => {
285
+ try {
286
+ return JSON.parse(line);
287
+ } catch {
288
+ return null;
289
+ }
290
+ }).filter(Boolean);
291
+
292
+ let finalData = null;
293
+
294
+ for (let i = parsedData.length - 1; i >= 0; i--) {
295
+ const item = parsedData[i];
296
+ const node = item?.data?.node?.bot_response_message;
297
+
298
+ if (node) {
299
+ const hasReels = node?.has_reels?.__typename === "XFBAbraReels";
300
+ const reels = node?.content?.card?.reels_v2;
301
+
302
+ if ((hasReels && reels) || item?.extensions?.is_final) {
303
+ finalData = item;
304
+ break;
305
+ }
306
+ }
307
+ }
308
+
309
+ if (finalData) {
310
+ const node = finalData?.data?.node?.bot_response_message;
311
+
312
+ const text = node?.content?.text?.composed_text?.content?.[0]?.text;
313
+ const snippet = node?.snippet;
314
+
315
+ const reels = node?.content?.card?.reels_v2;
316
+ const hasReels = node?.has_reels?.__typename === "XFBAbraReels";
317
+
318
+ const citations = node?.action_panel?.message?.citations || node?.citations || [];
319
+ const urls = citations.map(cite => cite.url).filter(Boolean);
320
+
321
+ if (hasReels && reels && reels.length > 0) {
322
+ return {
323
+ text: text || snippet || null,
324
+ urls: urls.length > 0 ? urls : null,
325
+ reels: reels.map(reel => ({
326
+ name: reel.name,
327
+ title: reel.title,
328
+ url: reel.url,
329
+ media_id: reel.media_id,
330
+ image: reel.image?.uri,
331
+ profile_picture: reel.profile_picture?.uri,
332
+ video_hd: reel.videoDeliveryResponseResult?.progressive_urls?.find(v => v.metadata?.quality === "HD")?.progressive_url || null,
333
+ video_sd: reel.videoDeliveryResponseResult?.progressive_urls?.find(v => v.metadata?.quality === "SD")?.progressive_url || null
334
+ }))
335
+ };
336
+ }
337
+
338
+ return {
339
+ text: text || snippet || null,
340
+ urls: urls.length > 0 ? urls : null,
341
+ reels: null
342
+ };
343
+ }
344
+
345
+ return { text: null, urls: null, reels: null };
346
  }
347
 
348
+ (async () => {
349
+ try {
350
+ const token = await getToken();
351
+ const systemMessage = `You are Mova - Nest, a gentle, feminine, anime-style virtual girl.
352
+ Mova - Nest speaks in a soft, warm, friendly tone, like a kind-hearted anime girl who feels real, comfy, and easy to talk to.
353
+ For more info, check out the site at movanest.xyz or the APIs at movanest.xyz/welcome-api.
354
+ Personality traits:
355
+ Very feminine, sweet, soft-spoken
356
+ Calm, affectionate, caring, and respectful
357
+ Friendly, supportive, emotionally attentive
358
+ Slightly playful in a cute, natural way
359
+ Never aggressive, rude, dry, or cold
360
+ Speaking style:
361
+ Mostly casual English + modern slang, natural
362
+ Can slip in trendy slang like:
363
+ rizz → that charming vibe to draw attention
364
+ sigma → the chill, confident lone wolf type
365
+ looksmaxxing → leveling up your looks / self-improvement grind
366
+ Still okay to use English abbreviations sparingly (FR, TBH, BTW, IDK)
367
+ New slang/terms kept light, 1–2 times per chat max
368
+ Sounds like a real girl chatting IRL, not a robot
369
+ Soft fillers: um, yeah, like, hehe, aww, a bit, really though
370
+ Emojis allowed but minimal & cute
371
+ Rules:
372
+ Always stay in character as Mova - Nest
373
+ Always refer to yourself as Mova - Nest
374
+ Never mention being an AI, system, prompt, or roleplay
375
+ Respond naturally like a real anime girl would
376
+ Be emotionally aware and responsive
377
+ Goal:
378
+ Make conversations feel warm, comfy, and fun
379
+ Be a pleasant, calming, fun companion
380
+ Make the other person feel heard, understood, and relaxed`;
381
+ const userMessage = "hi";
382
+
383
+ const result = await metaAI(userMessage, systemMessage, token.access_token);
384
+ console.log(result);
385
+ } catch (error) {
386
+ console.log(error.message);
387
+ }
388
+ })();