140 lines
6.5 KiB
JavaScript
140 lines
6.5 KiB
JavaScript
const Axios = require("axios");
|
|
const cheerio = require("cheerio");
|
|
|
|
const _tiktokurl = "https://www.tiktok.com";
|
|
const _tiktokapi = (id) =>
|
|
`https://api16-va.tiktokv.com/aweme/v1/feed/?aweme_id=${id}&version_name=1.1.9&version_code=119&build_number=1.1.9&manifest_version_code=119&update_version_code=119&openudid=dlcrw3zg28ajm4ml&uuid=3703699664470627&_rticket=1677813932976&ts=1677813932&device_brand=Realme&device_type=RMX1821&device_platform=android&resolution=720*1370&dpi=320&os_version=11&os_api=30&carrier_region=US&sys_region=US%C2%AEion=US&app_name=TK%20Downloader&app_language=en&language=en&timezone_name=Western%20Indonesia%20Time&timezone_offset=25200&channel=googleplay&ac=wifi&mcc_mnc=&is_my_cn=0&aid=1180&ssmix=a&as=a1qwert123`;
|
|
|
|
const TiktokDL = (url) => {
|
|
return new Promise((resolve, reject) => {
|
|
url = url.replace("https://vm", "https://vt");
|
|
Axios(url, {
|
|
method: "HEAD",
|
|
})
|
|
.then(({ request }) => {
|
|
const { responseUrl } = request.res;
|
|
let ID = responseUrl.match(/\d{17,21}/g);
|
|
if (ID === null)
|
|
return reject({
|
|
status: "error",
|
|
message:
|
|
"Failed to fetch tiktok url. Make sure your tiktok url is correct!",
|
|
});
|
|
ID = ID[0];
|
|
Axios(_tiktokapi(ID), {
|
|
method: "GET",
|
|
})
|
|
.then(({ data }) => {
|
|
const content = data.aweme_list.filter((v) => v.aweme_id === ID)[0];
|
|
if (!content)
|
|
return resolve({
|
|
status: "error",
|
|
message:
|
|
"Failed to find tiktok data. Make sure your tiktok url is correct!",
|
|
});
|
|
const statistics = {
|
|
play_count: content.statistics.play_count,
|
|
download_count: content.statistics.download_count,
|
|
share_count: content.statistics.share_count,
|
|
comment_count: content.statistics.comment_count,
|
|
like_count: content.statistics.digg_count,
|
|
favourite_count: content.statistics.collect_count,
|
|
};
|
|
const author = {
|
|
username: content.author.unique_id,
|
|
nickname: content.author.nickname,
|
|
signature: content.author.signature,
|
|
birthday: content.author.birthday,
|
|
region: content.author.region,
|
|
};
|
|
if (content.image_post_info) {
|
|
resolve({
|
|
status: "success",
|
|
result: {
|
|
type: "image",
|
|
id: content.aweme_id,
|
|
create_time: content.create_time,
|
|
description: content.desc,
|
|
author,
|
|
statistics,
|
|
images: content.image_post_info.images.map(
|
|
(v) => v.display_image.url_list[0]
|
|
),
|
|
music: content.music.play_url.url_list,
|
|
},
|
|
});
|
|
} else {
|
|
resolve({
|
|
status: "success",
|
|
result: {
|
|
type: "video",
|
|
id: content.aweme_id,
|
|
create_time: content.create_time,
|
|
description: content.desc,
|
|
author,
|
|
statistics,
|
|
video: content.video.play_addr.url_list,
|
|
music: content.music.play_url.url_list,
|
|
},
|
|
});
|
|
}
|
|
})
|
|
.catch(reject);
|
|
})
|
|
.catch(reject);
|
|
});
|
|
};
|
|
|
|
const TiktokStalk = (username) => {
|
|
return new Promise(async (resolve, reject) => {
|
|
const { data: cookie } = await Axios.get("https://pastebin.com/raw/ELJjcbZT");
|
|
username = username.replace("@", "");
|
|
Axios(`${_tiktokurl}/@${username}`, {
|
|
method: "GET",
|
|
headers: {
|
|
"user-agent":
|
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36",
|
|
cookie: cookie,
|
|
},
|
|
})
|
|
.then(({ data }) => {
|
|
const $ = cheerio.load(data);
|
|
const result = JSON.parse($("script#SIGI_STATE").text());
|
|
if (!result.UserModule) {
|
|
return resolve({
|
|
status: "error",
|
|
message: "User not found!",
|
|
});
|
|
}
|
|
const user = result.UserModule;
|
|
const users = {
|
|
username: user.users[username].uniqueId,
|
|
nickname: user.users[username].nickname,
|
|
avatar: user.users[username].avatarLarger,
|
|
signature: user.users[username].signature,
|
|
verified: user.users[username].verified,
|
|
region: user.users[username].region,
|
|
};
|
|
const stats = {
|
|
followerCount: user.stats[username].followerCount,
|
|
followingCount: user.stats[username].followingCount,
|
|
heartCount: user.stats[username].heartCount,
|
|
videoCount: user.stats[username].videoCount,
|
|
likeCount: user.stats[username].diggCount,
|
|
};
|
|
resolve({
|
|
status: "success",
|
|
result: {
|
|
users,
|
|
stats,
|
|
},
|
|
});
|
|
})
|
|
.catch((e) => {
|
|
resolve({ status: "error", message: e.message });
|
|
});
|
|
});
|
|
};
|
|
|
|
module.exports = { TiktokDL, TiktokStalk };
|