python | websockets库的使用
python | websockets库的使用
最近又想玩玩b站的弹幕,就看了一下websockets库
pip install websockets
这个库是基于asyncio的,所以得用python3.7以上,然后用异步的方式去写,大概写了点demo:
有时间完善一下好了,这个方便的地方就是可以直接连接wss,很爽,不用自己配ssl啥的,中文的东西不多,更多看看官方文档就好。
import asyncio
import websockets
import aiohttp
import json
import struct
import re
import ssl
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36',
'Origin': 'https://live.bilibili.com',
'Connection': 'Upgrade',
'Accept-Language': 'zh-CN,zh;q=0.9',
}
class Pybilidanmu():
def __init__(self):
self.get_danmu_info_url = 'http://api.live.bilibili.com/xlive/web-room/v1/index/getDanmuInfo?id='
self.roomid = "23952162"
self.wss_url = 'wss://tx-bj-live-comet-01.chat.bilibili.com/sub'
self.token = ""
# ws连接
self.ws_connect = None
# get请求进入房间
async def enter_room(self):
url = self.get_danmu_info_url + self.roomid
print(f'> 正在进入{url} ...')
async with aiohttp.ClientSession() as s:
async with s.get(url) as r:
t = await r.text()
data = json.loads(t)
# print(json.dumps(data, indent=4))
if data['code'] == 0:
print(' > 进入房间成功')
self.token = data['data']['token']
host_list = data['data']['host_list']
host = "wss://" + host_list[0]['host']
port = host_list[0]['wss_port']
self.wss_url = host+":"+str(port)+'/sub' # 这里要加上sub不然连不上,笑死
print(f' > 弹幕地址: {self.wss_url}')
# 连接弹幕服务器
await self.connect_dm()
# 心跳包
async def heartbeat(self):
pass
# 连接wss
async def connect_dm(self):
print('> 正在连接wss服务器...')
async with websockets.connect(
self.wss_url,
extra_headers=headers
) as websocket:
# 发送登录包等等
# ...
while True:
tmp = await websocket.recv()
print(tmp)
print('> 连接成功')
if __name__ == '__main__':
client = Pybilidanmu()
tasks = [
client.enter_room(),
]
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(asyncio.wait(tasks))
except KeyboardInterrupt:
for tasks in asyncio.Task.all_tasks():
task.cancel()
loop.run_forever()
loop.close()
本文来自博客园,作者:Mz1,转载请注明原文链接:https://www.cnblogs.com/Mz1-rc/p/16472294.html
如果有问题可以在下方评论或者email:mzi_mzi@163.com