• Python项目2:弹幕复读机


    这个项目是我从B站的一个up主那学到的(原视频号269525280),感觉很是有趣,就是很欠打哈哈

    一、功能

    功能很简单,就是将B站直播间的每条弹幕重新发送一遍。

    二、思路

    先通过post请求获取实时弹幕,再用post请求重新发送。

    三、实现

    1. 获取弹幕

    (1)因为实时弹幕是通过Ajax从服务器获取的,我们打开右击页面选择检查,进入Network,经过一番寻找后找到了msg这个请求,查看其中的关键部分,请求url地址和表单部分,url在请求头中,表单部分类似下图:

    其中,roomid是房间号,csrf_token是post请求的安全验证码,还有一个visit_id是空值,这些都要根据自己的实际情况填写。
    (2)然后我们查看响应信息:


    是一个json字符串,经过比对后可以知道最新的一条弹幕存储在res.json()['data']['room'][-1]['text']中(res是requests响应体)。
    (3)然后我们就可以根据这些数据,使用requests模块获取弹幕,代码如下

    import requests
    
    form_data = {
        'roomid': '90713',
        'csrf_token': 'c93526e213231f715424af182dfb0411',
        'visit_id': ''
    }
    
    res = requests.post("https://api.live.bilibili.com/ajax/msg" ,data=form_data)
    text = res.json()['data']['room'][-1]['text']
    

    2. 发送弹幕

    (1)为了找到发送弹幕的接口,我们只需要手动发送一条,在Network中就一眼看到了:

    这次需要关注的部分除了url和post表单外,还有一个cookie,这个键用来服务器识别我们的浏览器的,如果没有的话,即使发送到服务器弹幕也不会显示。
    (2)弹幕是保存在表单中的msg键中发送给服务器的
    (3)然后根据这些数据向第一步获取的url发送表单,代码如下:

    form_data_send = {
        'color': '16777215',
        'fontsize': '25',
        'mode': '1',
        'msg': '要发送的弹幕',
        'rnd': '1539592977',
        'roomid': '90713',
        'csrf_token': 'c93526e213231f715424af182dfb0411'
    }
    cookie = {
        'Cookie':'l=v; finger=edc6ecda; LIVE_BUVID=AUTO7915376845749539; CURRENT_FNVAL=8; sid=9xsee80j; DedeUserID=23126221; DedeUserID__ckMd5=e597ce186461e9d8; SESSDATA=27b96e94%2C1540276589%2C664ff578; bili_jct=c93526e213231f715424af182dfb0411; fts=1537684594; UM_distinctid=1660524dd947fc-05bc81e71e64fb-8383268-144000-1660524dd95107; im_notify_type_23126221=0; stardustvideo=1; buvid3=AE818E5D-B2C1-44F2-8F09-989661B9F8846688infoc; rpdid=owkkqwkwmxdoskqiokoww; bp_t_offset_23126221=174970628267807201; CURRENT_QUALITY=64; _dfcaptcha=3d138714e8941fa5ecd47cea30ef1917; Hm_lvt_8a6e55dbd2870f0f5bc9194cddf32a02=1538406126,1539591329; Hm_lpvt_8a6e55dbd2870f0f5bc9194cddf32a02=1539593348'
    }
    res = requests.post('https://api.live.bilibili.com/msg/send', cookies= cookie, data=form_data_send)
    

    这其中大部分数据要以自己的实际修改(在自己的浏览器上复制)

    3. 封装调用

    (1)将获取弹幕封装成一个方法,返回弹幕文本;
    (2)将发送弹幕也封装,接收方法1获取的弹幕文本为参数;
    (3)去重,在弹幕未刷新时,阻止多次发送同一条弹幕。
    所以最终代码如下:

    import requests
    
    form_data = {
        'roomid': '90713',
        'csrf_token': 'c93526e213231f715424af182dfb0411',
        'visit_id': ''
    }
    
    def get_message():
        res = requests.post("https://api.live.bilibili.com/ajax/msg" ,data=form_data)
        text = res.json()['data']['room'][-1]['text']
        return text
    
    
    def send_message(msg):
        form_data_send = {
            'color': '16777215',
            'fontsize': '25',
            'mode': '1',
            'msg': msg,
            'rnd': '1539592977',
            'roomid': '90713',
            'csrf_token': 'c93526e213231f715424af182dfb0411'
        }
        cookie = {
            'Cookie':'l=v; finger=edc6ecda; LIVE_BUVID=AUTO7915376845749539; CURRENT_FNVAL=8; sid=9xsee80j; DedeUserID=23126221; DedeUserID__ckMd5=e597ce186461e9d8; SESSDATA=27b96e94%2C1540276589%2C664ff578; bili_jct=c93526e213231f715424af182dfb0411; fts=1537684594; UM_distinctid=1660524dd947fc-05bc81e71e64fb-8383268-144000-1660524dd95107; im_notify_type_23126221=0; stardustvideo=1; buvid3=AE818E5D-B2C1-44F2-8F09-989661B9F8846688infoc; rpdid=owkkqwkwmxdoskqiokoww; bp_t_offset_23126221=174970628267807201; CURRENT_QUALITY=64; _dfcaptcha=3d138714e8941fa5ecd47cea30ef1917; Hm_lvt_8a6e55dbd2870f0f5bc9194cddf32a02=1538406126,1539591329; Hm_lpvt_8a6e55dbd2870f0f5bc9194cddf32a02=1539593348'
        }
        res = requests.post('https://api.live.bilibili.com/msg/send', cookies= cookie, data=form_data_send)
    
    s = ''
    
    while True:
        msg = get_message()
    
        if s == msg:
            continue
        else:
            print('已发送弹幕:', msg)
            send_message(msg)
            s = msg
    
    

    注意:表单数据要以自己的为准

    建议再多加一些延迟和随机办法,不然太招仇恨会被举报的……哭

  • 相关阅读:
    MIT 6.828 JOS学习笔记10. Lab 1 Part 3: The kernel
    Java基础知识点4:继承
    CentOS Installation
    超微主板创建RAID磁盘阵列
    MySQL查询语句
    Psql操作命令
    Let's Encrypt 免费 SSL 证书续期
    Linux系统禁用swap分区
    公共 NTP 服务器地址
    Postgresql配置
  • 原文地址:https://www.cnblogs.com/wangxinwen/p/9851854.html
Copyright © 2020-2023  润新知