官方文档链接:https://dev.huya.com/docs#/%E5%BC%80%E6%94%BEAPI%E6%8E%A5%E5%85%A5%E8%AF%B4%E6%98%8E
会看到官方已经提供对应的接口。咱们只需要根据文档通过python实现就行了。
这里咱们可以发现,是通过两种方式传输过来的。websocket和https这两种都能获取到弹幕的信息。下面介绍一下websocket的链接方式。
其实官方文档已经告诉你了,怎么建立链接了。下面我一步一步根据官方文档走,可能是因为讲的太详细了,本人踩了一些坑。
这里就说明了,需要用到jwt的验证。这里要注意的是Header,是默认的,根据你使用的jwt的方式默认的。不需要放在signature中。
调通字段:header表明的是jwt的认证方式,HS256的加密算法。
payload这里面缺少了房间id,实际应该是
{
"iat":1556188391,
"exp":1556188991,
"appId":"xxxxxxxxxxxx",
"roomId":roomId
}
然后再用jwt根据文档做进一步处理。生成对应的Signature。python有第三方jwt库可以直接用
附上对应的方法
import jwt
def get_sign(room_id,app_id,secret):
payload = {
"iat":int(time.time()),
"exp":int(time.time())+600,
"roomId":room_id,
"appId":app_id
}
token = jwt.encode(payload,secret,algorithm='HS256')
return token
其中iat是当前时间戳,exp是当前时间戳加上600秒。app_id以及secret是你成为虎牙开发者的时候,会有这两个信息给到你的。
根据上一步,把所有对应的参数都获取到了。然后通过python的webscoket链接的方式,先建立链接。
这一步发送的是你想要获取到的数据,里面包含了很多数据。具体的数据详情见虎牙开发者官方文档。
再下一步是保持心跳。保持心跳的方式很简单,就是建立连接后,保持固定的时间,发送ping字符串即可。
import jwt
import websocket
try:
import thread
except ImportError:
import _thread as thread
import json
import time
def get_sign(room_id,app_id,secret):
payload = {
"iat":int(time.time()),
"exp":int(time.time())+600,
"roomId":room_id,
"appId":app_id
}
token = jwt.encode(payload,secret,algorithm='HS256')
return token
def on_message(ws, message):
info = json.loads(message)
print(info)
def on_error(ws, error):
print(error)
def on_close(ws):
print("### closed ###")
def on_open(ws):
def run(*args):
ws.send('{"command":"subscribeNotice","data":["getMessageNotice","getVipEnterBannerNotice","getSendItemNotice","getOnTVAwardNotice", "getOpenNobleNotice", "getOpenGuardianNotice", "getUserMutedNotice"],"reqId":"123456789"}')
while True:
ws.send("ping")
time.sleep(10)
thread.start_new_thread(run, ())
if __name__ == "__main__":
room_id = 521000
app_id = 'xxxxxxxxxxxxxxxx'
secret = 'xxxxxxxxxxxxxxxxxxx'
sign = get_sign(room_id,app_id,secret)
print(sign.decode())
websocket.enableTrace(True)
ws = websocket.WebSocketApp(
"ws://ws-apiext.huya.com/index.html?do=comm&roomId="+str(room_id)+"&appId="+app_id+"&iat="+str(int(time.time()))+"&sToken="+sign.decode(),
on_message=on_message,
on_error=on_error,
on_close=on_close)
ws.on_open = on_open
ws.run_forever()
后续会更新直播间详情的信息爬取。
此博客纯手工,如有和其他博主的博客雷同或涉及到侵权,请麻烦联系一下我。