مكتبة Node.js لتلقي أحداث البث المباشر مثل التعليقات والهدايا في الوقت الفعلي من TikTok LIVE عن طريق الاتصال بخدمة الدفع WebCast الداخلية في TikTok. تتضمن الحزمة غلافًا يتصل بخدمة WebCast باستخدام اسم المستخدم فقط ( uniqueId
). يتيح لك هذا الاتصال بالدردشة المباشرة الخاصة بك بالإضافة إلى الدردشة المباشرة لمقدمي البث الآخرين. لا توجد أوراق اعتماد مطلوبة. إلى جانب تعليقات الدردشة، يمكن تتبع الأحداث الأخرى مثل انضمام الأعضاء والهدايا والاشتراكات والمشاهدين والمتابعات والمشاركات والأسئلة والإعجابات والمعارك. يمكنك أيضًا إرسال رسائل تلقائية إلى الدردشة من خلال توفير معرف الجلسة الخاص بك.
هل تفضل لغات البرمجة الأخرى؟
ملاحظة: هذه ليست واجهة برمجة التطبيقات الرسمية. إنه مشروع هندسة عكسية.
ملاحظة: مكتبة JavaScript هذه مخصصة للاستخدام في بيئات Node.js. إذا كنت تريد معالجة البيانات أو عرضها في المتصفح (من جانب العميل)، فأنت بحاجة إلى نقل البيانات من بيئة Node.js إلى المتصفح. الطريقة الجيدة لذلك هي استخدام المقبس.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 الخاص بك (قيمة ملف تعريف ارتباط معرف الجلسة ) إذا كنت تريد إرسال رسائل دردشة آلية عبر وظيفة sendMessage() . انظر المثالclientParams (الافتراضي: {} )معلمات العميل المخصصة لـ Webcast API. requestHeaders (الافتراضي: {} )تم تمرير رؤوس الطلبات المخصصة إلى Axios. websocketHeaders (الافتراضي: {} )تم تمرير رؤوس websocket المخصصة إلى websocket.client. requestOptions (الافتراضي: {} )تم تمرير خيارات الطلب المخصصة إلى Axios. هنا يمكنك تحديد httpsAgent لاستخدام الوكيل وقيمة timeout . انظر المثال.websocketOptions (الافتراضي: {} )تم تمرير خيارات websocket المخصصة إلى 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 سيتم حله عند الانتهاء من طلب واجهة برمجة التطبيقات.ملحوظة: يمكنك استدعاء هذه الوظيفة حتى لو لم تكن متصلاً. مثال |
getAvailableGifts | احصل على قائمة بجميع الهدايا المتاحة بما في ذلك اسم الهدية وعنوان url للصورة وتكلفة الماس والكثير من المعلومات الأخرى. إرجاع Promise سيتم حله عند استرداد جميع الهدايا المتاحة من واجهة برمجة التطبيقات.ملحوظة: يمكنك استدعاء هذه الوظيفة حتى لو لم تكن متصلاً. مثال |
إرسال رسالة(text, [sessionId]) | يرسل رسالة محادثة إلى الغرفة المباشرة الحالية باستخدام ملف تعريف ارتباط الجلسة المقدم (المحدد في خيارات المنشئ أو عبر معلمة الوظيفة الثانية). يُرجع Promise سيتم حله عند إرسال رسالة الدردشة إلى واجهة برمجة التطبيقات.تحذير: استخدام هذه الوظيفة على مسؤوليتك الخاصة. يمكن أن تؤدي الرسائل غير المرغوب فيها إلى تعليق حساب 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 :