jwdeveloper / TikTokLiveJava

Java implementation of TikTok-Live-Connector library. Receive live stream events (comments, gifts, etc.) in realtime from TikTok LIVE.
MIT License
89 stars 26 forks source link
api api-wrapper bot broadcast chat connector live livestream package scraper stream tiktok tiktok-api tiktok-java tiktok-live tiktok-live-java tiktoklive webcast websocket

TikTok Live Java

❤️❤️🎁 *Connect to TikTok live in 3 lines* 🎁❤️❤️

Introduction

A Java library inspired by TikTokLive and TikTokLiveSharp. Use it to receive live stream events such as comments and gifts in realtime from TikTok LIVE by connecting to TikTok's internal WebCast push service. The library includes a wrapper that connects to the WebCast service using just the username (uniqueId). This allows you to connect to your own live chat as well as the live chat of other streamers. No credentials are required. Events such as Members Joining, Gifts, Subscriptions, Viewers, Follows, Shares, Questions, Likes and Battles can be tracked.

IMAGE ALT TEXT

Join the support discord and visit the #java-support channel for questions, contributions and ideas. Feel free to make pull requests with missing/new features, fixes, etc

Do you prefer other programming languages?

NOTE: This is not an official API. It's a reverse engineering project.

Overview

Getting started

  1. Install the package

Maven

   <repositories>
        <repository>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </repository>
    </repositories>

   <dependencies>
         <dependency>
            <groupId>com.github.jwdeveloper.TikTok-Live-Java</groupId>
            <artifactId>Client</artifactId>
             <version>1.8.7-Release</version>
            <scope>compile</scope>
        </dependency>
   </dependencies>

Gradle

dependencyResolutionManagement {
        repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
        repositories {
            mavenCentral()
            maven { url 'https://jitpack.io' }
        }
    }

dependencies {
            implementation 'com.github.jwdeveloper.TikTok-Live-Java:Client:1.8.5-Release'
    }
  1. Create your first chat connection

TikTokLive.newClient("bangbetmenygy")
        .onGift((liveClient, event) ->
        {
            String message = switch (event.getGift()) {
                case ROSE -> "ROSE!";
                case GG -> "GOOD GAME";
                case TIKTOK -> "Ye";
                case CORGI -> "Nice gift";
                default -> "Thank you for " + event.getGift().getName();
            };
            System.out.println(event.getUser().getProfileName() + " sends " + message);
        })
        .onGiftCombo((liveClient, event) ->
        {
            System.out.println(event.getComboState()+ " " + event.getCombo() + " " + event.getGift().getName());
        })
        .onRoomInfo((liveClient, event) ->
        {
            var roomInfo = event.getRoomInfo();
            System.out.println("Room Id: "+roomInfo.getRoomId());
            System.out.println("Likes: "+roomInfo.getLikesCount());
            System.out.println("Viewers: "+roomInfo.getViewersCount());
        })
        .onJoin((liveClient, event) ->
        {
            System.out.println(event.getUser().getProfileName() + "Hello on my stream! ");
        })
        .onConnected((liveClient, event) ->
        {
            System.out.println("Connected to live ");
        })
        .onError((liveClient, event) ->
        {
            System.out.println("Error! " + event.getException().getMessage());
        })
        .buildAndConnect();
  1. Configure (optional)

        TikTokLive.newClient("bangbetmenygy")
                .configure((settings) ->
                {
                    settings.setHostName("bangbetmenygy"); // This method is useful in case you want change hostname later
                    settings.setClientLanguage("en"); // Language
                    settings.setTimeout(Duration.ofSeconds(2)); // Connection timeout
                    settings.setLogLevel(Level.ALL); // Log level
                    settings.setPrintToConsole(true); // Printing all logs to console even if log level is Level.OFF
                    settings.setRetryOnConnectionFailure(true); // Reconnecting if TikTok user is offline
                    settings.setRetryConnectionTimeout(Duration.ofSeconds(1)); // Timeout before next reconnection

                    //Optional: Sometimes not every message from chat are send to TikTokLiveJava to fix this issue you can set sessionId
                    // documentation how to obtain sessionId https://github.com/isaackogan/TikTok-Live-Connector#send-chat-messages
                    settings.setSessionId("86c3c8bf4b17ebb2d74bb7fa66fd0000");

                    //Optional:
                    //RoomId can be used as an override if you're having issues with HostId.
                    //You can find it in the HTML for the livestream-page
                    settings.setRoomId("XXXXXXXXXXXXXXXXX");
                })
                .buildAndConnect();
        //  

Events

Events

Control:

Message:

Debug:

onReconnecting TikTokReconnectingEvent

TikTokLive.newClient("host-name")
.onReconnecting((liveClient, event) ->
{

})
.buildAndConnect();


onError TikTokErrorEvent

General error event. You should handle this.

TikTokLive.newClient("host-name")
.onError((liveClient, event) ->
{

})
.buildAndConnect();


onConnected TikTokConnectedEvent

Triggered when the connection is successfully established.

TikTokLive.newClient("host-name")
.onConnected((liveClient, event) ->
{

})
.buildAndConnect();


onDisconnected TikTokDisconnectedEvent

Triggered when the connection gets disconnected. In that case you can call connect() again to have a reconnect logic. Note that you should wait a little bit before attempting a reconnect to to avoid being rate-limited.

TikTokLive.newClient("host-name")
.onDisconnected((liveClient, event) ->
{

})
.buildAndConnect();


onEvent TikTokEvent

Base class for all events

TikTokLive.newClient("host-name")
.onEvent((liveClient, event) ->
{

})
.buildAndConnect();


onEvent TikTokEvent

Base class for all events

TikTokLive.newClient("host-name")
.onEvent((liveClient, event) ->
{

})
.buildAndConnect();


onComment TikTokCommentEvent

Triggered every time a new chat comment arrives.

TikTokLive.newClient("host-name")
.onComment((liveClient, event) ->
{

})
.buildAndConnect();


onRoomInfo TikTokRoomInfoEvent

Triggered when LiveRoomInfo got updated such as likes, viewers, ranking ....

TikTokLive.newClient("host-name")
.onRoomInfo((liveClient, event) ->
{

})
.buildAndConnect();


onGift TikTokGiftEvent

Triggered when user sends gifts that has no combo (most of expensive gifts) or if combo has finished

TikTokLive.newClient("host-name")
.onGift((liveClient, event) ->
{

})
.buildAndConnect();


onSubscribe TikTokSubscribeEvent

Triggers when a user creates a subscription.

TikTokLive.newClient("host-name")
.onSubscribe((liveClient, event) ->
{

})
.buildAndConnect();


onFollow TikTokFollowEvent

Triggers when a user follows the streamer. Based on social event.

TikTokLive.newClient("host-name")
.onFollow((liveClient, event) ->
{

})
.buildAndConnect();


onGiftCombo TikTokGiftComboEvent

Triggered every time gift is sent

@see GiftSendType it has 3 states

Example when user sends gift with combo

>Combo: 1 -> comboState = GiftSendType.Begin

Combo: 4 -> comboState = GiftSendType.Active

Combo: 8 -> comboState = GiftSendType.Active

Combo: 12 -> comboState = GiftSendType.Finished

Remember if comboState is Finished both TikTokGiftComboEvent and TikTokGiftEvent event gets triggered ```java TikTokLive.newClient("host-name") .onGiftCombo((liveClient, event) -> { }) .buildAndConnect(); ```
## onLiveEnded [TikTokLiveEndedEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLiveEndedEvent.java) Triggered when the live stream gets terminated by the host. Will also trigger the TikTokDisconnectedEvent event. ```java TikTokLive.newClient("host-name") .onLiveEnded((liveClient, event) -> { }) .buildAndConnect(); ```
## onQuestion [TikTokQuestionEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokQuestionEvent.java) Triggered every time someone asks a new question via the question feature. ```java TikTokLive.newClient("host-name") .onQuestion((liveClient, event) -> { }) .buildAndConnect(); ```
## onShare [TikTokShareEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokShareEvent.java) Triggers when a user shares the stream. Based on social event. ```java TikTokLive.newClient("host-name") .onShare((liveClient, event) -> { }) .buildAndConnect(); ```
## onLiveUnpaused [TikTokLiveUnpausedEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLiveUnpausedEvent.java) ```java TikTokLive.newClient("host-name") .onLiveUnpaused((liveClient, event) -> { }) .buildAndConnect(); ```
## onEmote [TikTokEmoteEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokEmoteEvent.java) Triggered every time a subscriber sends an emote (sticker). ```java TikTokLive.newClient("host-name") .onEmote((liveClient, event) -> { }) .buildAndConnect(); ```
## onJoin [TikTokJoinEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokJoinEvent.java) ```java TikTokLive.newClient("host-name") .onJoin((liveClient, event) -> { }) .buildAndConnect(); ```
## onLike [TikTokLikeEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokLikeEvent.java) Triggered when a viewer sends likes to the streamer. For streams with many viewers, this event is not always triggered by TikTok. ```java TikTokLive.newClient("host-name") .onLike((liveClient, event) -> { }) .buildAndConnect(); ```
## onLivePaused [TikTokLivePausedEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLivePausedEvent.java) ```java TikTokLive.newClient("host-name") .onLivePaused((liveClient, event) -> { }) .buildAndConnect(); ```
## onWebsocketResponse [TikTokWebsocketResponseEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketResponseEvent.java) ```java TikTokLive.newClient("host-name") .onWebsocketResponse((liveClient, event) -> { }) .buildAndConnect(); ```
## onWebsocketUnhandledMessage [TikTokWebsocketUnhandledMessageEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketUnhandledMessageEvent.java) Triggered every time a protobuf encoded webcast message arrives. You can deserialize the binary object depending on the use case. ```java TikTokLive.newClient("host-name") .onWebsocketUnhandledMessage((liveClient, event) -> { }) .buildAndConnect(); ```
## onHttpResponse [TikTokHttpResponseEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/http/TikTokHttpResponseEvent.java) ```java TikTokLive.newClient("host-name") .onHttpResponse((liveClient, event) -> { }) .buildAndConnect(); ```
## onWebsocketMessage [TikTokWebsocketMessageEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketMessageEvent.java) Triggered every time TikTok sends data. Data incoming as protobuf message. You can deserialize the binary object depending on the use case. ```java TikTokLive.newClient("host-name") .onWebsocketMessage((liveClient, event) -> { }) .buildAndConnect(); ```
## Extensions List of extensions (addons) to TiktokLiveJava that will save your time - [Video Recorder](https://github.com/jwdeveloper/TikTokLiveJava/tree/master/extension-recorder) - [Live data collector to database](https://github.com/jwdeveloper/TikTokLiveJava/tree/master/extension-collector) ## Listeners ```java /** * * Listeners are an alternative way of handling events. * I would to suggest to use then when logic of handing event * is more complex * */ public static void main(String[] args) throws IOException { showLogo(); CustomListener customListener = new CustomListener(); TikTokLive.newClient(SimpleExample.TIKTOK_HOSTNAME) .addListener(customListener) .buildAndConnect(); System.in.read(); } /** * * Method in TikTokEventListener should meet 4 requirements to be detected * - must have @TikTokEventHandler annotation * - must have 2 parameters * - first parameter must be LiveClient * - second must be class that extending TikTokEvent */ public static class CustomListener implements TikTokEventListener { @TikTokEventObserver public void onLike(LiveClient liveClient, TikTokLikeEvent event) { System.out.println(event.toString()); } @TikTokEventObserver public void onError(LiveClient liveClient, TikTokErrorEvent event) { // event.getException().printStackTrace(); } @TikTokEventObserver public void onComment(LiveClient liveClient, TikTokCommentEvent event) { var userName = event.getUser().getName(); var text = event.getText(); liveClient.getLogger().info(userName + ": " + text); } @TikTokEventObserver public void onGift(LiveClient liveClient, TikTokGiftEvent event) { var message = switch (event.getGift()) { case ROSE -> "Thanks :)"; case APPETIZERS -> ":OO"; case APRIL -> ":D"; case TIKTOK -> ":P"; case CAP -> ":F"; default -> ":I"; }; liveClient.getLogger().info(message); } @TikTokEventHandler public void onAnyEvent(LiveClient liveClient, TikTokEvent event) { liveClient.getLogger().info(event.getClass().getSimpleName()); } } // ``` ## Contributing [Library documentation for contributors](https://github.com/jwdeveloper/TikTokLiveJava/wiki) Your improvements are welcome! Feel free to open an issue or pull request.