Eine Node.js-Bibliothek zum Empfang von Livestream-Ereignissen wie Kommentaren und Geschenken in Echtzeit von TikTok LIVE durch Verbindung mit dem internen WebCast-Push-Dienst von TikTok. Das Paket enthält einen Wrapper, der nur über den Benutzernamen ( uniqueId
) eine Verbindung zum WebCast-Dienst herstellt. Dadurch können Sie sich sowohl mit Ihrem eigenen Live-Chat als auch mit dem Live-Chat anderer Streamer verbinden. Es sind keine Anmeldeinformationen erforderlich. Neben Chat-Kommentaren können auch andere Ereignisse wie Mitgliederbeitritte, Geschenke, Abonnements, Zuschauer, Follower, Shares, Fragen, Likes und Battles verfolgt werden. Sie können auch automatische Nachrichten in den Chat senden, indem Sie Ihre Sitzungs-ID angeben.
Bevorzugen Sie andere Programmiersprachen?
HINWEIS: Dies ist keine offizielle API. Es ist ein Reverse-Engineering-Projekt.
HINWEIS: Diese JavaScript-Bibliothek ist für die Verwendung in Node.js-Umgebungen vorgesehen. Wenn Sie die Daten im Browser verarbeiten oder anzeigen möchten (clientseitig), müssen Sie die Daten aus der Node.js-Umgebung an den Browser übertragen. Ein guter Ansatz hierfür ist die Verwendung von Socket.IO oder einem anderen Kommunikationsframework mit geringer Latenz. Ein komplettes Beispielprojekt finden Sie hier: TikTok-Chat-Reader
AKTUALISIEREN :
Aufgrund einer Änderung seitens TikTok sind Versionen vor v1.1.7 nicht mehr funktionsfähig. Wenn Sie eine dieser Versionen verwenden, aktualisieren Sie mit dem Befehlnpm i tiktok-live-connector
auf die neueste Version.
npm i tiktok-live-connector
const { WebcastPushConnection } = require ( 'tiktok-live-connector' ) ;
// Username of someone who is currently live
let tiktokUsername = "officialgeilegisela" ;
// Create a new wrapper object and pass the username
let tiktokLiveConnection = new WebcastPushConnection ( tiktokUsername ) ;
// Connect to the chat (await can be used as well)
tiktokLiveConnection . connect ( ) . then ( state => {
console . info ( `Connected to roomId ${ state . roomId } ` ) ;
} ) . catch ( err => {
console . error ( 'Failed to connect' , err ) ;
} )
// Define the events that you want to handle
// In this case we listen to chat messages (comments)
tiktokLiveConnection . on ( 'chat' , data => {
console . log ( ` ${ data . uniqueId } (userId: ${ data . userId } ) writes: ${ data . comment } ` ) ;
} )
// And here we receive gifts sent to the streamer
tiktokLiveConnection . on ( 'gift' , data => {
console . log ( ` ${ data . uniqueId } (userId: ${ data . userId } ) sends ${ data . giftId } ` ) ;
} )
// ...and more events described in the documentation below
Um ein neues WebcastPushConnection
Objekt zu erstellen, sind die folgenden Parameter erforderlich.
WebcastPushConnection(uniqueId, [options])
Parametername | Erforderlich | Beschreibung |
---|---|---|
uniqueId | Ja | Der eindeutige Benutzername des Senders. Sie finden diesen Namen in der URL. Beispiel: https://www.tiktok.com/@officialgeilegisela/live => officialgeilegisela |
Optionen | NEIN | Hier können Sie die folgenden optionalen Verbindungseigenschaften festlegen. Wenn Sie keinen Wert angeben, wird der Standardwert verwendet.processInitialData (Standard: true )Legen Sie fest, ob Sie die Anfangsdaten verarbeiten möchten, einschließlich alter Nachrichten der letzten Sekunden. fetchRoomInfoOnConnect (Standard: true )Legen Sie fest, ob Sie alle Rauminformationen über connect() abrufen möchten. Wenn diese Option aktiviert ist, wird die Verbindung zu Offline-Räumen verhindert. Wenn aktiviert, enthält das Verbindungsergebnis die Rauminformationen über das Attribut roomInfo . Sie können die Rauminformationen auch manuell abrufen (auch im nicht verbundenen Zustand), indem Sie die Funktion getRoomInfo() verwenden.enableExtendedGiftInfo (Standard: false )Legen Sie fest, ob Sie erweiterte Informationen zu Geschenken wie Name, Preis und Bilder des Geschenks erhalten möchten. Diese Informationen werden bei der Geschenkveranstaltung bekannt gegeben. enableWebsocketUpgrade (Standard: true )Legen Sie fest, ob Sie eine WebSocket-Verbindung anstelle von Request Polling verwenden möchten, wenn TikTok dies anbietet. requestPollingIntervalMs (Standard: 1000 )Abfrageintervall anfordern, wenn WebSocket nicht verwendet wird. sessionId (Standard: null )Hier können Sie die aktuelle Sitzungs-ID Ihres TikTok-Kontos ( sessionid- Cookie-Wert) angeben, wenn Sie automatisierte Chat-Nachrichten über die Funktion sendMessage() versenden möchten. Siehe BeispielclientParams (Standard: {} )Benutzerdefinierte Client-Parameter für die Webcast-API. requestHeaders (Standard: {} )An Axios übergebene benutzerdefinierte Anforderungsheader. websocketHeaders (Standard: {} )Benutzerdefinierte Websocket-Header, die an websocket.client übergeben werden. requestOptions (Standard: {} )An Axios übergebene benutzerdefinierte Anforderungsoptionen. Hier können Sie einen httpsAgent zur Verwendung eines Proxys und einen timeout Wert angeben. Siehe Beispiel.websocketOptions (Standard: {} )Benutzerdefinierte Websocket-Optionen, die an websocket.client übergeben werden. Hier können Sie einen agent zur Verwendung eines Proxys und einen timeout Wert angeben. Siehe Beispiel.signProviderOptions (Standard: {} )Benutzerdefinierte Anfrageoptionen für den TikTok-Signaturserver. Hier können Sie einen host , params und headers angeben. |
Beispieloptionen:
let tiktokLiveConnection = new WebcastPushConnection ( tiktokUsername , {
processInitialData : false ,
enableExtendedGiftInfo : true ,
enableWebsocketUpgrade : true ,
requestPollingIntervalMs : 2000 ,
clientParams : {
"app_language" : "en-US" ,
"device_platform" : "web"
} ,
requestHeaders : {
"headerName" : "headerValue"
} ,
websocketHeaders : {
"headerName" : "headerValue"
} ,
requestOptions : {
timeout : 10000
} ,
websocketOptions : {
timeout : 10000
} ,
signProviderOptions : {
host : "https://custom-signing-server.com" ,
params : {
"paramName" : "paramValue"
} ,
headers : {
"headerName" : "headerValue"
}
}
} ) ;
Ein WebcastPushConnection
Objekt enthält die folgenden Methoden.
Methodenname | Beschreibung |
---|---|
verbinden | Stellt eine Verbindung zum Live-Stream-Chat her. Gibt ein Promise zurück, das aufgelöst wird, wenn die Verbindung erfolgreich hergestellt wurde. |
trennen | Trennt die Verbindung. |
getState | Ruft den aktuellen Verbindungsstatus einschließlich der zwischengespeicherten Rauminformationen ab (siehe unten). |
getRoomInfo | Ruft die aktuellen Rauminformationen von der TikTok-API ab, einschließlich Streamer-Informationen, Raumstatus und Statistiken. Gibt ein Promise zurück, das aufgelöst wird, wenn die API-Anfrage abgeschlossen ist.Hinweis: Sie können diese Funktion auch dann aufrufen, wenn keine Verbindung besteht. Beispiel |
getAvailableGifts | Ruft eine Liste aller verfügbaren Geschenke ab, einschließlich Geschenkname, Bild-URL, Diamantpreis und vielen anderen Informationen. Gibt ein Promise zurück, das aufgelöst wird, wenn alle verfügbaren Geschenke von der API abgerufen wurden.Hinweis: Sie können diese Funktion auch dann aufrufen, wenn keine Verbindung besteht. Beispiel |
Nachricht senden(text, [sessionId]) | Sendet mithilfe des bereitgestellten Sitzungscookies (angegeben in den Konstruktoroptionen oder über den zweiten Funktionsparameter) eine Chat-Nachricht in den aktuellen Live-Raum. Gibt ein Promise zurück, das aufgelöst wird, wenn die Chat-Nachricht an die API übermittelt wurde.ACHTUNG: Die Nutzung dieser Funktion erfolgt auf eigenes Risiko. Spam-Nachrichten können zur Sperrung Ihres TikTok-Kontos führen. Seien Sie vorsichtig! Beispiel |
Ein WebcastPushConnection
Objekt verfügt über die folgenden Ereignisse, die über .on(eventName, eventHandler)
verarbeitet werden können.
Kontrollereignisse:
Nachrichtenereignisse:
Benutzerdefinierte Ereignisse:
connected
Wird ausgelöst, wenn die Verbindung erfolgreich hergestellt wurde.
tiktokLiveConnection . on ( 'connected' , state => {
console . log ( 'Hurray! Connected!' , state ) ;
} )
{
isConnected : true ,
upgradedToWebsocket : true ,
roomId : '7137682087200557829' ,
roomInfo : {
AnchorABMap : { } ,
admin_user_ids : [ ] ,
anchor_scheduled_time_text : '' ,
anchor_share_text : '' ,
anchor_tab_type : 7 ,
answering_question_content : '' ,
app_id : 1233 ,
audio_mute : 0 ,
auto_cover : 0 ,
book_end_time : 0 ,
book_time : 0 ,
business_live : 0 ,
challenge_info : '' ,
client_version : 250701 ,
comment_has_text_emoji_emote : 0 ,
comment_name_mode : 0 ,
commerce_info : {
commerce_permission : 0 ,
oec_live_enter_room_init_data : '' ,
use_async_load : false
} ,
common_label_list : '' ,
content_tag : '' ,
cover : {
avg_color : '' ,
height : 0 ,
image_type : 0 ,
is_animated : false ,
open_web_url : '' ,
uri : '720x720/tos-maliva-avt-0068/4e64db7f7c37caf9b2df71df8580a9b0' ,
url_list : [ Array ] ,
width : 0
} ,
create_time : 1661871149 ,
deco_list : [ ] ,
deprecated10 : '' ,
deprecated11 : '' ,
deprecated12 : '' ,
deprecated13 : '' ,
deprecated14 : 0 ,
deprecated15 : 0 ,
deprecated16 : 0 ,
deprecated17 : [ ] ,
deprecated18 : 0 ,
deprecated19 : '' ,
deprecated195 : false ,
deprecated2 : '' ,
deprecated20 : 0 ,
deprecated21 : false ,
deprecated22 : 0 ,
deprecated23 : '' ,
deprecated24 : 0 ,
deprecated26 : '' ,
deprecated28 : '' ,
deprecated3 : { } ,
deprecated30 : '' ,
deprecated31 : false ,
deprecated32 : '' ,
deprecated35 : 0 ,
deprecated36 : 0 ,
deprecated39 : '' ,
deprecated4 : 0 ,
deprecated41 : 0 ,
deprecated43 : false ,
deprecated44 : 0 ,
deprecated5 : false ,
deprecated6 : '' ,
deprecated7 : 0 ,
deprecated8 : '' ,
deprecated9 : '' ,
disable_preload_stream : false ,
drawer_tab_position : '' ,
effect_info : [ ] ,
existed_commerce_goods : false ,
fansclub_msg_style : 2 ,
feed_room_label : {
avg_color : '#F1FFEB' ,
height : 0 ,
image_type : 0 ,
is_animated : false ,
open_web_url : '' ,
uri : 'webcast-sg/2ea90002aca1159b5c67' ,
url_list : [ Array ] ,
width : 0
} ,
feed_room_labels : [ ] ,
filter_msg_rules : [ ] ,
finish_reason : 0 ,
finish_time : 1661878842 ,
finish_url : '' ,
finish_url_v2 : '' ,
follow_msg_style : 2 ,
forum_extra_data : '' ,
game_tag : [ ] ,
gift_msg_style : 2 ,
gift_poll_vote_enabled : false ,
group_source : 0 ,
has_commerce_goods : false ,
have_wishlist : false ,
hot_sentence_info : '' ,
id : 7137682087200558000 ,
id_str : '7137682087200557829' ,
indicators : [ ] ,
interaction_question_version : 0 ,
introduction : '' ,
is_gated_room : false ,
is_replay : false ,
is_show_user_card_switch : false ,
last_ping_time : 1661878842 ,
layout : 0 ,
like_count : 0 ,
link_mic : {
audience_id_list : [ ] ,
battle_scores : [ ] ,
battle_settings : [ Object ] ,
channel_id : 0 ,
followed_count : 0 ,
linked_user_list : [ ] ,
multi_live_enum : 1 ,
rival_anchor_id : 0 ,
show_user_list : [ ]
} ,
linker_map : { } ,
linkmic_layout : 0 ,
live_distribution : [ ] ,
live_id : 12 ,
live_reason : '' ,
live_room_mode : 0 ,
live_sub_only : 0 ,
live_type_audio : false ,
live_type_linkmic : false ,
live_type_normal : true ,
live_type_sandbox : false ,
live_type_screenshot : false ,
live_type_social_live : false ,
live_type_third_party : false ,
living_room_attrs : {
admin_flag : 0 ,
rank : 0 ,
room_id : 7137682087200558000 ,
room_id_str : '7137682087200557829' ,
silence_flag : 0
} ,
lottery_finish_time : 0 ,
mosaic_status : 0 ,
os_type : 1 ,
owner : {
allow_find_by_contacts : false ,
allow_others_download_video : false ,
allow_others_download_when_sharing_video : false ,
allow_share_show_profile : false ,
allow_show_in_gossip : false ,
allow_show_my_action : false ,
allow_strange_comment : false ,
allow_unfollower_comment : false ,
allow_use_linkmic : false ,
avatar_large : [ Object ] ,
avatar_medium : [ Object ] ,
avatar_thumb : [ Object ] ,
badge_image_list : [ ] ,
badge_list : [ ] ,
bg_img_url : '' ,
bio_description : 'HH???تابعوني انستغرامnاذا سقطت سأخذ الجميع معيn?Alin_issa22?' ,
block_status : 0 ,
border_list : [ ] ,
comment_restrict : 0 ,
commerce_webcast_config_ids : [ ] ,
constellation : '' ,
create_time : 0 ,
deprecated1 : 0 ,
deprecated12 : 0 ,
deprecated13 : 0 ,
deprecated15 : 0 ,
deprecated16 : false ,
deprecated17 : false ,
deprecated18 : '' ,
deprecated19 : false ,
deprecated2 : 0 ,
deprecated21 : 0 ,
deprecated28 : false ,
deprecated29 : '' ,
deprecated3 : 0 ,
deprecated4 : 0 ,
deprecated5 : '' ,
deprecated6 : 0 ,
deprecated7 : '' ,
deprecated8 : 0 ,
disable_ichat : 0 ,
display_id : 'alin.i7' ,
enable_ichat_img : 0 ,
exp : 0 ,
fan_ticket_count : 0 ,
fold_stranger_chat : false ,
follow_info : [ Object ] ,
follow_status : 0 ,
ichat_restrict_type : 0 ,
id : 6672446849804223000 ,
id_str : '6672446849804223493' ,
is_follower : false ,
is_following : false ,
link_mic_stats : 0 ,
media_badge_image_list : [ ] ,
modify_time : 1661427082 ,
need_profile_guide : false ,
new_real_time_icons : [ ] ,
nickname : '?ALIN?' ,
own_room : [ Object ] ,
pay_grade : [ Object ] ,
pay_score : 0 ,
pay_scores : 0 ,
push_comment_status : false ,
push_digg : false ,
push_follow : false ,
push_friend_action : false ,
push_ichat : false ,
push_status : false ,
push_video_post : false ,
push_video_recommend : false ,
real_time_icons : [ ] ,
sec_uid : 'MS4wLjABAAAAuUKuWAiw0GQO2_zOeyns0YCBRK7ztdoDWAAQ6gPFLBNSdTs-g5BsgScwTD9jWeK_' ,
secret : 0 ,
share_qrcode_uri : '' ,
special_id : '' ,
status : 1 ,
ticket_count : 0 ,
top_fans : [ ] ,
top_vip_no : 0 ,
upcoming_event_list : [ ] ,
user_attr : [ Object ] ,
user_role : 0 ,
verified : false ,
verified_content : '' ,
verified_reason : '' ,
with_car_management_permission : false ,
with_commerce_permission : false ,
with_fusion_shop_entry : false
} ,
owner_device_id : 0 ,
owner_device_id_str : '' ,
owner_user_id : 6672446849804223000 ,
owner_user_id_str : '' ,
pre_enter_time : 0 ,
preview_flow_tag : 0 ,
ranklist_audience_type : 0 ,
relation_tag : '' ,
replay : true ,
room_audit_status : 0 ,
room_auth : {
Banner : 1 ,
BroadcastMessage : 0 ,
Chat : true ,
ChatL2 : false ,
ChatSubOnly : false ,
CommercePermission : 0 ,
CustomizablePoll : 0 ,
Danmaku : false ,
Digg : true ,
DonationSticker : 2 ,
EventPromotion : 0 ,
Gift : true ,
GiftAnchorMt : 1 ,
GiftPoll : 0 ,
GoldenEnvelope : 0 ,
GoldenEnvelopeActivity : 0 ,
InteractionQuestion : true ,
Landscape : 2 ,
LandscapeChat : 0 ,
LuckMoney : true ,
Pictionary : 0 ,
Poll : 0 ,
Promote : false ,
PromoteOther : 0 ,
Props : false ,
PublicScreen : 1 ,
QuickChat : 0 ,
Rank : 0 ,
RoomContributor : false ,
Share : true ,
ShareEffect : 0 ,
ShoppingRanking : 0 ,
UserCard : true ,
UserCount : 0 ,
Viewers : false ,
deprecated1 : false ,
deprecated2 : 0 ,
deprecated3 : 0 ,
deprecated4 : 0 ,
deprecated5 : 0 ,
deprecated6 : 0 ,
deprecated7 : 0 ,
deprecated8 : 0 ,
deprecated9 : 0 ,
transaction_history : 1 ,
use_user_pv : false
} ,
room_create_ab_param : '' ,
room_layout : 0 ,
room_sticker_list : [ ] ,
room_tabs : [ ] ,
room_tag : 0 ,
scroll_config : '' ,
search_id : 0 ,
share_msg_style : 2 ,
share_url : 'https://m.tiktok.com/share/live/7137682087200557829/?language=en' ,
short_title : '' ,
short_touch_items : [ ] ,
social_interaction : { linkmic_scene_linker : { } , multi_live : [ Object ] } ,
start_time : 0 ,
stats : {
deprecated1 : 0 ,
deprecated2 : '' ,
digg_count : 0 ,
enter_count : 0 ,
fan_ticket : 0 ,
follow_count : 686 ,
gift_uv_count :