UNPKG

tiktokapi-src

Version:

Unofficial scraper for downloading media from tiktok

145 lines (144 loc) 5.87 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.TiktokAPI = void 0; const axios_1 = __importDefault(require("axios")); const api_1 = require("../../constants/api"); const params_1 = require("../../constants/params"); const TiktokURLregex = /https:\/\/(?:m|www|vm|vt)?\.?tiktok\.com\/((?:.*\b(?:(?:usr|v|embed|user|video)\/|\?shareId=|\&item_id=)(\d+))|\w+)/; const TiktokAPI = (url) => new Promise((resolve, reject) => { if (!TiktokURLregex.test(url)) { return resolve({ status: "error", message: "Invalid Tiktok URL. Make sure your url is correct!" }); } url = url.replace("https://vm", "https://vt"); axios_1.default.head(url) .then(async ({ request }) => { const { responseUrl } = request.res; let ID = responseUrl.match(/\d{17,21}/g); if (ID === null) return resolve({ status: "error", message: "Failed to fetch tiktok url. Make sure your tiktok url is correct!" }); ID = ID[0]; let data2 = await fetchTiktokData(ID); if (!data2?.content) { return resolve({ status: "error", message: "Failed to fetch tiktok data. Make sure your tiktok url is correct!" }); } const { content, author, statistics, music } = data2; if (content.image_post_info) { resolve({ status: "success", result: { type: "image", id: content.aweme_id, createTime: content.create_time, description: content.desc, hashtag: content.text_extra.filter((x) => x.hashtag_name !== undefined).map((v) => v.hashtag_name), isADS: content.is_ads, author, statistics, images: content.image_post_info.images.map((v) => v.display_image.url_list[0]), music } }); } else { const video = { ratio: content.video.ratio, duration: content.video.duration, playAddr: content.video.play_addr.url_list, downloadAddr: content.video.download_addr.url_list, cover: content.video.cover.url_list, dynamicCover: content.video.dynamic_cover.url_list, originCover: content.video.origin_cover.url_list }; resolve({ status: "success", result: { type: "video", id: content.aweme_id, createTime: content.create_time, description: content.desc, hashtag: content.text_extra.filter((x) => x.hashtag_name !== undefined).map((v) => v.hashtag_name), isADS: content.is_ads, author, statistics, video, music } }); } }) .catch((e) => resolve({ status: "error", message: e.message })); }); exports.TiktokAPI = TiktokAPI; const fetchTiktokData = async (ID) => { const res = await fetch((0, api_1._tiktokapi)(new URLSearchParams((0, params_1._tiktokApiParams)({ aweme_id: ID })).toString()), { 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" } }); if (res.headers.get("content-length") !== "0") { const data = await res.json(); if (data) { return parseTiktokData(ID, data); } } return null; }; const parseTiktokData = (ID, data) => { let content = data?.aweme_list; if (!content) return { content: null }; content = content.find((v) => v.aweme_id === ID); const statistics = { commentCount: content.statistics.comment_count, diggCount: content.statistics.digg_count, downloadCount: content.statistics.download_count, playCount: content.statistics.play_count, shareCount: content.statistics.share_count, forwardCount: content.statistics.forward_count, loseCount: content.statistics.lose_count, loseCommentCount: content.statistics.lose_comment_count, whatsappShareCount: content.statistics.whatsapp_share_count, collectCount: content.statistics.collect_count, repostCount: content.statistics.repost_count }; const author = { uid: content.author.uid, username: content.author.unique_id, nickname: content.author.nickname, signature: content.author.signature, region: content.author.region, avatarThumb: content.author.avatar_thumb.url_list, avatarMedium: content.author.avatar_medium.url_list, url: `${api_1._tiktokurl}/@${content.author.unique_id}` }; const music = { id: content.music.id, title: content.music.title, author: content.music.author, album: content.music.album, playUrl: content.music.play_url.url_list, coverLarge: content.music.cover_large.url_list, coverMedium: content.music.cover_medium.url_list, coverThumb: content.music.cover_thumb.url_list, duration: content.music.duration, isCommerceMusic: content.music.is_commerce_music, isOriginalSound: content.music.is_original_sound, isAuthorArtist: content.music.is_author_artist }; return { content, statistics, author, music }; };