@isereb/tiktok-api-dl
Version:
Scraper for downloading media in the form of videos, images and audio from Tiktok. Also for stalking Tiktok Users, getting user posts, likes, comments, followers and following.
124 lines (123 loc) • 4.6 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.extractPlaylistId = exports.Playlist = exports.getPlaylist = void 0;
const axios_1 = __importDefault(require("axios"));
const api_1 = require("../../constants/api");
const params_1 = require("../../constants/params");
const https_proxy_agent_1 = require("https-proxy-agent");
const socks_proxy_agent_1 = require("socks-proxy-agent");
const constants_1 = require("../../constants");
const async_retry_1 = __importDefault(require("async-retry"));
const tiktokAPIDownloader_1 = require("../downloader/tiktokAPIDownloader");
const PLAYLIST_URL_REGEX = /playlist\/[^/]+-(\d+)/;
const createProxyAgent = (proxy) => {
if (!proxy)
return {};
if (proxy.startsWith("socks")) {
return {
httpsAgent: new socks_proxy_agent_1.SocksProxyAgent(proxy)
};
}
return {
httpsAgent: new https_proxy_agent_1.HttpsProxyAgent(proxy)
};
};
const getPlaylist = async (playlistId, proxy, page = 1, count = 5) => {
try {
const response = await (0, async_retry_1.default)(async () => {
const res = await (0, axios_1.default)((0, api_1._tiktokGetPlaylist)((0, params_1._getPlaylistParams)(playlistId, page, count)), {
method: "GET",
headers: {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:138.0) Gecko/20100101 Firefox/138.0",
Accept: "*/*",
"Accept-Language": "en-US,en;q=0.7",
Referer: "https://www.tiktok.com/",
Origin: "https://www.tiktok.com",
"Content-Type": "application/json"
},
...createProxyAgent(proxy)
});
if (res.data && res.data.statusCode === 0) {
return res.data;
}
throw new Error(constants_1.ERROR_MESSAGES.NETWORK_ERROR);
}, {
retries: 20,
minTimeout: 200,
maxTimeout: 1000
});
return {
status: "success",
result: {
hasMore: response.hasMore,
itemList: response.itemList || [],
extra: response.extra
}
};
}
catch (error) {
return {
status: "error",
message: error instanceof Error ? error.message : constants_1.ERROR_MESSAGES.NETWORK_ERROR
};
}
};
exports.getPlaylist = getPlaylist;
const Playlist = async (url, options) => {
try {
const processedUrl = url.startsWith("http")
? await (0, tiktokAPIDownloader_1.handleRedirect)(url, options?.proxy)
: url;
const playlistId = (0, exports.extractPlaylistId)(processedUrl);
if (!playlistId) {
return {
status: "error",
message: "Invalid playlist ID or URL format"
};
}
const response = await (0, axios_1.default)((0, api_1._tiktokGetPlaylist)((0, params_1._getPlaylistParams)(playlistId, options.page, options.count)), {
method: "GET",
headers: {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:138.0) Gecko/20100101 Firefox/138.0",
Accept: "*/*",
"Accept-Language": "en-US,en;q=0.7",
Referer: "https://www.tiktok.com/",
Origin: "https://www.tiktok.com"
},
...createProxyAgent(options?.proxy)
});
if (response.data && response.data.status_code === 0) {
const data = response.data;
return {
status: "success",
result: {
itemList: data.itemList || [],
hasMore: data.hasMore,
extra: data.extra
}
};
}
return {
status: "error",
message: constants_1.ERROR_MESSAGES.NETWORK_ERROR
};
}
catch (error) {
return {
status: "error",
message: error instanceof Error ? error.message : constants_1.ERROR_MESSAGES.NETWORK_ERROR
};
}
};
exports.Playlist = Playlist;
const extractPlaylistId = (input) => {
if (/^\d+$/.test(input)) {
return input;
}
const match = input.match(PLAYLIST_URL_REGEX);
return match ? match[1] : null;
};
exports.extractPlaylistId = extractPlaylistId;