Una biblioteca de Node.js para recibir eventos de transmisión en vivo, como comentarios y obsequios, en tiempo real desde TikTok LIVE conectándose al servicio push interno WebCast de TikTok. El paquete incluye un contenedor que se conecta al servicio WebCast usando solo el nombre de usuario ( uniqueId
). Esto le permite conectarse a su propio chat en vivo, así como al chat en vivo de otros transmisores. No se requieren credenciales. Además de los comentarios del chat, se pueden realizar un seguimiento de otros eventos, como miembros que se unen, obsequios, suscripciones, espectadores, seguidores, acciones compartidas, preguntas, me gusta y batallas. También puede enviar mensajes automáticos al chat proporcionando su ID de sesión.
¿Prefieres otros lenguajes de programación?
NOTA: Esta no es una API oficial. Es un proyecto de ingeniería inversa.
NOTA: Esta biblioteca de JavaScript está diseñada para usarse en entornos Node.js. Si desea procesar o mostrar los datos en el navegador (del lado del cliente), debe transferir los datos desde el entorno Node.js al navegador. Un buen enfoque para esto es utilizar Socket.IO o un marco de comunicación de baja latencia diferente. Puede encontrar un proyecto de ejemplo completo aquí: TikTok-Chat-Reader
ACTUALIZAR :
Debido a un cambio por parte de TikTok, las versiones anteriores a la v1.1.7 ya no son funcionales. Si está utilizando una de estas versiones, actualice a la última versión utilizando el comandonpm i tiktok-live-connector
.
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
Para crear un nuevo objeto WebcastPushConnection
se requieren los siguientes parámetros.
WebcastPushConnection(uniqueId, [options])
Nombre del parámetro | Requerido | Descripción |
---|---|---|
ID único | Sí | El nombre de usuario único de la emisora. Puede encontrar este nombre en la URL. Ejemplo: https://www.tiktok.com/@officialgeilegisela/live => officialgeilegisela |
opciones | No | Aquí puede configurar las siguientes propiedades de conexión opcionales. Si no especifica un valor, se utilizará el valor predeterminado.processInitialData (predeterminado: true )Defina si desea procesar los datos iniciales que incluyen mensajes antiguos de los últimos segundos. fetchRoomInfoOnConnect (predeterminado: true )Defina si desea recuperar toda la información de la habitación en connect() . Si esta opción está habilitada, se impedirá la conexión a salas sin conexión. Si está habilitado, el resultado de la conexión contiene la información de la habitación a través del atributo roomInfo . También puede recuperar manualmente la información de la habitación (incluso en un estado desconectado) usando la función getRoomInfo() .enableExtendedGiftInfo (predeterminado: false )Defina si desea recibir información ampliada sobre obsequios como nombre, costo e imágenes del obsequio. Esta información se proporcionará en el evento de obsequio. enableWebsocketUpgrade (predeterminado: true )Defina si desea utilizar una conexión WebSocket en lugar de solicitar sondeo si TikTok lo ofrece. requestPollingIntervalMs (predeterminado: 1000 )Solicite un intervalo de sondeo si no se utiliza WebSocket. sessionId (predeterminado: null )Aquí puede especificar el ID de sesión actual de su cuenta de TikTok (valor de cookie de ID de sesión ) si desea enviar mensajes de chat automatizados a través de la función sendMessage() . Ver ejemploclientParams (predeterminado: {} )Parámetros de cliente personalizados para Webcast API. requestHeaders (predeterminado: {} )Encabezados de solicitud personalizados pasados a axios. websocketHeaders (predeterminado: {} )Encabezados de websocket personalizados pasados a websocket.client. requestOptions (predeterminado: {} )Opciones de solicitud personalizadas pasadas a axios. Aquí puede especificar un httpsAgent para usar un proxy y un valor timeout . Ver ejemplo.websocketOptions (predeterminado: {} )Opciones de websocket personalizadas pasadas a websocket.client. Aquí puede especificar un agent para que utilice un proxy y un valor timeout . Ver ejemplo.signProviderOptions (predeterminado: {} )Opciones de solicitud personalizadas para el servidor de firma de TikTok. Aquí puede especificar un host , params y headers . |
Opciones de ejemplo:
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"
}
}
} ) ;
Un objeto WebcastPushConnection
contiene los siguientes métodos.
Nombre del método | Descripción |
---|---|
conectar | Se conecta al chat de transmisión en vivo. Devuelve una Promise que se resolverá cuando la conexión se establezca correctamente. |
desconectar | Desconecta la conexión. |
obtener estado | Obtiene el estado de conexión actual, incluida la información de la sala almacenada en caché (ver más abajo). |
obtener información de la habitación | Obtiene la información actual de la sala de la API de TikTok, incluida la información del transmisor, el estado de la sala y las estadísticas. Devuelve una Promise que se resolverá cuando finalice la solicitud de API.Nota: Puedes llamar a esta función incluso si no estás conectado. Ejemplo |
obtenerDisponibleRegalos | Obtiene una lista de todos los obsequios disponibles, incluido el nombre del obsequio, la URL de la imagen, el costo del diamante y mucha otra información. Devuelve una Promise que se resolverá cuando se hayan recuperado todos los obsequios disponibles de la API.Nota: Puedes llamar a esta función incluso si no estás conectado. Ejemplo |
enviar mensaje(text, [sessionId]) | Envía un mensaje de chat a la sala en vivo actual utilizando la cookie de sesión proporcionada (especificada en las opciones del constructor o mediante el segundo parámetro de función). Devuelve una Promise que se resolverá cuando el mensaje de chat se haya enviado a la API.ADVERTENCIA: El uso de esta función es bajo su propio riesgo. Los mensajes de spam pueden provocar la suspensión de su cuenta de TikTok. ¡Ten cuidado! Ejemplo |
Un objeto WebcastPushConnection
tiene los siguientes eventos que se pueden manejar mediante .on(eventName, eventHandler)
Controlar eventos:
Eventos de mensajes:
Eventos personalizados:
connected
Se activa cuando la conexión se establece correctamente.
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 :