add readme + support count

This commit is contained in:
Tino Laomahei 2025-05-24 22:06:08 +12:00
parent 5bd743a888
commit a37640e332
5 changed files with 134 additions and 23 deletions

View File

@ -260,6 +260,100 @@ Tiktok.GetUserLiked(username, {
- [Tiktok User Liked Videos Response](#tiktok-user-liked-videos) - [Tiktok User Liked Videos Response](#tiktok-user-liked-videos)
## Tiktok Collection
Get videos from a TikTok collection (supports collection ID or URL)
```javascript
const Tiktok = require("@tobyg74/tiktok-api-dl")
// Using collection ID
const collectionId = "7507916135931218695"
Tiktok.Collection(collectionId, {
cursor: "0", // optional, default is "0"
count: 5, // optional, default is 5
proxy: "YOUR_PROXY" // optional
}).then((result) => console.log(result))
// Using collection URL
const collectionUrl = "https://www.tiktok.com/@username/collection/name-id"
Tiktok.Collection(collectionUrl, {
cursor: "0",
count: 5,
proxy: "YOUR_PROXY"
}).then((result) => console.log(result))
```
### CLI Usage
```bash
# Using collection ID
tiktokdl collection 7507916135931218695 -n 5
# Using collection URL
tiktokdl collection "https://www.tiktok.com/@username/collection/name-id" -n 5
# With cursor for pagination
tiktokdl collection 7507916135931218695 -c 5 -n 5
# With proxy
tiktokdl collection 7507916135931218695 -n 5 -p "http://your-proxy-url"
```
### Response Type
```typescript
interface TiktokCollectionResponse {
status: "success" | "error"
message?: string
result?: {
itemList: Array<{
id: string
desc: string
createTime: number
author?: {
id: string
uniqueId: string
nickname: string
avatarThumb: string
avatarMedium: string
avatarLarger: string
signature: string
verified: boolean
}
statistics?: {
playCount: number
diggCount: number
shareCount: number
commentCount: number
collectCount: number
}
video?: {
id: string
height: number
width: number
duration: number
ratio: string
cover: string
originCover: string
dynamicCover: string
playAddr: string
downloadAddr: string
format: string
bitrate: number
}
textExtra?: Array<{
hashtagName: string
hashtagId: string
type: number
}>
}>
hasMore: boolean
cursor: string
}
}
```
# API Response Types # API Response Types
## Tiktok Downloader ## Tiktok Downloader

View File

@ -404,12 +404,19 @@ program
) )
.option("-c, --cursor <cursor>", "Cursor for pagination", "0") .option("-c, --cursor <cursor>", "Cursor for pagination", "0")
.option("-p, --proxy <proxy>", "Proxy URL (http/https/socks)") .option("-p, --proxy <proxy>", "Proxy URL (http/https/socks)")
.option(
"-n, --count <number>",
"Number of items to fetch",
(val) => parseInt(val),
5
)
.action(async (collectionIdOrUrl, options) => { .action(async (collectionIdOrUrl, options) => {
try { try {
Logger.info(`Fetching collection...`) Logger.info(`Fetching collection... (count: ${options.count})`)
const results = await Tiktok.Collection(collectionIdOrUrl, { const results = await Tiktok.Collection(collectionIdOrUrl, {
cursor: options.cursor, cursor: options.cursor,
proxy: options.proxy proxy: options.proxy,
count: options.count
}) })
if (results.status === "success" && results.result) { if (results.status === "success" && results.result) {

View File

@ -353,9 +353,9 @@ const generateOdinId = () => {
return `${prefix}${random}` return `${prefix}${random}`
} }
export const _getCollectionParams = (collectionId: string, cursor: string = "0") => { export const _getCollectionParams = (collectionId: string, cursor: string = "0", count: number = 5) => {
return qs.stringify({ return qs.stringify({
WebIdLastTime: 1741246176, WebIdLastTime: Date.now(),
aid: 1988, aid: 1988,
app_language: "en", app_language: "en",
app_name: "tiktok_web", app_name: "tiktok_web",
@ -365,13 +365,12 @@ export const _getCollectionParams = (collectionId: string, cursor: string = "0")
browser_platform: "Win32", browser_platform: "Win32",
browser_version: "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36", browser_version: "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36",
channel: "tiktok_web", channel: "tiktok_web",
clientABVersions: "70508271,72437276,73356773,73406215,73464037,73558921,73561312,73563784,73607175,73713381,73720541,73737112,73759867,73768252,73787023,73810364,73810951,73811265,73812969,73815488,73815490,73817289,73821742,73849114,73855857,73858886,73858985,73867894,73880997,73902810,70138197,70156809,70405643,71057832,71200802,71381811,71516509,71803300,71962127,72360691,72408100,72854054,72892778,73004916,73171280,73208420,73574728,73628214",
collectionId, collectionId,
cookie_enabled: true, cookie_enabled: true,
count: 30, count,
cursor, cursor,
data_collection_enabled: true, data_collection_enabled: true,
device_id: "7478595310673266194", device_id: "7002566096994190854",
device_platform: "web_pc", device_platform: "web_pc",
focus_state: true, focus_state: true,
from_page: "user", from_page: "user",
@ -389,7 +388,7 @@ export const _getCollectionParams = (collectionId: string, cursor: string = "0")
sourceType: 113, sourceType: 113,
tz_name: "Pacific/Auckland", tz_name: "Pacific/Auckland",
user_is_login: true, user_is_login: true,
verifyFp: "verify_mb1zbd2f_sMPZ5W5a_A3yc_4dmk_8NT3_kp4HJQOdrhp5", verifyFp: "verify_lacphy8d_z2ux9idt_xdmu_4gKb_9nng_NNTTTvsFS8ao",
webcast_language: "en" webcast_language: "en"
}) })
} }

View File

@ -131,6 +131,7 @@ export = {
* @param {Object} options - The options for collection * @param {Object} options - The options for collection
* @param {string} [options.proxy] - Optional proxy URL * @param {string} [options.proxy] - Optional proxy URL
* @param {string} [options.cursor] - Optional cursor for pagination * @param {string} [options.cursor] - Optional cursor for pagination
* @param {number} [options.count] - Optional number of items to fetch
* @returns {Promise<TiktokCollectionResponse>} * @returns {Promise<TiktokCollectionResponse>}
*/ */
Collection: async ( Collection: async (
@ -138,6 +139,7 @@ export = {
options?: { options?: {
proxy?: string proxy?: string
cursor?: string cursor?: string
count?: number
} }
): Promise<TiktokCollectionResponse> => { ): Promise<TiktokCollectionResponse> => {
const collectionId = extractCollectionId(collectionIdOrUrl) const collectionId = extractCollectionId(collectionIdOrUrl)
@ -147,7 +149,7 @@ export = {
message: "Invalid collection ID or URL format" message: "Invalid collection ID or URL format"
} }
} }
return await getCollection(collectionId, options?.proxy, options?.cursor) return await getCollection(collectionId, options?.proxy, options?.cursor, options?.count)
}, },
/** /**

View File

@ -31,27 +31,35 @@ const createProxyAgent = (proxy?: string): ProxyConfig => {
* @param {string} collectionId - Collection ID * @param {string} collectionId - Collection ID
* @param {string} proxy - Your Proxy (optional) * @param {string} proxy - Your Proxy (optional)
* @param {string} cursor - Cursor for pagination (optional) * @param {string} cursor - Cursor for pagination (optional)
* @param {number} count - Number of items to fetch (optional)
* @returns {Promise<TiktokCollectionResponse>} * @returns {Promise<TiktokCollectionResponse>}
*/ */
export const getCollection = async ( export const getCollection = async (
collectionId: string, collectionId: string,
proxy?: string, proxy?: string,
cursor: string = "0" cursor: string = "0",
count: number = 5
): Promise<TiktokCollectionResponse> => { ): Promise<TiktokCollectionResponse> => {
try { try {
const response = await retry( const response = await retry(
async () => { async () => {
const res = await Axios(_tiktokGetCollection(_getCollectionParams(collectionId, cursor)), { const res = await Axios(
method: "GET", _tiktokGetCollection(
headers: { _getCollectionParams(collectionId, cursor, count)
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36", ),
"Accept": "*/*", {
"Accept-Language": "en-US,en;q=0.7", method: "GET",
"Referer": "https://www.tiktok.com/", headers: {
"Origin": "https://www.tiktok.com" "User-Agent":
}, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36",
...createProxyAgent(proxy) Accept: "*/*",
}) "Accept-Language": "en-US,en;q=0.7",
Referer: "https://www.tiktok.com/",
Origin: "https://www.tiktok.com"
},
...createProxyAgent(proxy)
}
)
if (res.data && res.data.statusCode === 0) { if (res.data && res.data.statusCode === 0) {
return res.data return res.data
@ -78,7 +86,8 @@ export const getCollection = async (
} catch (error) { } catch (error) {
return { return {
status: "error", status: "error",
message: error instanceof Error ? error.message : ERROR_MESSAGES.NETWORK_ERROR message:
error instanceof Error ? error.message : ERROR_MESSAGES.NETWORK_ERROR
} }
} }
} }