|
|
楼主 |
发表于 2025-10-29 15:15:37
|
显示全部楼层
感谢PHP的分享者,我直接转nodejs,若有侵权,请**作者或管理员删除,谢谢!
const express = require('express');
const axios = require('axios');
const cors = require('cors');
const crypto = require('crypto');
const app = express();
const PORT = process.env.PORT || 3000;
// 中间件
app.use(cors());
app.use(express.json());
// 虎牙直播**API
app.get('/huya', async (req, res) => {
try {
const id = req.query.id || '11274154'; // 默认房间ID
// 获取房间**
const roomUrl = `https://mp.huya.com/cache.php?m= ... ileRoom&roomid=${id}`;
const response = await axios.get(roomUrl, {
httpsAgent: new (require('https')).Agent({
rejectUnauthorized: false
})
});
const data = response.data.data;
const uid = data.profileInfo.uid;
const streamName = data.stream.baseSteamInfoList[0].sStreamName;
// 构建基础URL
const baseUrl = `http://al.flv.huya.com/src/${streamName}.flv`;
// 生成参数
const seqid = String(parseInt(uid) + Date.now());
const ss = crypto.createHash('md5').update(`${seqid}|huya_adr|102`).digest('hex');
const wsTime = Math.floor(Date.now() / 1000) + 21600; // 6小时后
const wsTimeHex = wsTime.toString(16);
const wsSecret = crypto.createHash('md5').update(`DWq8BcJ3h6DJt6TY_${uid}_${streamName}_${ss}_${wsTimeHex}`).digest('hex');
// 重定向到最终的直播流URL
const finalUrl = `${baseUrl}?wsSecret=${wsSecret}&wsTime=${wsTimeHex}&ctype=huya_adr&seqid=${seqid}&uid=${uid}&fs=bgct&ver=1&t=102`;
res.redirect(finalUrl);
} catch (error) {
console.error('Error:', error.message);
res.status(500).json({
error: '获取直播流失败',
message: error.message
});
}
});
// 获取直播**的API(不重定向,返回JSON)
app.get('/huya/info', async (req, res) => {
try {
const id = req.query.id || '11274154';
const roomUrl = `https://mp.huya.com/cache.php?m= ... ileRoom&roomid=${id}`;
const response = await axios.get(roomUrl, {
httpsAgent: new (require('https')).Agent({
rejectUnauthorized: false
})
});
const data = response.data.data;
const uid = data.profileInfo.uid;
const streamName = data.stream.baseSteamInfoList[0].sStreamName;
// 生成参数
const seqid = String(parseInt(uid) + Date.now());
const ss = crypto.createHash('md5').update(`${seqid}|huya_adr|102`).digest('hex');
const wsTime = Math.floor(Date.now() / 1000) + 21600;
const wsTimeHex = wsTime.toString(16);
const wsSecret = crypto.createHash('md5').update(`DWq8BcJ3h6DJt6TY_${uid}_${streamName}_${ss}_${wsTimeHex}`).digest('hex');
const finalUrl = `http://al.flv.huya.com/src/${streamName}.flv?wsSecret=${wsSecret}&wsTime=${wsTimeHex}&ctype=huya_adr&seqid=${seqid}&uid=${uid}&fs=bgct&ver=1&t=102`;
res.json({
success: true,
roomId: id,
uid: uid,
streamName: streamName,
liveUrl: finalUrl,
expiresAt: new Date(wsTime * 1000).toISOString()
});
} catch (error) {
console.error('Error:', error.message);
res.status(500).json({
success: false,
error: '获取直播**失败',
message: error.message
});
}
});
// 健康检查端点
app.get('/health', (req, res) => {
res.json({ status: 'OK', timestamp: new Date().toISOString() });
});
// 启动服务器
app.listen(PORT, () => {
console.log(`虎牙直播**API服务运行在 http://localhost {PORT}`);
console.log('可用端点:');
console.log(' GET /huya?id=房间ID - 直接重定向到直播流');
console.log(' GET /huya/info?id=房间ID - 返回直播**JSON');
console.log(' GET /health - 健康检查');
});
PS:仅供学习研究。 |
|