@ycryptx/tiktok-live-connector
Version:
Node.js module to receive live stream chat events like comments and gifts from TikTok LIVE
114 lines (94 loc) • 2.53 kB
JavaScript
;
const {
EventEmitter
} = require('events');
const {
getUuc
} = require('./tiktokUtils');
const pkg = require('../../package.json');
const axios = require('axios').create({
timeout: 5000,
headers: {
'User-Agent': `${window.navigator.userAgent}`
}
});
let config = {
enabled: true,
signProviderHost: 'https://tiktok.eulerstream.com/',
signProviderFallbackHosts: ['https://tiktok-sign.zerody.one/'],
extraParams: {}
};
let signEvents = new EventEmitter();
function signWebcastRequest(url, headers, cookieJar) {
return signRequest('webcast/sign_url', url, headers, cookieJar);
}
async function signRequest(providerPath, url, headers, cookieJar) {
if (!config.enabled) {
return url;
}
let params = {
url,
client: 'ttlive-node',
...config.extraParams
};
params.uuc = getUuc();
let signHost;
let signResponse;
let signError;
try {
var _signResponse$data;
for (signHost of [config.signProviderHost, ...config.signProviderFallbackHosts]) {
try {
signResponse = await axios.get(signHost + providerPath, {
params,
responseType: 'json'
});
if (signResponse.status === 200 && typeof signResponse.data === 'object') {
break;
}
} catch (err) {
signError = err;
}
}
if (!signResponse) {
throw signError;
}
if (signResponse.status !== 200) {
throw new Error(`Status Code: ${signResponse.status}`);
}
if (!((_signResponse$data = signResponse.data) !== null && _signResponse$data !== void 0 && _signResponse$data.signedUrl)) {
throw new Error('missing signedUrl property');
}
if (headers) {
headers['User-Agent'] = signResponse.data['User-Agent'];
}
if (cookieJar) {
cookieJar.setCookie('msToken', signResponse.data['msToken']);
}
signEvents.emit('signSuccess', {
signHost,
originalUrl: url,
signedUrl: signResponse.data.signedUrl,
headers,
cookieJar
});
return signResponse.data.signedUrl;
} catch (error) {
signEvents.emit('signError', {
signHost,
originalUrl: url,
headers,
cookieJar,
error
}); // If a sessionid is present, the signature is optional => Do not throw an error.
if (cookieJar.getCookieByName('sessionid')) {
return url;
}
throw new Error(`Failed to sign request: ${error.message}; URL: ${url}`);
}
}
module.exports = {
config,
signEvents,
signWebcastRequest
};