通过逆向口袋48(Pocket48)的API,每个成员都有固定的userId,通过userId查询

https://pocketapi.48.cn/live/api/v1/live/getLiveList
获得一个带有直播信息的json数据结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
"liveId": "661709871654965248",
"coverPath": "/2021/1031/6431xp3dsr5vxor64s3p44xnt3vm.jpg",
"title": "👀",
"liveType": 1,
"status": 3,
"ctime": "1635693527017",
"userInfo": {
"userId": "6431",
"nickname": "SNH48-陈琳",
"avatar": "/2021/0722/6431xobdy95paiyckl5t0ee9ohy5.jpg",
"badge": [],
"level": 4,
"isStar": true,
"friends": "0",
"followers": "0",
"teamLogo": "/mediasource/teamLogo2/all/snh48_x.png",
"signature": "",
"bgImg": "",
"vip": false,
"userRole": 3,
"pfUrl": "/2021/0609/000xf5n51i9ufwwzlhao1f95czj.png",
"effectUser": true
},
"liveMode": 0,
"pictureOrientation": 0,
"isCollection": 0,
"inMicrophoneConnection": false
}

avatar:成员头像

teamlogo:对应队伍的logo

pfurl:暂时未知

ctime:开播时间

liveId:直播ID(唯一)

拿到liveId后去请求:

https://pocketapi.48.cn/live/api/v1/live/getLiveOne
会有以下三种情况:

  • 如果成员正在直播,返回一个rtmp直播流
  • 如果成员直播结束,但录播还没有生成,则不会请求到任何结果,只会提示“回放生成中”
  • 如果直播结束同时录播也已经生成,则会返回一个:
    1
    2
    3
    4
    {
    "msgFilePath": "https://source.48.cn/live/lrc/20211031/e1952ed0-d099-46e5-9491-bfa3172bf41d.lrc",
    "playStreamPath": "https://cychengyuan-vod.48.cn/6431/20211031/cy/661663746327646208-ni2tfgt0b60hsemsmza9.m3u8"
    }
    msgFilePath是直播弹幕,口袋48的弹幕很奇怪,是用歌词的LRC进行弹幕储存的,时间是从成员直播开始一直到结束的所有弹幕,配合上面的ctime可以对应出具体的时间

下载录播也很简单,只需要ffmpeg即可:

./ffmpeg -i 找到的m3u8流 -c copy /path/to/save/video.mp4
如果成员没有开直播而只是开了电台的话,则视频的所有画面都会是成员暂时离开,这是正常现象

接下来就可以做切片了,不过在切片的时候需要注意一下:大部分成员的直播弹幕都是720p 30fps(有少部分是1080p 30fps,还有极少数是900p 24fps)

就先写到这吧,以后想到啥了就补充