@aetherz/scraper
Version:
Scraper
367 lines (347 loc) • 11.1 kB
JavaScript
<<<<<<< HEAD
const cheerio = require("cheerio");
/**
* SCRAPED BY AETHER
* FORBIDDEN TO SELL AND DELETE MY WM
*/
async function tiktokSearch(query) {
return new Promise(async (resolve, reject) => {
try {
const response = await fetch("https://tikwm.com/api/feed/search", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
Cookie: "current_language=en",
"User-Agent":
"Mozilla/5.0 (Linux Android 10 K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36",
},
body: new URLSearchParams({
keywords: query,
count: 10,
cursor: 0,
HD: 1,
}),
}).then((v) => v.json());
const videos = response.data.videos;
if (videos.length === 0) {
reject("Tidak ada video ditemukan.");
} else {
const dann = Math.floor(Math.random() * videos.length);
const video = videos.map((v) => {
return {
title: v.title,
cover: v.cover,
origin_cover: v.origin_cover,
link: `https://www.tiktok.com/@${v.author.unique_id}/video/${v.video_id}`,
no_watermark: v.play,
watermark: v.wmplay,
music: v.music_info,
views: v.play_count,
like: v.digg_count,
comment: v.comment_count || null,
share: v.share_count,
download: v.download_count || null,
save: v.collect_count || null,
create_time: v.create_time * 1000,
};
});
resolve(video);
}
} catch (error) {
reject(error);
}
});
}
async function tiktokInfo(url) {
return new Promise(async (resolve, reject) => {
try {
const response = await fetch("https://tikwm.com/api/", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
Cookie: "current_language=en",
"User-Agent":
"Mozilla/5.0 (Linux Android 10 K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36",
},
body: new URLSearchParams({
region: "id",
url: url,
count: 10,
cursor: 0,
HD: 1,
}),
}).then((v) => v.json());
const video = response.data;
if (video.length === 0) {
reject("Tidak ada video ditemukan.");
} else {
const result = {
title: video.title,
cover: video.cover,
origin_cover: video.origin_cover,
link: `https://www.tiktok.com/@${video.author.unique_id}/video/${video.id}`,
no_watermark: video.play,
hd: video.hdplay || null,
watermark: video.wmplay,
music: video.music,
no_wm_size: video.size,
wm_size: video.wm_size,
hd_size: video.hd_size || null,
views: video.play_count,
like: video.digg_count,
comment: video.comment_count || null,
share: video.share_count,
download: video.download_count || null,
save: video.collect_count,
create_time: video.create_time * 1000,
};
resolve(result);
}
} catch (error) {
reject(error);
}
});
}
async function tiktokUserPost(user) {
return new Promise(async (resolve, reject) => {
const result = [];
const res = await fetch("https://www.tikwm.com/api/user/posts", {
method: "POST",
body: new URLSearchParams({
unique_id: `@${user.replace(/@/gi, "")}`,
hd: 1,
cursor: 0,
}),
}).then((v) => v.json());
const posts = res.data.videos;
for (let {
title,
duration,
play_count,
origin_cover,
create_time,
digg_count,
share_count,
download_count,
collect_count,
comment_count,
play,
wmplay,
music_info,
video_id,
author,
} of posts) {
result.push({
title,
duration,
link: `https://www.tiktok.com/@${author.unique_id}/video/${video_id}`,
origin_cover,
views: play_count,
like: digg_count,
comment: comment_count,
share: share_count,
download: download_count,
saved: collect_count || null,
create_time,
no_watermark: play,
watermark: wmplay,
music: music_info,
});
}
await resolve(result);
});
}
async function tiktokSlide(url) {
return new Promise(async (resolve, reject) => {
try {
const origin = "https://ttsave.app/";
/**
* @type {RequestInit}
*/
const options = {
method: "POST",
headers: {
Accept: "application/json, text/plain, */*",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Content-Type": "application/json",
Origin: origin,
Referer: `${origin}/en/slide`,
"Sec-Fetch-Mode": "cors",
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
// Cookie:
// "ttsaveapp_session=eyJpdiI6IkgyRkswa2hpb0pRR21WMFRRS3BwL3c9PSIsInZhbHVlIjoiQUU3SVk0VnkzWHdtKzVjdllKWjZSVForRHRDVi9NK01GeU5wTUZQYWs5eTc5M0RqYzVpQXhrWlNHRWs5SjE0N1dZQ1FqQU5UNGNYOGFaRGE2bXNKWGJiWThhZGlsUlZSVDlHbzVybkFPcldsdHdESzYwMDZidkwzdXVuRWhrSTkiLCJtYWMiOiI4M2YzN2UxZDFhZmQ2YjgwMTJkOTI0MzNkZWJhOGQ0ZWJmOWI0MjBmMmU0Y2E4MDMyODdiNmI3OTY5YzZjYWVmIiwidGFnIjoiIn0%3D;",
},
body: JSON.stringify({
language_id: "1",
query: url,
}),
};
const res = await fetch(`${origin}/download`, options).then((v) =>
v.text()
);
const $ = cheerio.load(res);
const data = {
author: "",
username: "",
profile: "",
caption: "",
views: "0",
likes: "0",
comment: "0",
save: "0",
share: "0",
music: "",
thumbnail: "",
slides: [],
link: url,
authorLink: "",
};
const download = $("div.items-center");
const attr = $(download).find("div.gap-2").children("div");
const slides = $(download).find("div#button-download-ready");
data.author = $(download)
.find("h2.font-extrabold.text-xl.text-center")
.text()
.trim();
data.username = $(download).find("a[title]").text().trim();
data.authorLink = $(download).find("a[title]").attr("href");
data.caption = $(download).find("a[title] + p").text().trim();
data.views = attr.eq(0).find("span").text().trim() || "0";
data.likes = attr.eq(1).find("span").text().trim() || "0";
data.comment = attr.eq(2).find("span").text().trim() || "0";
data.save = attr.eq(3).find("span").text().trim() || "0";
data.share = attr.eq(4).find("span").text().trim() || "0";
data.music = $(download).find("div.mt-5 > span").text().trim() || "";
$(slides)
.children("div")
.each((i, el) => {
data.slides.push($(el).find("img").attr("src"));
});
data.profile = $(slides).find('a[type="profile"]').attr("href");
data.thumbnail = $(slides).find('a[type="cover"]').attr("href");
resolve(data);
} catch (e) {
reject(e);
}
});
}
async function tiktokStalk(username) {
return new Promise(async (resolve, reject) => {
try {
let res = await fetch(
"https://tools.revesery.com/stalktk/revesery.php?username=" +
encodeURI(username.replace(/[^\w\d]/gi, ""))
);
if (!res.ok) return reject("User Not Found");
res = await res.json();
delete res.base64;
console.log(res);
resolve(res);
} catch (e) {
reject(e);
}
});
=======
const fetch = require("node-fetch");
/**
* 📌 TikTok API Scraper
* Scraped by Aetherz - Free to Use
*/
/** ✅ Search Video TikTok */
async function tiktokSearch(query) {
try {
const response = await fetch(
`https://api.tiklydown.com/search?keywords=${encodeURIComponent(query)}`
);
const json = await response.json();
if (!json.status || !json.data) throw new Error("Tidak ada video ditemukan.");
return json.data.map((v) => ({
title: v.title,
cover: v.cover,
author: v.author.name,
author_url: `https://www.tiktok.com/@${v.author.unique_id}`,
video_url: `https://www.tiktok.com/@${v.author.unique_id}/video/${v.id}`,
no_watermark: v.video.no_watermark,
watermark: v.video.watermark,
music: v.music.url,
views: v.stats.play_count,
likes: v.stats.digg_count,
comments: v.stats.comment_count,
shares: v.stats.share_count,
}));
} catch (error) {
throw new Error(`Error: ${error.message}`);
}
}
/** ✅ Download Video TikTok Tanpa Watermark */
async function tiktokDownload(url) {
try {
const response = await fetch(`https://api.tiklydown.com/?url=${encodeURIComponent(url)}`);
const json = await response.json();
if (!json.status || !json.data) throw new Error("Gagal mengambil video.");
return {
title: json.data.title,
author: json.data.author.name,
video_url: json.data.video.no_watermark,
watermark_video: json.data.video.watermark,
music: json.data.music.url,
cover: json.data.cover,
stats: json.data.stats,
};
} catch (error) {
throw new Error(`Error: ${error.message}`);
}
}
/** ✅ Mendapatkan Postingan Pengguna */
async function tiktokUserPosts(username) {
try {
const response = await fetch(`https://api.tiklydown.com/user/${username}`);
const json = await response.json();
if (!json.status || !json.data) throw new Error("Pengguna tidak ditemukan.");
return json.data.posts.map((post) => ({
title: post.title,
video_url: `https://www.tiktok.com/@${username}/video/${post.id}`,
cover: post.cover,
views: post.stats.play_count,
likes: post.stats.digg_count,
comments: post.stats.comment_count,
shares: post.stats.share_count,
no_watermark: post.video.no_watermark,
}));
} catch (error) {
throw new Error(`Error: ${error.message}`);
}
}
/** ✅ Stalking Profil Pengguna */
async function tiktokStalk(username) {
try {
const response = await fetch(`https://api.tiklydown.com/user/${username}`);
const json = await response.json();
if (!json.status || !json.data) throw new Error("User tidak ditemukan.");
return {
username: json.data.username,
name: json.data.name,
followers: json.data.followers,
following: json.data.following,
likes: json.data.likes,
bio: json.data.bio,
profile_pic: json.data.avatar,
};
} catch (error) {
throw new Error(`Error: ${error.message}`);
}
>>>>>>> 9f23544 (Scrape)
}
module.exports = {
tiktokSearch,
<<<<<<< HEAD
tiktokInfo,
tiktokUserPost,
tiktokSlide,
=======
tiktokDownload,
tiktokUserPosts,
>>>>>>> 9f23544 (Scrape)
tiktokStalk,
};