这个项目是我从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

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

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

Python项目2:弹幕复读机的更多相关文章

  1. B站真的是一个神奇的地方,初次用Python爬取弹幕。

    "网上冲浪""886""GG""沙发"--如果你用过这些,那你可能是7080后: "杯具"" ...

  2. python项目

    python实战项目: http://www.the5fire.com/category/python实战/ python基础教程中的十个项目: python项目练习一:即时标记 python项目练习 ...

  3. Jenkins构建Python项目提示:'python' 不是内部或外部命令,也不是可运行的程序

    问题描述: jenkin集成python项目,立即构建后,发现未执行成功,查看Console Output 提示:'Python' 不是内部或外部命令,也不是可运行的程序,如下图: 1.在 Windo ...

  4. Docker如何部署Python项目

    Docker 部署Python项目 作者:白宁超 2019年5月24日09:09:00 导读: 软件开发最大的麻烦事之一就是环境配置,操作系统设置,各种库和组件的安装.只有它们都正确,软件才能运行.如 ...

  5. 笔记14:Docker 部署Python项目

    Docker 部署Python项目 导读: 软件开发最大的麻烦事之一就是环境配置,操作系统设置,各种库和组件的安装.只有它们都正确,软件才能运行.如果从一种操作系统里面运行另一种操作系统,通常我们采取 ...

  6. GitHub Python项目推荐|瓦力Devops开源项目代码部署平台持续部署

    GitHub Python项目推荐|walle - 瓦力 Devops开源项目代码部署平台 项目热度 标星(star):8418 (很不错的实用项目,大神作品,建议关注) 标星趋势 关注(watch) ...

  7. 给缺少Python项目实战经验的人

    我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...

  8. 正确地组织python项目的结构

    统一的项目结构 写了不少python项目后, 越来越认识到python项目结构重要性. 不管项目是否要开源, 是否要提交pypi, 项目结构的一致性带来的好处还有很多: 多人合作开发大家都有个基本的g ...

  9. eclipse中建python项目并运行

    1. Help → Install New Software 2.Enter http://pydev.org/updates 3.点击Click "Next" and " ...

随机推荐

  1. 【二分图】HEOI2012 朋友圈

    题目内容 洛谷链接 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着. 一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最大 ...

  2. lumen-ioc容器测试 (5)

    lumen-ioc容器测试 (1) lumen-ioc容器测试 (2) lumen-ioc容器测试 (3) lumen-ioc容器测试 (4) lumen-ioc容器测试 (5) lumen-ioc容 ...

  3. canal 整合RabbitMQ

    环境如下: canal: 1.15-alpha-1 mysql  5.6.49 rabbitmq 3.7.14 Erlang 21.3 canal 安装和启动 见上篇文章 canal快速安装启动 但是 ...

  4. MySQL的事务与锁 转

    资料来源: 青山老师的mysql课程 丁奇老师的<MySQL45讲> 一.文章结构和思路 1.整体文章结构 2.大概思路 介绍数据库的特性: 数据库标准所制定的隔离级别和解决对应的一致性问 ...

  5. python 安装matplotlib

    下载minianaconda 安装 进入cmd下 conda create --name python37 python=3.7  创建python3.7环境 conda activate pytho ...

  6. 第一章 Linux操作系统及其历史介绍

    一.什么是操作系统 1.基本含义: 简称OS 是计算机系统中必不可少的基础系统软件,是应用程序运行和用户操作必备的基础环境 操作系统就是一个人与计算机之间的中介 2.组成方式: 操作系统的组成: 计算 ...

  7. Linux文件系统和管理-2文件操作命令(中)

    创建空文件和刷新时间 touch touch命令可以用来创建空文件或刷新文件的时间 touch 存在的文件刷新时间,不存在的文件创建空文件 生成指定日期的日志文件 [root@C8-1 ~]# dat ...

  8. RPM与YUM使用

    1.RPM 1.1RPM简介 RPM全名RedHat Package Manager 优点: 1. 由于已经编译完成并且打包完毕,所以软件传输与安装上很方便 (不需要再重新编译): 2. 由于软件的信 ...

  9. HBase进阶

    date: 2020-10-26 15:43:00 updated: 2020-10-26 18:45:00 HBase进阶 1. 架构 master负责管理多个region server,一个reg ...

  10. day1-linux基础命令

    1.创建文件 ①touch 1.txt ②echo > 2.txt ③vim 3.txt 以上方式都能直接创建文件 批量创建文件 2.创建目录 ①mkdir  /software ②创建连续目录 ...