WebSocket实时数据获取

引言:用Python写过的爬虫不说1000,也有200个以上了,但是从来没有获取过websocket数据,今天做了个直播页面:http://mlzb.pw ,获取m3u8播放链接时就用到了websocket,于是研究了十几分钟,使用websocket包轻松获取了数据,同时也对websocket有了一定了解,接下来记录一下websocket是怎么获取数据的!


引子

就以这个直播为例(坐稳扶好,开车了):https://www.yaqing74.com

用浏览器调试模式模拟手机端观看直播,在network栏很容易就看到了播放文件是一个m3u8文件:

格式是:

http://xyzaaa1988pullrtmp.yjyc-ask.com/live/{id}_aac/playlist.m3u8

那么我的第一反应是:这个m3u8链接应该能在源码里面找到,或者是拼接到这个m3u8链接,于是ctrl+u查看源码,ctrl+f12搜索,结果连”m3u8”都没搜到

那么第二个反映就是:这个m3u8链接应该可以从ajax请求过来的,然后筛选XHR请求,只有一个加载礼物配置的请求…

这个时候,那么就只能无奈的翻js代码了,翻一下js,基本确定m3u8是从https://7niuyq1.youxuanmeijia.cn/mobile/mini/live.min.js 加载过来的,搜索一下m3u8,果不其然找到了这个

configVideoUrl一个live()函数下的一个method,看一下哪里用到了configVideoUrl:

再看看哪里有用到LiveManager:

好吧,看到这里,基本上可以确定是一个websocket请求获取的数据了(其实早就应该想到ws,因为弹幕什么的应该都是通过ws获取的)。

websocket数据获取

既然确定了是websocket请求获取的数据,那么筛选一下ws请求

仔细看看每一条数据就可以发现:

  1. 第一条获取的ws数据包含了m3u8前缀
  2. 第二条获取的ws数据包含了m3u8特征数据(sid)

那么再看看前面的js拼接规则,我们就能拼接成一个完整的m3u8链接了。

但是问题是:ws请求的数据怎么获取?如果是http请求,我们可以使用requests很方便的获取数据,那么ws请求呢?

搜索一下,我们就能找到答案:

websocket-client

使用websocket-client包,我们就能访问ws链接,并获取到数据,直接贴代码吧:

from websocket import create_connection
import json

def GetPlayUrl(room_id):
    url='wss://szsjh5.com/bar_chat/-1_{}'.format(room_id)
    ws = create_connection(url)
    first_info=json.loads(ws.recv())
    second_info=json.loads(ws.recv())
    thrid_info=json.loads(ws.recv())
    print(first_info)
    print(second_info)
    print(thrid_info)
    hostname=json.loads(first_info['content'])['rtmp']
    lid=json.loads(second_info['content'])['sid']
    video_url=hostname.replace("rtmp", "http")+'/'+lid+"_aac/playlist.m3u8"
    print('get play url : {}'.format(video_url))
    ws.close()
    return video_url

附录

① 模拟手机端是因为pc端使用flash播放,要破flash必须反编译,获取加密密码…反正就是很麻烦,因此抱着试一试的心态,直接模拟手机,果然有效!

本文作者:Abbey

本文链接:https://www.abbeyok.com/archives/52

版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0许可协议。转载请注明出处!

Freekan-3.8.5-去广告版本下... <<
0 条评论

请先登陆注册

已登录,注销 取消