npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

tiktok-api

v0.4.1

Published

Unofficial API wrapper for TikTok (previously musical.ly)

Downloads

318

Readme

Unofficial TikTok/Musical.ly API

npm version Coverage Status Build Status PRs Welcome Supported TikTok version

A reverse-engineered implementation of the TikTok (previously musical.ly) app's API.

Installation

npm i tiktok-api

Usage

Creating an instance

import TikTokAPI, { getRequestParams } from 'tiktok-api';

// Required - a method that signs the URL with anti-spam parameters
// You must provide an implementation yourself to successfully make
// most requests with this library.
const signURL = async (url, ts, deviceId) => {
  const as = 'anti-spam parameter 1';
  const cp = 'anti-spam parameter 2'
  const mas = 'anti-spam parameter 3';
  return `${url}&as=${as}&cp=${cp}&mas=${mas}`;
}

// Required - device parameters
// You need to source these using a man-in-the-middle proxy such as mitmproxy,
// CharlesProxy or PacketCapture (Android)
const params = getRequestParams({
  device_id: '<device_id>',
  fp: '<device_fingerprint>',
  iid: '<install_id>',
  openudid: '<device_open_udid>',
});

const api = new TikTokAPI(params, { signURL });

// You are now able to make successful requests

Instance methods

.loginWithEmail(email, password)

Authenticates you with the API and stores your session data in a cookie jar. Subsequent requests will include these cookies.

api.loginWithEmail('<email>', '<password>')
  .then(res => console.log(res.data))
  .catch(console.log)

// Outputs:
// { email: '<email>', session_key: '123456', user_id: '123456', ... }

See the login types for the response data.

.loginWithUsername(username, password)

Authenticates you with the API and stores your session data in a cookie jar. Subsequent requests will include these cookies.

api.loginWithUsername('<username>', '<password>')
  .then(res => console.log(res.data))
  .catch(console.log)

// Outputs:
// { username: '<email>', session_key: '123456', user_id: '123456', ... }

See the login types for the response data.

.getUser(id)

Gets a user's profile.

api.getUser('<user_id>')
  .then(res => console.log(res.data.user))
  .catch(console.log);

// Outputs:
// { aweme_count: 1000, nickname: 'example', unique_id: 'musername', ... }

See the user types for the response data.

.searchUsers(params)

Searches for users.

api.searchUsers({
  keyword: 'example',
  count: 10,
  cursor: 0,
})
  .then(res => console.log(res.data.user_list))
  .catch(console.log);

// Outputs:
// [{ user_info: {...}, position: [], uniqposition: [] }, ...]

See the search types for the complete request/response objects.

.getQRCode(id, [schemaType])

Gets the QR code for a user.

api.getQRCode('<user_id>')
  .then(res => console.log(res.data.qrcode_url.url_list[0]))
  .catch(console.log);

// Outputs:
// 'http://p16.muscdn.com/img/musically-qrcode/1111111111111111111~c5_720x720.image'

See the QR code types for the complete request/response objects.

.getPost(id)

Gets a post.

api.getPost('<user_id>')
  .then(res => console.log(res.data.aweme_detail))
  .catch(console.log);

// Outputs:
// { author: {...}, aweme_id: '999', desc: 'description', music: {...}, statistics: {...}, video: {...}, ... }

See the post types for the complete response object.

.listPosts(params)

Lists a user's posts.

api.listPosts({
  user_id: '<user_id>',
  max_cursor: 0,
})
  .then(res => console.log(res.data.aweme_list))
  .catch(console.log);

// Outputs:
// [{ author: {...}, aweme_id: '999', desc: 'description', music: {...}, statistics: {...}, video: {...} }, ...]

See the post types for the complete request/response objects.

.listFollowers(params)

Lists the users that follow the specified user.

api.listFollowers({
  user_id: '<user_id>',
  max_time: Math.floor(new Date().getTime() / 1000),
})
  .then(res => console.log(res.data.followers))
  .catch(console.log);

// Outputs:
// [{ unique_id: 'follower1' }, { unique_id: 'follower2' }, ...]

See the follower types for the complete request/response objects.

.listFollowing(params)

Lists the users that the specified user follows.

api.listFollowing({
  user_id: '<user_id>',
  max_time: Math.floor(new Date().getTime() / 1000),
})
  .then(res => console.log(res.data.followings))
  .catch(console.log);

// Outputs:
// [{ unique_id: 'following1' }, { unique_id: 'following2' }, ...]

See the following types for the complete request/response objects.

.follow(id)

Follows a user.

api.follow('<user_id>')
  .then(res => console.log(res.data.follow_status))
  .catch(console.log);

// Outputs:
// 1

See the follow types for the response data.

.unfollow(id)

Stops following a user.

api.unfollow('<user_id>')
  .then(res => console.log(res.data.follow_status))
  .catch(console.log);

// Outputs:
// 0

See the follow types for the response data.

.listReceivedFollowRequests(params)

Lists the users that have requested to follow the logged in user.

api.listReceivedFollowRequests({
  max_time: Math.floor(new Date().getTime() / 1000),
  count: 10,
})
  .then(res => console.log(res.data.request_users))
  .catch(console.log);

// Outputs:
// [{ unique_id: 'user1' }, { unique_id: 'user2' }, ...]

See the follow types for the complete request/response objects.

.approveFollowRequest(id)

Approves a user's request to follow you.

api.approveFollowRequest('<user_id>')
  .then(res => console.log(res.data.approve_status))
  .catch(console.log);

// Outputs:
// 0

See the follow types for the response data.

.rejectFollowRequest(id)

Rejects a user's request to follow you.

api.rejectFollowRequest('<user_id>')
  .then(res => console.log(res.data.reject_status))
  .catch(console.log);

// Outputs:
// 0

See the follow types for the response data.

.likePost(id)

Likes a post.

api.likePost('<post_id>')
  .then(res => console.log(res.data.is_digg))
  .catch(console.log);

// Outputs:
// 1

.unlikePost(id)

Unlikes a post.

api.unlikePost('<post_id>')
  .then(res => console.log(res.data.is_digg))
  .catch(console.log);

// Outputs:
// 0

.listComments(params)

Lists comments for a post.

api.listComments({
  aweme_id: '<post_id>',
  cursor: 0,
})
  .then(res => console.log(res.data.comments))
  .catch(console.log);

// Outputs:
// [{ text: 'first!', user: {...} }, { text: 'second!', user: {...} }, ...]

See the comment types for the response data.

.postComment(postId, text, [tags])

Comments on a post.

api.postComment('<post_id>', 'first!')
  .then(res => console.log(res.data.comment))
  .catch(console.log);

// Outputs:
// { cid: '<comment_id>', text: 'first!', user: {...}, ... }

See the comment types for the response data.

.listCategories(params)

Lists popular categories/hashtags.

api.listCategories({
  count: 10,
  cursor: 0,
})
  .then(res => console.log(res.data.category_list))
  .catch(console.log);

// Outputs:
// [{ { challenge_info: { cha_name: 'posechallenge', cid: '123' }, desc: 'Trending Hashtag' }, ...]

See the category types for the complete request/response objects.

.searchHashtags(params)

Searches for hashtags.

api.searchHashtags({
  keyword: 'example',
  count: 10,
  cursor: 0,
})
  .then(res => console.log(res.data.challenge_list))
  .catch(console.log);

// Outputs:
// [{ challenge_info: {...}, position: [] }, ...]

See the search types for the complete request/response objects.

.listPostsInHashtag(params)

Lists posts in a hashtag.

api.listPostsInHashtag({
  ch_id: '<hashtag_id>',
})
  .then(res => console.log(res.data.aweme_list))
  .catch(console.log);

// Outputs:
// [{ author: {...}, aweme_id: '999', desc: 'description', music: {...}, statistics: {...}, video: {...} }, ...]

See the hashtag types for the complete request/response objects.

.listForYouFeed([params])

Lists posts in the For You feed.

api.listForYouFeed()
  .then(res => console.log(res.data.aweme_list))
  .catch(console.log);

// Outputs:
// [{ author: {...}, aweme_id: '999', desc: 'description', music: {...}, statistics: {...}, video: {...} }, ...]

See the feed types for the complete request/response objects.

.listFollowingFeed([params])

Lists posts in the Following feed.

api.listFollowingFeed()
  .then(res => console.log(res.data.aweme_list))
  .catch(console.log);

// Outputs:
// [{ author: {...}, aweme_id: '999', desc: 'description', music: {...}, statistics: {...}, video: {...} }, ...]

See the feed types for the complete request/response objects.

.getSticker(id)

Gets information about a sticker/effect.

api.getSticker('<sticker_id>')
  .then(res => console.log(res.data.sticker_infos))
  .catch(console.log);

// Outputs:
// [{ id: '100000', name: 'cloned', owner_nickname: 'Effect Assistant', ...}]

See the sticker types for the complete response object.

.getStickers([ids])

Gets information about many stickers/effects.

api.getStickers(['<sticker_id>', '<sticker_id>'])
  .then(res => console.log(res.data.sticker_infos))
  .catch(console.log);

// Outputs:
// [{ id: '100000', name: 'cloned', owner_nickname: 'Effect Assistant', ...}, ...]

See the sticker types for the complete response object.

.listPostsBySticker(params)

Lists posts that use a sticker/effect.

api.listPostsBySticker({
  count: 20,
  cursor: 0,
  sticker_id: '100000',
})
  .then(res => console.log(res.data.aweme_list))
  .catch(console.log);

// Outputs:
// [{ author: {...}, aweme_id: '999', desc: 'description', music: {...}, statistics: {...}, video: {...} }, ...]

See the sticker types for the complete request/response object.

.joinLiveStream(id)

Joins a live stream.

The rtmp_pull_url value can be used with VLC's Open Network Stream option.

api.joinLiveStream('<room_id>')
  .then(res => console.log(res.data.room))
  .catch(console.log);

// Outputs:
// { create_time: 1000000000, owner: {...}, stream_url: {...}, title: 'Example', user_count: 1000, ... }

See the live stream types for the response data.

.leaveLiveStream(id)

Leaves a live stream.

api.leaveLiveStream('<room_id>')
  .then(res => console.log(res.data.status_code))
  .catch(console.log);

// Outputs:
// 0

.canStartLiveStream()

Determines if the current user is allowed to start a live stream.

api.canStartLiveStream()
  .then(res => console.log(res.data.can_be_live_podcast))
  .catch(console.log);

// Outputs:
// true

See the live stream types for the response data.

.startLiveStream(title, [contactsAuthorized])

Starts a live stream by calling createLiveStreamRoom then updateLiveStreamStatus.

Keep note of the room_id and stream_id properties because you will need them to end the live stream.

The rtmp_push_url value can be used with streaming applications such as OBS.

api.startLiveStream('title')
  .then(res => console.log(res.data.room))
  .catch(console.log);

// Outputs:
// { create_time: 1000000000, owner: {...}, stream_url: {...}, title: 'Example', user_count: 1000, ... }

See the live stream types for the response data.

.endLiveStream(roomId, streamId)

Ends a live stream.

You must call this method to so you are no longer marked as "live" in the app.

api.endLiveStream('<room_id>', '<stream_id>')
  .then(res => console.log(res.data.status_code))
  .catch(console.log);

// Outputs:
// 0

.createLiveStreamRoom(title, [contactsAuthorized])

Creates a room to host a live stream.

The rtmp_push_url value can be used with streaming applications such as OBS.

Note: This method only creates the room for the live stream. You'll need to call updateLiveStreamStatus to mark the stream as started. See startLiveStream for a helper method that makes these calls for you.

api.startLiveStream('title')
  .then(res => console.log(res.data.room))
  .catch(console.log);

// Outputs:
// { create_time: 1000000000, owner: {...}, stream_url: {...}, title: 'Example', user_count: 1000, ... }

See the live stream types for the response data.

.updateLiveStreamStatus(params)

Updates the status of a live stream.

api.updateLiveStreamStatus({
  room_id: '<room_id>',
  stream_id: '<stream_id>',
  status: LiveStreamStatus.Ended,
  reason_no: LiveStreamStatusChangedReason.InitiatedByUser,
})
  .then(res => console.log(res.data.status_code))
  .catch(console.log);

// Outputs:
// 0

See the live stream types for the complete request/response objects.

Resources

Legal

This code is in no way affiliated with, authorized, maintained, sponsored or endorsed by TikTok or any of its affiliates or subsidiaries. This is an independent and unofficial API. Use at your own risk.