Библиотека Node.js для получения событий в прямом эфире, таких как комментарии и подарки, в реальном времени от TikTok LIVE, подключившись к внутренней push-службе TikTok WebCast. В пакет входит оболочка, которая подключается к службе WebCast, используя только имя пользователя ( uniqueId
). Это позволяет вам подключаться к собственному живому чату, а также к живому чату других стримеров. Никаких учетных данных не требуется. Помимо комментариев в чате, можно отслеживать и другие события, такие как присоединение участников, подарки, подписки, зрители, подписки, публикации, вопросы, лайки и сражения. Вы также можете отправлять автоматические сообщения в чат, указав свой идентификатор сеанса.
Вы предпочитаете другие языки программирования?
ПРИМЕЧАНИЕ. Это не официальный API. Это проект реверс-инжиниринга.
ПРИМЕЧАНИЕ. Эта библиотека JavaScript предназначена для использования в средах Node.js. Если вы хотите обрабатывать или отображать данные в браузере (на стороне клиента), вам необходимо перенести данные из среды Node.js в браузер. Хорошим подходом для этого является использование Socket.IO или другой среды связи с малой задержкой. Полный пример проекта можно найти здесь: TikTok-Chat-Reader.
ОБНОВЛЯТЬ :
Из-за изменений со стороны TikTok версии до версии 1.1.7 больше не работают. Если вы используете одну из этих версий, обновите ее до последней версии с помощью командыnpm 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
Для создания нового объекта WebcastPushConnection
необходимы следующие параметры.
WebcastPushConnection(uniqueId, [options])
Имя параметра | Необходимый | Описание |
---|---|---|
уникальный идентификатор | Да | Уникальное имя пользователя вещательной компании. Вы можете найти это имя в URL-адресе. Пример: https://www.tiktok.com/@officialgeilegisela/live => officialgeilegisela |
параметры | Нет | Здесь вы можете установить следующие дополнительные свойства соединения. Если вы не укажете значение, будет использовано значение по умолчанию.processInitialData (по умолчанию: true )Определите, хотите ли вы обрабатывать исходные данные, которые включают старые сообщения за последние секунды. fetchRoomInfoOnConnect (по умолчанию: true )Определите, хотите ли вы получить всю информацию о комнате с помощью connect() . Если эта опция включена, подключение к автономным комнатам будет запрещено. Если этот параметр включен, результат подключения содержит информацию о комнате через атрибут roomInfo . Вы также можете вручную получить информацию о комнате (даже в неподключенном состоянии), используя функцию getRoomInfo() .enableExtendedGiftInfo (по умолчанию: false )Определите, хотите ли вы получать расширенную информацию о подарках, такую как название подарка, стоимость и изображения. Эта информация будет предоставлена на подарочном мероприятии. enableWebsocketUpgrade (по умолчанию: true )Определите, хотите ли вы использовать соединение WebSocket вместо опроса запросов, если TikTok предлагает это. requestPollingIntervalMs (по умолчанию: 1000 )Запросите интервал опроса, если WebSocket не используется. sessionId (по умолчанию: null )Здесь вы можете указать текущий идентификатор сеанса вашей учетной записи TikTok (значение файла cookie sessionid ), если вы хотите отправлять автоматические сообщения чата через функцию sendMessage() . См. примерclientParams (по умолчанию: {} )Пользовательские параметры клиента для API веб-трансляции. requestHeaders (по умолчанию: {} )Пользовательские заголовки запросов, передаваемые в axios. websocketHeaders (по умолчанию: {} )Пользовательские заголовки веб-сокетов, передаваемые в websocket.client. requestOptions (по умолчанию: {} )Пользовательские параметры запроса, передаваемые в axios. Здесь вы можете указать httpsAgent для использования прокси и значение timeout . См. пример.websocketOptions (по умолчанию: {} )Пользовательские параметры веб-сокета, передаваемые в websocket.client. Здесь вы можете указать agent , который будет использовать прокси, и значение timeout . См. Пример.signProviderOptions (по умолчанию: {} )Пользовательские параметры запроса для сервера подписи TikTok. Здесь вы можете указать host , params и headers . |
Примеры вариантов:
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"
}
}
} ) ;
Объект WebcastPushConnection
содержит следующие методы.
Имя метода | Описание |
---|---|
соединять | Подключается к чату прямой трансляции. Возвращает Promise , которое будет выполнено после успешного установления соединения. |
отключиться | Разъединяет соединение. |
getState | Получает текущее состояние соединения, включая информацию о кэшированной комнате (см. ниже). |
getRoomInfo | Получает текущую информацию о комнате от TikTok API, включая информацию о стримерах, статус комнаты и статистику. Возвращает Promise , которое будет выполнено после выполнения запроса API.Примечание. Вы можете вызвать эту функцию, даже если вы не подключены. Пример |
ПолучитьДоступныеПодарки | Получает список всех доступных подарков, включая название подарка, URL-адрес изображения, стоимость бриллиантов и много другой информации. Возвращает Promise , которое будет выполнено, когда все доступные подарки будут получены из API.Примечание. Вы можете вызвать эту функцию, даже если вы не подключены. Пример |
отправить сообщение(text, [sessionId]) | Отправляет сообщение чата в текущую живую комнату, используя предоставленный файл cookie сеанса (указанный в параметрах конструктора или через второй параметр функции). Возвращает Promise , которое будет выполнено, когда сообщение чата будет отправлено в API.ВНИМАНИЕ: Вы используете эту функцию на свой страх и риск. Спам-сообщения могут привести к блокировке вашей учетной записи TikTok. Будь осторожен! Пример |
Объект WebcastPushConnection
имеет следующие события, которые можно обрабатывать с помощью .on(eventName, eventHandler)
События управления:
События сообщений:
Пользовательские события:
connected
Срабатывает, когда соединение успешно установлено.
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 :