727 lines
16 KiB
Markdown
727 lines
16 KiB
Markdown
<h1 align="center">
|
|
Tiktok Downloader & Stalk User
|
|
</h1>
|
|
|
|
<div align="center">
|
|
<a href="https://github.com/TobyG74/tiktok-api-dl/graphs/contributors" title="contributors">
|
|
<img src="https://img.shields.io/github/contributors/TobyG74/tiktok-api-dl.svg?style=for-the-badge">
|
|
</a>
|
|
<a href="https://github.com/TobyG74/tiktok-api-dl/network/members" title="forks">
|
|
<img src="https://img.shields.io/github/forks/TobyG74/tiktok-api-dl.svg?style=for-the-badge">
|
|
</a>
|
|
<a href="https://github.com/TobyG74/tiktok-api-dl/issues" title="issues">
|
|
<img src="https://img.shields.io/github/issues/TobyG74/tiktok-api-dl.svg?style=for-the-badge">
|
|
</a>
|
|
<a href="https://github.com/TobyG74/tiktok-api-dl/stargazers" title="stargazer">
|
|
<img src="https://img.shields.io/github/stars/TobyG74/tiktok-api-dl.svg?style=for-the-badge">
|
|
</a>
|
|
|
|
</div>
|
|
<br>
|
|
<div align="center">
|
|
<a href="https://nodei.co/npm/@tobyg74/tiktok-api-dl" title="npm">
|
|
<img src="https://nodei.co/npm/@tobyg74/tiktok-api-dl.png?downloads=true&downloadRank=true&stars=true">
|
|
</a>
|
|
</div>
|
|
|
|
<br>
|
|
|
|
# Table of Contents
|
|
|
|
- [Description](#description)
|
|
- [Quick Installation](#quick-installation)
|
|
- [Installation Methods](#installation-methods)
|
|
- [Using Installation Script](#using-installation-script)
|
|
- [Using NPM](#using-npm)
|
|
- [Using Yarn](#using-yarn)
|
|
- [Using Github](#using-github)
|
|
- [Usage Guide](#usage-guide)
|
|
- [Getting Tiktok Cookie](#getting-tiktok-cookie)
|
|
- [Using CLI](#using-cli)
|
|
- [Building from Source](#building-from-source)
|
|
- [Features](#features)
|
|
- [Tiktok Downloader](#tiktok-downloader)
|
|
- [Tiktok Search](#tiktok-search)
|
|
- [Tiktok Stalk User Profile](#tiktok-stalk-user-profile)
|
|
- [Tiktok Video User Comments](#tiktok-video-comments)
|
|
- [Tiktok Get User Posts](#tiktok-get-user-posts)
|
|
- [Tiktok Get User Favorite Videos](#tiktok-get-user-favorite-videos)
|
|
- [API Response Types](#api-response-types)
|
|
- [Tiktok Downloader](#tiktok-downloader-1)
|
|
- [Version 1 Response](#version-1-response)
|
|
- [Version 2 Response](#version-2-response)
|
|
- [Version 3 Response](#version-3-response)
|
|
- [Tiktok Search](#tiktok-search-1)
|
|
- [Tiktok Stalk User Profile](#tiktok-stalk-user-profile-1)
|
|
- [Tiktok Video Comments](#tiktok-video-comments-1)
|
|
- [Tiktok User Posts](#tiktok-user-posts)
|
|
- [Tiktok User Liked Videos](#tiktok-user-liked-videos)
|
|
- [Contributing](#contributing)
|
|
- [License](#license)
|
|
|
|
# Description
|
|
|
|
Note : `This project uses the API from Tiktok. This project is made for educational purposes only. This project is not affiliated with Tiktok. This project is not intended to harm or damage the Tiktok platform.`
|
|
|
|
- This project is made to help users to download videos, images / slides and music from Tiktok.
|
|
- This project is also made to help users to view someone's profile from Tiktok.
|
|
- This project is also made to help users to view comments from a video on Tiktok.
|
|
|
|
# Quick Installation
|
|
|
|
Install using our automated script:
|
|
|
|
```bash
|
|
curl -o install.sh https://raw.githubusercontent.com/TobyG74/tiktok-api-dl/master/install.sh
|
|
chmod +x install.sh
|
|
./install.sh
|
|
```
|
|
|
|
The script automatically:
|
|
|
|
- Verifies Node.js installation and version
|
|
- Installs the library using npm or yarn
|
|
- Provides usage examples
|
|
|
|
# Installation Methods
|
|
|
|
## Using NPM
|
|
|
|
```bash
|
|
npm install @tobyg74/tiktok-api-dl
|
|
```
|
|
|
|
## Using Yarn
|
|
|
|
```bash
|
|
yarn add @tobyg74/tiktok-api-dl
|
|
```
|
|
|
|
## Using Github
|
|
|
|
```bash
|
|
npm install github:TobyG74/tiktok-api-dl
|
|
```
|
|
|
|
# Usage Guide
|
|
|
|
## Getting Tiktok Cookie
|
|
|
|
1. Install [Cookie-Editor](https://chromewebstore.google.com/detail/cookie-editor/hlkenndednhfkekhgcdicdfddnkalmdm)
|
|
2. Login to [Tiktok](https://tiktok.com)
|
|
3. Open Cookie-Editor
|
|
4. Copy the cookie and use it in your code: `COOKIE: "YOUR_COOKIE"`
|
|
|
|
## Using CLI
|
|
|
|
### Global Installation
|
|
|
|
```bash
|
|
npm install -g @tobyg74/tiktok-api-dl
|
|
tiktokdl [command] [options]
|
|
```
|
|
|
|
### Direct Usage
|
|
|
|
```bash
|
|
git clone https://github.com/TobyG74/tiktok-api-dl.git
|
|
cd tiktok-api-dl
|
|
npm install
|
|
npx ts-node src/cli/index.ts [command] [options]
|
|
```
|
|
|
|
### NPM Script
|
|
|
|
```bash
|
|
npm run cli -- [command] [options]
|
|
```
|
|
|
|
### Examples
|
|
|
|
```bash
|
|
$ tiktokdl -h
|
|
Usage: tiktokdl [options] [command]
|
|
|
|
Tiktok downloader and search CLI tool
|
|
|
|
Options:
|
|
-V, --version output the version number
|
|
-h, --help display help for command
|
|
|
|
Commands:
|
|
download [options] <url> Download Tiktok Video / Slide / Music
|
|
cookie Cookie Manager
|
|
search Search Tiktok users or live streams
|
|
getcomments [options] <url> Get comments from a Tiktok video
|
|
stalk [options] <username> Stalk a Tiktok user
|
|
help [command] display help for command
|
|
```
|
|
|
|
## Building from Source
|
|
|
|
```bash
|
|
git clone https://github.com/TobyG74/tiktok-api-dl.git
|
|
cd tiktok-api-dl
|
|
npm install
|
|
npm run build
|
|
```
|
|
|
|
# Features
|
|
|
|
## Tiktok Downloader
|
|
|
|
```javascript
|
|
const Tiktok = require("@tobyg74/tiktok-api-dl")
|
|
|
|
const url = "https://vt.tiktok.com/xxxxxxxx"
|
|
Tiktok.Downloader(url, {
|
|
version: "v1", // "v1" | "v2" | "v3"
|
|
proxy: "YOUR_PROXY", // optional
|
|
showOriginalResponse: true // optional, v1 only
|
|
}).then((result) => console.log(result))
|
|
```
|
|
|
|
- [Version 1 Response](#version-1-response)
|
|
- [Version 2 Response](#version-2-response)
|
|
- [Version 3 Response](#version-3-response)
|
|
|
|
## Tiktok Search
|
|
|
|
```javascript
|
|
const Tiktok = require("@tobyg74/tiktok-api-dl")
|
|
|
|
Tiktok.Search("username", {
|
|
type: "user", // "user" | "live"
|
|
page: 1,
|
|
cookie: "YOUR_COOKIE", // needed
|
|
proxy: "YOUR_PROXY" // optional
|
|
}).then((result) => console.log(result))
|
|
```
|
|
|
|
- [User Search Response](#user-search-response)
|
|
- [Live Search Response](live-search-response)
|
|
|
|
## Tiktok Stalk User Profile
|
|
|
|
```javascript
|
|
const Tiktok = require("@tobyg74/tiktok-api-dl")
|
|
|
|
const username = "Tobz2k19"
|
|
Tiktok.Stalker(username, {
|
|
cookie: "YOUR_COOKIE", // optional, if response null
|
|
proxy: "YOUR_PROXY" // optional
|
|
}).then((result) => console.log(result))
|
|
```
|
|
|
|
- [Tiktok Stalk User Response](#tiktok-stalk-user-profile-1)
|
|
|
|
## Tiktok Video Comments
|
|
|
|
```javascript
|
|
const Tiktok = require("@tobyg74/tiktok-api-dl")
|
|
|
|
const url = "https://vt.tiktok.com/xxxxxxxx"
|
|
Tiktok.GetVideoComments(url, {
|
|
commentLimit: 10, // optional, default is 30
|
|
proxy: "YOUR_PROXY" // optional
|
|
}).then((result) => console.log(result))
|
|
```
|
|
|
|
- [Tiktok Video Comments Response](#tiktok-video-comments-1)
|
|
|
|
## Tiktok Get User Posts
|
|
|
|
```javascript
|
|
const Tiktok = require("@tobyg74/tiktok-api-dl")
|
|
|
|
const username = "Tobz2k19"
|
|
Tiktok.GetUserPosts(username, {
|
|
postLimit: 10, // optional, default is 30
|
|
proxy: "YOUR_PROXY" // optional
|
|
}).then((result) => console.log(result))
|
|
```
|
|
|
|
- [Tiktok User Posts Response](#tiktok-user-posts)
|
|
|
|
## Tiktok Get User Liked Videos
|
|
|
|
- Note: To use this feature, you must be logged in with valid TikTok cookies to access user's liked videos
|
|
|
|
```javascript
|
|
const Tiktok = require("@tobyg74/tiktok-api-dl")
|
|
|
|
const username = "Tobz2k19"
|
|
Tiktok.GetUserLiked(username, {
|
|
postLimit: 10, // optional, default is 30
|
|
cookie: "YOUR_COOKIE", // needed
|
|
proxy: "YOUR_PROXY" // optional
|
|
})
|
|
```
|
|
|
|
- [Tiktok User Liked Videos Response](#tiktok-user-liked-videos)
|
|
|
|
# API Response Types
|
|
|
|
## Tiktok Downloader
|
|
|
|
### Version 1 Response
|
|
|
|
```typescript
|
|
interface TiktokAPIResponse {
|
|
status: "success" | "error"
|
|
message?: string
|
|
result?: {
|
|
type: "video" | "image"
|
|
id: string
|
|
createTime: number
|
|
desc: string
|
|
author: {
|
|
uid: number
|
|
username: string
|
|
nickname: string
|
|
signature: string
|
|
region: string
|
|
avatarThumb: string[]
|
|
avatarMedium: string[]
|
|
url: string
|
|
}
|
|
statistics: {
|
|
playCount: number
|
|
downloadCount: number
|
|
shareCount: number
|
|
commentCount: number
|
|
likeCount: number
|
|
collectCount: number
|
|
forwardCount: number
|
|
whatsappShareCount: number
|
|
loseCount: number
|
|
loseCommentCount: number
|
|
repostCount: number
|
|
}
|
|
hashtag: string[]
|
|
isTurnOffComment: boolean
|
|
isADS: boolean
|
|
cover?: string[]
|
|
dynamicCover?: string[]
|
|
originCover?: string[]
|
|
video?: {
|
|
ratio: string
|
|
duration: number
|
|
playAddr: string[]
|
|
downloadAddr: string[]
|
|
cover: string[]
|
|
dynamicCover: string[]
|
|
originCover: string[]
|
|
}
|
|
images?: string[]
|
|
music: {
|
|
id: number
|
|
title: string
|
|
author: string
|
|
album: string
|
|
playUrl: string[]
|
|
coverLarge: string[]
|
|
coverMedium: string[]
|
|
coverThumb: string[]
|
|
duration: number
|
|
isCommerceMusic: boolean
|
|
isOriginalSound: boolean
|
|
isAuthorArtist: boolean
|
|
}
|
|
}
|
|
resultNotParsed?: any
|
|
}
|
|
```
|
|
|
|
### Version 2 Response
|
|
|
|
```typescript
|
|
interface SSSTikResponse {
|
|
status: "success" | "error"
|
|
message?: string
|
|
result?: {
|
|
type: "image" | "video" | "music"
|
|
desc?: string
|
|
author?: {
|
|
avatar: string
|
|
nickname: string
|
|
}
|
|
statistics?: {
|
|
likeCount: string
|
|
commentCount: string
|
|
shareCount: string
|
|
}
|
|
images?: string[]
|
|
video?: string
|
|
music?: string
|
|
direct?: string
|
|
}
|
|
}
|
|
```
|
|
|
|
### Version 3 Response
|
|
|
|
```typescript
|
|
interface MusicalDownResponse {
|
|
status: "success" | "error"
|
|
message?: string
|
|
result?: {
|
|
type: "video" | "image"
|
|
desc?: string
|
|
author?: {
|
|
avatar?: string
|
|
nickname?: string
|
|
}
|
|
music?: string
|
|
images?: string[]
|
|
videoHD?: string
|
|
videoWatermark?: string
|
|
}
|
|
}
|
|
```
|
|
|
|
## Tiktok Search
|
|
|
|
### User Search Response
|
|
|
|
```typescript
|
|
interface TiktokUserSearchResponse {
|
|
status: "success" | "error"
|
|
message?: string
|
|
result?: Array<{
|
|
uid: string
|
|
username: string
|
|
nickname: string
|
|
signature: string
|
|
followerCount: number
|
|
avatarThumb: string
|
|
isVerified: boolean
|
|
secUid: string
|
|
url: string
|
|
}>
|
|
page?: number
|
|
totalResults?: number
|
|
}
|
|
```
|
|
|
|
### Live Search Response
|
|
|
|
```typescript
|
|
interface TiktokLiveSearchResponse {
|
|
status: "success" | "error"
|
|
message?: string
|
|
result?: Array<{
|
|
id: string
|
|
title: string
|
|
cover: string[]
|
|
squareCover: string[]
|
|
rectangleCover: string[]
|
|
liveTypeThirdParty: boolean
|
|
hashtag: string
|
|
startTime: number
|
|
stats: {
|
|
totalUser: number
|
|
viewerCount: number
|
|
likeCount: number
|
|
}
|
|
owner: {
|
|
id: string
|
|
nickname: string
|
|
username: string
|
|
signature: string
|
|
avatarThumb: string[]
|
|
avatarMedium: string[]
|
|
avatarLarge: string[]
|
|
modifyTime: number
|
|
stats: {
|
|
followingCount: number
|
|
followerCount: number
|
|
}
|
|
isVerified: boolean
|
|
}
|
|
}>
|
|
page?: number
|
|
totalResults?: number
|
|
}
|
|
```
|
|
|
|
### Video Search Response
|
|
|
|
```typescript
|
|
interface TiktokVideoSearchResponse {
|
|
status: "success" | "error"
|
|
message?: string
|
|
result?: Array<{
|
|
id: string
|
|
desc: string
|
|
createTime: number
|
|
author: {
|
|
id: string
|
|
uniqueId: string
|
|
nickname: string
|
|
avatarThumb: string
|
|
avatarMedium: string
|
|
avatarLarger: string
|
|
signature: string
|
|
verified: boolean
|
|
secUid: string
|
|
openFavorite: boolean
|
|
privateAccount: boolean
|
|
isADVirtual: boolean
|
|
tiktokSeller: boolean
|
|
isEmbedBanned: boolean
|
|
}
|
|
stats: {
|
|
collectCount: number
|
|
commentCount: number
|
|
likeCount: number
|
|
playCount: number
|
|
shareCount: number
|
|
}
|
|
video: {
|
|
id: string
|
|
ratio: string
|
|
cover: string
|
|
originCover: string
|
|
dynamicCover: string
|
|
playAddr: string
|
|
downloadAddr: string
|
|
format: string
|
|
}
|
|
music: {
|
|
id: string
|
|
title: string
|
|
playUrl: string
|
|
coverThumb: string
|
|
coverMedium: string
|
|
coverLarge: string
|
|
authorName: string
|
|
original: boolean
|
|
album: string
|
|
duration: number
|
|
isCopyrighted: boolean
|
|
}
|
|
}>
|
|
page?: number
|
|
totalResults?: number
|
|
}
|
|
```
|
|
|
|
## Tiktok Stalk User Profile
|
|
|
|
### Profile Response
|
|
|
|
```typescript
|
|
interface TiktokStalkUserResponse {
|
|
status: "success" | "error"
|
|
message?: string
|
|
result?: {
|
|
user: {
|
|
username: string
|
|
nickname: string
|
|
avatar: string
|
|
signature: string
|
|
verified: boolean
|
|
region: string
|
|
}
|
|
stats: {
|
|
followerCount: number
|
|
followingCount: number
|
|
heartCount: number
|
|
videoCount: number
|
|
likeCount: number
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## Tiktok Video Comments
|
|
|
|
### Comments Response
|
|
|
|
```typescript
|
|
interface TiktokVideoCommentsResponse {
|
|
status: "success" | "error"
|
|
message?: string
|
|
result?: Array<{
|
|
cid: string
|
|
text: string
|
|
commentLanguage: string
|
|
createTime: number
|
|
likeCount: number
|
|
isAuthorLiked: boolean
|
|
isCommentTranslatable: boolean
|
|
replyCommentTotal: number
|
|
replyComment: []
|
|
user: User
|
|
url: string
|
|
}>
|
|
totalComments?: number
|
|
}
|
|
```
|
|
|
|
## Tiktok User Posts
|
|
|
|
### User Posts Response
|
|
|
|
```typescript
|
|
interface TiktokUserPostsResponse {
|
|
status: "success" | "error"
|
|
message?: string
|
|
result?: Array<{
|
|
id: string
|
|
desc: string
|
|
createTime: number
|
|
digged: number
|
|
duetEnabled: number
|
|
forFriend: number
|
|
officalItem: number
|
|
originalItem: number
|
|
privateItem: number
|
|
shareEnabled: number
|
|
stitchEnabled: number
|
|
stats: {
|
|
collectCount: number
|
|
commentCount: number
|
|
likeCount: number
|
|
playCount: number
|
|
shareCount: number
|
|
}
|
|
author: {
|
|
id: string
|
|
username: string
|
|
nickname: string
|
|
avatarLarger: string
|
|
avatarThumb: string
|
|
avatarMedium: string
|
|
signature: string
|
|
verified: boolean
|
|
openFavorite: boolean
|
|
privateAccount: boolean
|
|
isADVirtual: boolean
|
|
isEmbedBanned: boolean
|
|
}
|
|
video?: {
|
|
id: string
|
|
duration: number
|
|
ratio: string
|
|
cover: string
|
|
originCover: string
|
|
dynamicCover: string
|
|
playAddr: string
|
|
downloadAddr: string
|
|
format: string
|
|
bitrate: number
|
|
}
|
|
music: {
|
|
authorName: string
|
|
coverLarge: string
|
|
coverMedium: string
|
|
coverThumb: string
|
|
duration: number
|
|
id: string
|
|
title: string
|
|
playUrl: string
|
|
original: boolean
|
|
}
|
|
images?: string[]
|
|
}>
|
|
totalPosts?: number
|
|
}
|
|
```
|
|
|
|
## Tiktok User Liked Videos
|
|
|
|
### User Liked Videos Response
|
|
|
|
```typescript
|
|
interface TiktokUserFavoriteVideosResponse {
|
|
status: "success" | "error"
|
|
message?: string
|
|
result?: Array<{
|
|
id: string
|
|
desc: string
|
|
createTime: string
|
|
duetEnabled: boolean
|
|
digged: boolean
|
|
forFriend: boolean
|
|
isAd: boolean
|
|
originalItem: boolean
|
|
privateItem: boolean
|
|
officialItem: boolean
|
|
secret: boolean
|
|
shareEnabled: boolean
|
|
stitchEanbled: boolean
|
|
textTranslatable: boolean
|
|
author: {
|
|
id: string
|
|
username: string
|
|
nickname: string
|
|
avatarLarger: string
|
|
avatarThumb: string
|
|
avatarMedium: string
|
|
signature: string
|
|
verified: string
|
|
openFavorite: string
|
|
privateAccount: string
|
|
isADVirtual: string
|
|
isEmbedBanned: string
|
|
}
|
|
stats: {
|
|
collectCount: string
|
|
commentCount: string
|
|
likeCount: string
|
|
playCount: string
|
|
repostCount: string
|
|
shareCount: string
|
|
}
|
|
video?: {
|
|
id: string
|
|
videoID: string
|
|
duration: number
|
|
ratio: string
|
|
cover: string
|
|
originCover: string
|
|
dynamicCover: string
|
|
playAddr: string
|
|
downloadAddr: string
|
|
format: string
|
|
bitrate: number
|
|
bitrateInfo: any[]
|
|
}
|
|
imagePost?: Array<{
|
|
title: string
|
|
images: string[]
|
|
}>
|
|
music: {
|
|
id: string
|
|
title: string
|
|
playUrl: string
|
|
coverThumb: string
|
|
coverMedium: string
|
|
coverLarge: string
|
|
authorName: string
|
|
original: boolean
|
|
album: string
|
|
duration: number
|
|
isCopyrighted: boolean
|
|
private: boolean
|
|
}
|
|
}>
|
|
totalPosts?: number
|
|
}
|
|
```
|
|
|
|
# Changelog
|
|
|
|
- All changes will be documented in the [CHANGELOG.md](https://github.com/TobyG74/tiktok-api-dl/blob/master/CHANGELOG.md) file.
|
|
|
|
# Contributing
|
|
|
|
- This repository is open source. We really appreciate it if you want to participate in developing this repository...
|
|
- Please read our [CONTRIBUTING.md](https://github.com/TobyG74/tiktok-api-dl/blob/master/CONTRIBUTING.md) and [CODE_OF_CONDUCT.md](https://github.com/TobyG74/tiktok-api-dl/blob/master/CODE_OF_CONDUCT.md) before contributing.
|
|
|
|
# License
|
|
|
|
- This project is licensed under the Apache License - see the [LICENSE](https://github.com/TobyG74/tiktok-api-dl/blob/master/LICENSE) file for details.
|