这个项目是我从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. 关于umi-request GET请求参数携带数组

    在使用umi-request时候发现GET传递数组,后台在接收时只能接受到最后一个,对此记录一下. 问题: // 发送数据: request(url, { params: { select: [1,2 ...

  2. linux设置系统变量

    [root@localhost test]# export AUTHOR=brady [root@localhost test]# echo $AUTHOR brady [root@localhost ...

  3. selenium-绕过登录

    第一种方式:chrome-debug 1.现在终端输入一下命令,启动Chrome-debug模式 #windows a.首先将chrome的环境添加到PATH中 b.进入cmd 命令栏,输入:chro ...

  4. 解释器( interpreter ) 与 编译器( compiler ) 的对比

    什么是解释器与编译器 1.解释器 解释器是一种计算机程序,它将每个高级程序语句转换成机器代码. 2.编译器 把高级语言编写的程序转换成机器码,将人可读的代码转换成计算机可读的代码(0和1). 3.机器 ...

  5. css中伪元素before或after中content的特殊用法attr【转】

    [原文]https://segmentfault.com/a/1190000002750033 CSS中主要的伪元素有四个:before/after/first-letter/first-line,在 ...

  6. Spring 缓存抽象

    Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术:并支 ...

  7. 源码安装中./configure的使用

    在linux中安装源码,在源码目录下使用 ./configure --prefix=xxx  --with=xxx 其中configure是一个可执行脚本, --prefix 选项就是配置安装的路径, ...

  8. 简单又强大的pandas爬虫 利用pandas库的read_html()方法爬取网页表格型数据

    文章目录 一.简介 二.原理 三.爬取实战 实例1 实例2 一.简介 一般的爬虫套路无非是发送请求.获取响应.解析网页.提取数据.保存数据等步骤.构造请求主要用到requests库,定位提取数据用的比 ...

  9. docker-compose启动consul集群

    version: '2.0' services: consul-server1: image: consul:latest hostname: "consul-server1" p ...

  10. VB 错误日志:MSForms.CommandButton 不是一个已加载的控件类等解决方法

    是由于缺少了fm20.dll这个必要组件 网上找到 然后在工程中引用 找到路径 完美解决