超级卵杰的自动脚本(1)连接斗鱼弹幕服务器。

这是关于超级卵杰(74751)直播间的python自动化脚本。超级卵杰只会玩卵子图,导致压分压哪输哪。所以做了个自动化脚本替我压分。基本上卵杰直播间的功能都能实现。接受弹幕是根据别人模板改的。

主要是由两部分实现,第一socket 模块来接收弹幕,第二用selenium控制浏览器发送弹幕。

先第一部分:

先从网上找斗鱼的弹幕协议。斗鱼弹幕服务器第三方接入协议v1.6.2

网上这类的学习资料很多,大家自己看看就行,我这就不再讲了。

导入socket模块,连接斗鱼服务器。

import socket
import struct
import time
import re
sk_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#tcp 连接
host = socket.gethostbyname("openbarrage.douyutv.com")
#斗鱼服务器地址
port = 8601
#端口号
sk_client.connect((host, port))
#创建连接

def send_msg(msg): #根据弹幕协议,对斗鱼服务器发送信息格式处理。
    content = msg.encode()
    length = len(content) + 8
    code = 689
    head = struct.pack('i', length) + struct.pack('i', length) + struct.pack('i', code)
    try:
        sk_client.sendall(head + content)
    except:
        time.sleep(2)

def init(): #登录信息
    msg_login = 'type@=loginreq/roomid@=74751/\x00' 
#若连接其他直播间在roomid@=()/内添加直播间号
    send_msg(msg_login)
    time.sleep(1)
    msg_join = 'type@=joingroup/rid@=74751/gid@=-9999/\x00'
#同上
    send_msg(msg_join)


def get_dm():  #获取弹幕

    pattern = re.compile(b'type@=chatmsg/.+?/nn@=(.+?)/txt@=(.+?)/.+?/level@=(.+?)/')
    #通过re将有用信息提取出来。
    while 1:
        buffer = b''
        while 1:
            recv_data = sk_client.recv(4096)
            buffer += recv_data
            if recv_data.endswith(b'\x00'):
                break
        for nn, txt, level in pattern.findall(buffer):
            try:
                print("[lv.{:0<2}][{}]: {}".format(level.decode(), nn.decode(), txt.decode().strip()))
            except UnicodeDecodeError as e:
                print(e)


def keep_live(): #心跳包,保持连接斗鱼弹幕服务器
    while True:
        time.sleep(15)
        msg_keep = 'type@=mrkl/\x00'
        send_msg(msg_keep)

连接斗鱼弹幕服务器通过以上模块就行了。

因为后续还有许多功能要添加。所以使用多线程Thread。

import socket
import struct
import re
from threading import Thread
import time
sk_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#tcp 连接
host = socket.gethostbyname("openbarrage.douyutv.com")
#斗鱼服务器地址
port = 8601
#端口号
sk_client.connect((host, port))
#创建连接

def send_msg(msg): #根据弹幕协议,对斗鱼服务器发送信息格式处理。
    content = msg.encode()
    length = len(content) + 8
    code = 689
    head = struct.pack('i', length) + struct.pack('i', length) + struct.pack('i', code)
    try:
        sk_client.sendall(head + content)
    except:
        time.sleep(2)

def init(): #登录信息
    msg_login = 'type@=loginreq/roomid@=74751/\x00'
#若连接其他直播间在roomid@=()/内添加直播间号
    send_msg(msg_login)
    time.sleep(1)
    msg_join = 'type@=joingroup/rid@=74751/gid@=-9999/\x00'
#同上
    send_msg(msg_join)

def keep_live(): #心跳包,保持连接斗鱼弹幕服务器
    while True:
        time.sleep(15)
        msg_keep = 'type@=mrkl/\x00'
        send_msg(msg_keep)

def get_dm():  #获取弹幕

    pattern = re.compile(b'type@=chatmsg/.+?/nn@=(.+?)/txt@=(.+?)/.+?/level@=(.+?)/')
    #re提取数据格式
    while 1:
        buffer = b''
        while 1:
            recv_data = sk_client.recv(4096) #获取数据,定义数据大小
            buffer += recv_data #将数据传入buffer
            if recv_data.endswith(b'\x00'):
                break
        for nn, txt, level in pattern.findall(buffer):从数据中通过re取出
            try:
                print("[lv.{:0<2}][{}]: {}".format(level.decode(), nn.decode(), txt.decode().strip())) 
#输出得到内容
            except UnicodeDecodeError as e:
                print(e)
def main():
    init()#向斗鱼弹幕服务器发送连接请求
    t1 = Thread(target=get_dm)#获取弹幕
    t2 = Thread(target=keep_live)#保持心跳在线
    t1.start()#开启线程
    t2.start()
if __name__ == '__main__':
    main()

到这就可以获取弹幕了。其中需要用到socket连接弹幕服务器获取弹幕。re对信息进行提取。Thread多线程使多模块能同时运行。(Thread运行简单,停止难。后续会解决此问题。)代码复制粘贴就能用。

 

你可能感兴趣的:(超级卵杰的自动脚本(1)连接斗鱼弹幕服务器。)