首页
关于我
友情链接
Search
1
windows server 2008 r2 sp1 无法安装网卡驱动教程
137 阅读
2
安装UEditor for Typecho丰富Typecho编辑器功能
109 阅读
3
一键脚本合集
93 阅读
4
新版lede软路由docker内核导致局域网无法访问ddns域名解析解决方案
57 阅读
5
模仿UP主,用Python实现一个弹幕控制的直播间!- 分享
54 阅读
工作总结
生活分享
硬件系统
网络技术
软件系统
登录
Search
标签搜索
adobe Premiere Pro
小白龙
累计撰写
19
篇文章
累计收到
0
条评论
首页
栏目
工作总结
生活分享
硬件系统
网络技术
软件系统
页面
关于我
友情链接
搜索到
19
篇与
的结果
2022-01-22
帝国CMS操作后记--1
使用帝国CMS管理后台整体使用感受分享1、后台前端界面比较老,但是包含的功能是很全面,界面一目了然。遇到
2022年01月22日
52 阅读
0 评论
0 点赞
2021-12-07
模仿UP主,用Python实现一个弹幕控制的直播间!- 分享
灵感来源之前在B站看到一个有意思的视频:【B站】【亦】终极云游戏!五千人同开一辆车,复现经典群体智慧实验大家可以看看,很有意思。up主通过代码实现了实时读取直播间里的弹幕内容,进而控制自己的电脑,把弹幕翻译成指令操控《赛博朋克2077》游戏。观众也越来越多,最后甚至还把直接间搞崩了(当然,其实是因为那天B站全站崩了)。我十分好奇到底是怎么做到的。外行看热闹,内行看门道,作为半个内行,我们就模仿UP主的想法,自己做一个。所以今天我的目标就是复刻一个 通过弹幕控制直播间 的代码,并且最终在自己的直播间开播。先给大家看看最终我的成品小视频:【B站】模仿UP主,做一个弹幕控制的直播间!看起来是不是很像样了。初版设计思路首先在脑海里规划一个大致的思路,如下图:img这个思路看起来很简单,不过还是得解释一下,首先我们要搞清楚,弹幕的内容是怎么抓到的。大部分我们常见的直播平台,在浏览器端,弹幕都是通过WebSocket来推送给观众的。在手机平板等客户端(非Web端),可能会有一些更加复杂的TCP进行弹幕的推送。关于TCP的消息投递,有个很好的文章,就是美团的这个:美团终端消息投递服务Pike的演进之路归根结底,这些弹幕都是通过在客户端和服务端建立长链接来实现的。所以,我们需要做的就是用代码作为客户端,与直播平台进行长链接。这样就能拿到弹幕。我们只是需要实现整个弹幕控制的流程,所以弹幕的抓取也不是本文的重点,我们来淘一个现成的轮子!在Github上一顿找,找到了一个非常不错的开源库,里面能够获取很多直播平台的弹幕:https://github.com/wbt5/real-url获取斗鱼&虎牙&哔哩哔哩&抖音&快手等 58 个直播平台的真实流媒体地址(直播源)和弹幕,直播源可在 PotPlayer、flv.js 等播放器中播放。我们把代码clone下来,运行main函数,随便输入一个Bilibili直播间地址,就能拿到直播间实时的弹幕流:image-20211122225149043代码里把获取到的一条条弹幕(包括用户名)直接打印在了控制台。他是如何做到的呢?核心的Python代码如下(不熟悉Python?不要紧,就当做伪代码,很容易看懂):wss_url = 'wss://broadcastlv.chat.bilibili.com/sub'heartbeat = b'\x00\x00\x00\x1f\x00\x10\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x5b\x6f\x62\x6a\x65\x63\x74\x20' \ b'\x4f\x62\x6a\x65\x63\x74\x5d 'heartbeatInterval = 60@staticmethodasync def get_ws_info(url):url = 'https://api.live.bilibili.com/room/v1/Room/room_init?id=' + url.split('/')[-1] reg_datas = [] async with aiohttp.ClientSession() as session: async with session.get(url) as resp: room_json = json.loads(await resp.text()) room_id = room_json['data']['room_id'] data = json.dumps({ 'roomid': room_id, 'uid': int(1e14 + 2e14 * random.random()), 'protover': 1 }, separators=(',', ':')).encode('ascii') data = (pack('>i', len(data) + 16) + b'\x00\x10\x00\x01' + pack('>i', 7) + pack('>i', 1) + data) reg_datas.append(data) return Bilibili.wss_url, reg_datas它连上了Bilibili的直播弹幕WSS地址,也就是WebSocket地址,然后伪装成客户端,接受弹幕推送。OK,做完了第一步,下一步就是用消息队列将弹幕发送出来。开启单独的消费者接收弹幕。为了实现上尽量简单,就不上那些专业的消息队列了,这里用了redis的list作为队列,将弹幕内容放进去。发送者核心代码如下:链接Redisdef init_redis():r = redis.Redis(host='localhost', port=6379, decode_responses=True) return r 消息发送者async def printer(q, redis):while True: m = await q.get() if m['msg_type'] == 'danmaku': print(f'{m["name"]}:{m["content"]}') list_str = list(m["content"]) print("弹幕拆分:", list_str) for char in list_str: if char.lower() in key_list: print('推送队列:', char.lower()) redis.rpush(list_name, char.lower())完成了弹幕内容的发送后,需要写一个消费者,消费这些弹幕,把里面的指令都提取出来。并且,在消费者收到弹幕后,如何消费呢?我们需要一个能够用代码指令控制电脑的办法。咱继续本着不造轮子的原则,找到了一个Python的自动化控制库PyAutoGUIPyAutoGUI is a cross-platform GUI automation Python module for human beings. Used to programmatically control the mouse & keyboard.安装上这个库,在代码中引入,便可以通过他的API控制电脑鼠标和键盘执行对应的操作。简直是完美啊!消费者(控制电脑)核心Python代码如下:链接Redisdef init_redis():r = redis.Redis(host='localhost', port=6379, decode_responses=True) return r 消费者def control(key_name):print("key_name =", key_name) if key_name == None: print("本次无指令发出") return key_name = key_name.lower() # 控制电脑指令 if key_name in key_list: print("发出指令", key_name) pyautogui.keyDown(key_name) time.sleep(press_sec) pyautogui.keyUp(key_name) print("结束指令", key_name) if name == '__main__':r = init_redis() print("开始监听弹幕消息, loop_sec =", loop_sec) while True: key_name = r.lpop(list_name) control(key_name) time.sleep(loop_sec)ok,大功告成,我们打开弹幕发送队列和消费者,这个不断循环消费的队列就开始运行了。一旦弹幕中有wsad这种控制游戏常用的按键,电脑就会自己给自己发出指令。image-20211123000340404初版运行中的问题我兴冲冲的打开自己的B站直播间,开始调试,结果发现我还是太天真了。这个初版代码暴露了非常多的问题。我们一个个来说下是什么问题,我是如何解决的。指令不人性化水友们其实很喜欢发送类似www dddd这类重复单词(叠词),但初版的实现只支持单个字幕,水友们发现不得劲,没有作用后,就从直播间走了。这点很容易解决,把弹幕内容拆分成每个单词,然后再推送给队列。解决方法:拆解弹幕,把DDD,拆成D,D,D,发送个消费者。危险指令首先是玩家的指令超出了应该有的范围。在我把赛博朋克游戏打开,让弹幕观众控制游戏里的开车时,有个神秘观众进了直播间,默默发了个“F”,然后。。。然后游戏里的V(主角名)就从车里下来了,淦,我是让你们开车的,不是让你们下来和警察斗殴的。。。解决方法:添加弹幕过滤器。将弹幕进行拆分,只发送指定的指令给消费者key_list = ('w', 's', 'a', 'd', 'j', 'k', 'u', 'i', 'z', 'x', 'f', 'enter', 'shift', 'backspace')list_str = list(m["content"]) print("弹幕拆分:", list_str) for char in list_str: if char.lower() in key_list: print('推送队列:', char.lower()) redis.rpush(list_name, char.lower())上面两个问题解决后,发送者就像下面这样运行了:image-20211123000321183弹幕指令堆积这是个很大的问题,如果处理所有水友发送的全部弹幕指令,一定会存在消费不过来的问题。解决方法:需要固定时间处理弹幕,其他抛弃。if name == '__main__':r = init_redis() print("开始监听弹幕消息, loop_sec =", loop_sec) while True: key_name = r.lpop(list_name) # 每次只取出一个指令,然后把list清空,也就是这个时间窗口内其他弹幕都扔掉! r.delete(list_name) control(key_name) time.sleep(loop_sec)弹幕从发出到观众看到结果有延迟在最开始的视频里,你们也能感受到了,从观众的指令发出,到最终被观众看到,大概要经历5秒的延迟。其中,起码有3秒,都是网络直播流的延迟,这一点,很难去优化。回炉重造后的版本经过一系列调优和涉及,我们的版本也算是从V0.1到了V0.2了。猛虎落泪。下面是重构后的结构图:img后记在写完这个项目后,我在直播间试了很多次,体验已经无限接近UP主当时的视频了。我开播挂在那边好久,但是,人气最高的时候,也只有20几个人,寥寥十几条弹幕,还有很多是我发的。我还期望着观众能够拉更多人进来一起玩呢,事与愿违啊。
2021年12月07日
54 阅读
0 评论
0 点赞
2021-12-07
安装UEditor for Typecho丰富Typecho编辑器功能
如果我们自建个人网站并不需要特别复杂的功能的时候,并不一定非要选择WordPress。并且WordPress真要完好确实需要一定的技术能力,尤其是后续的功能和优化需要琢磨才能使用的更好。一般普通个人网站完全可以使用Typecho,算是比较好的轻量博客程序,当然我们也看到很多个人使用Typecho做的网站也都很好。大部分网友唯独不是特别满意Typecho的就是编辑器采用的是Markdown编辑器。毕竟官方考虑到是整个程序的体积和轻便,不过对于很多人来说不是特别喜欢这个编辑器。我们可以安装其他编辑器来丰富编辑功能,其中可以安装的是UEditor for Typecho。UEditor由百度提供的,然后有其他网友进行整合兼容到Typecho,我们一起安装看看吧。文章目录 第一、UEditor for Typecho下载和安装第二、UEditor for Typecho激活使用第三、UEditor for Typecho附加功能第一、UEditor for Typecho下载和安装下载地址:https://github.com/chanshengzhi/UEditor-for-Typecho最新更新是2017年底,应该是较为完善的。至少我安装后没有出现较大的问题。我们下载之后解压,然后将UEditor文件夹丢到当前Typecho主题下的usr/plugins文件夹下。第二、UEditor for Typecho激活使用1、暂停当前编辑器UEditor for Typecho激活使用我们需要在控制台-个人设置中关闭当前的编辑器。2、激活编辑器控制台-插件,找到当前安装的UEditor for Typecho插件进行激活。这个时候我们再去编辑文章看看是什么编辑器?是不是比较丰富?第三、UEditor for Typecho附加功能如果我们需要将编辑器出现的静态文件,比如图片附件不在本地保存。可以配置到腾讯云COS或者又拍云。总结,如果我们需要在Typecho较为丰富的编辑器是可以安装UEditor for Typecho插件的。
2021年12月07日
109 阅读
0 评论
0 点赞
2021-12-07
帝国网站管理系统安装手册
《帝国网站管理系统》安装说明 一. 运行环境需求: PHP+MYSQL 二. 安装步骤: 第 1 步:上传将安装包的 ./upload 目录中的全部文件和目录结构上传到服务器的网站根目录(注意是上传 upload 目录中的文件和目录,而不是上传 upload 目录本身)。其他说明:如果安装不内置测试数据 ./upload/testdata 目录不需要上传。 第 2 步:设置目录属性如果您的服务器使用 Windows 操作系统,可跳过这一步。您在正式安装以前,需要设置相关的目录属性,以便数据文件可以被 EmpireCMS 正确的读写。使用 FTP 软件登录您的服务器,将服务器上以下的目录属性设置为 777。除红色目录外,所有目录权限均要应用于子目录与文件。目录文件名称说明/系统根目录(不要应用于子目录)/d附件目录/s专题存放目录/t 标题分类存放目录/ecachefiles 动态页面缓存目录/search搜索表单/index.html网站首页/html默认可选的HTML存放目录/e/admin/ebak/bdata 备份数据存放目录/e/admin/ebak/zip 备份数据压缩存放目录/e/config/config.php数据库配置文件/e/data部分配置文件存放目录/e/install 安装目录/e/member/iframe/index.php 登陆状态显示/e/member/login/loginjs.php JS登陆状态显示/e/pl/more/index.php 评论JS调用文件/e/sch/index.php 全站搜索文件/e/template 动态页面的模板目录/e/tool/feedback/temp 信息反馈/e/tool/gbook/index.php 留言板设置目录权限可以使用以下方法:你可以使用ftp软件将以上目录及其子目录、文件属性设置为777。linux平台下你有shell权限则通过执行chmod来修改目录权限。windows平台下,一般默认就可读写,不用设置。如果没读写权限需要给目录分配IIS帐号读写权限。 第 3 步:执行安装脚本请在浏览器中运行 /e/install/index.php,即访问 http://你的网址/e/install/index.php安装脚本会检查您的服务器系统环境、数据库环境,并具备一定的纠错功能。如果您在之前某一步骤操作有问题,通常安装脚本会发现并作以提示,请您根据提示再对安装过程进行检查。如果没有提示出问题,请您按照其中的说明,完成最后的安装。填写参数时注意以下几点:若不清楚mysql服务器地址,用户名,密码,数据库名可向虚拟空间提供商咨询。填写管理员信息时设置一个安全且不易忘记的密码。 第 4 步:删除安装程序目录安装成功后,请通过 FTP 删除安装程序目录(/e/install),以避免被再次安装。 第 5 步:初始化设置安装完成后,在浏览器中访问 http://你的网址/e/admin/ 页面,输入正确的用户名和密码就可登陆后台管理。登陆后台后,到“系统设置”-》“参数设置”那设置好站点名称、网站关键字和网站简介。 三. 初始化内置数据: (选择内置初始数据时需要的操作)依次按下面顺序操作即可:后台 > 系统 > 数据更新 > 数据更新中心 > 1、恢复栏目目录 2、刷新所有信息栏目页 3、刷新所有信息内容页面(选择全部刷新,刷新后所有表均提示“*** 生成完毕”即可) 4、刷新所有JS调用 四. 至此,帝国网站管理系统全部安装完毕。
2021年12月07日
8 阅读
0 评论
0 点赞
1
...
3
4