BilibiliVideoDownload v3.0.0 - 全新GUI界面

BilibiliVideoDownload PC端下载bilibili视频 安装 到releases页面或者百度网盘密码: rf8n,下载对应平台安装包即可.打开软件后需要设置SESSDATA才可以下载视频,SESSDATA是B站已登录用户的cookies里面的一个字段,而且如果你的账号是非大会员,你拿到的SESSDATA也只可以下载非大会员视频。如果你是大会员则可以下载大会员视频。为了支持正版,大家购买大会员。获取SESSDATA教程大家可以到软件相关设置处查看,或者直接点击这里 演示 功能 下载普通视频 下载番剧视频 下载电影(额外付费除外) 下载封面 下载进度 基本视频信息 删除下载记录 暂停/恢复下载 运行 git clone https://github.com/blogwy/BilibiliVideoDownload.git cd BilibiliVideoDownload yarn yarn electron:serve yarn electron:build 版本 v3.0.0 2021-02-21 全新GUI版本上线 v2.1.0 2019-09-12 添加了弹幕下载,以及弹幕反查用户 v2.0.2 2019-06-19 添加了大会员清晰度的支持(前提是必须要有一个大会员的SESSDATA) v2.0.1 2019-03-29 添加了分P检测,分P下载功能 v2.0.0 2019-03-24 Node.js重构,以前的在vuejs分支 注意 不要试图下载需要付费的视频,本软件不支持,可能会报错 SESSDATA有过期时间,好像是半年 本人没有试过下载电影等时长比较长的视频(大于一小时),不保证下载成功 由于下载的音视频是分离的,项目使用ffmpeg合成导致安装包过大(ffmpeg大约70+MB),以后会优化的

February 21, 2021 · 1 min · 47 words · Norman Wang

R2S软路由相关教程收集

文章封面图来自油管博主bigdongdong 我是在1月底购买的R2S,在油管博主bigdongdong的淘宝店,我的用途就是科学上网。下面我会写下我购买的链接(不是恰饭)和相关教程 购买 软路由(199元):https://item.taobao.com/item.htm?spm=a230r.1.14.68.283c14a8QV2e0N&id=626680130958&ns=1&abbucket=19#detail 5V3A TYPE-C电源(12元):https://detail.tmall.com/item.htm?id=603155018245&spm=a1z09.2.0.0.32b52e8dXvzXU5&_u=8lv6bbab53f 朗科32GB内存卡(24元):https://item.taobao.com/item.htm?spm=a1z09.2.0.0.32b52e8dXvzXU5&id=606825770915&_u=8lv6bba29df 注:电源一定要买固定5V3A,像一些手机充电器可能有5V3A这个功率档位,也请不要用,有烧毁机器危险;内存卡要买class10及以上,机器比较挑卡,反正我这个是可以用;如果建议的话,直接在bigdongdong店铺里面买满配版本 教程 东西都到了以后,就着手刷机吧。系统是openwrt,教程和镜像大佬早已准备好了,我就不班门弄斧了,https://bigdongdong.gitbook.io/nanopi-r2s/ 我遇到的坑 在刷镜像的时候,用买内存卡送的读卡器老是报错无法刷入系统,然后我换了一个读卡器成功刷入系统 openwrt系统被我搞坏了,然后我重新刷入系统,把内存卡插入R2S后机器不识别卡,无法使用,然后在bigdongdong的帮助下,先刷入R4S固件,然后重新刷入R2S固件,就好了。 我本人也是第一次使用R2S,希望这两个踩坑可以帮助你们。

February 8, 2021 · 1 min · 14 words · Norman Wang

我的2020年度Playstation游戏报告 - 来自游民星空

January 12, 2021 · 0 min · 0 words · Norman Wang

我的2020年度Steam游戏报告 - 来自游民星空

January 12, 2021 · 0 min · 0 words · Norman Wang

你好!2021

新年新气象,博客换了新主题!2021,希望能原价买个PS5

January 9, 2021 · 1 min · word · Norman Wang

bilibili视频下载逻辑

b站有三种视频格式,且现在下载的视频都是影视频分离的形式,且都是m4s格式,需要同时把video和audio下载下来,用ffmpeg合成一下即可,所有的请求头都需要添加User-Agent https://www.bilibili.com/video/BV1QT4y1w7HS https://www.bilibili.com/bangumi/play/ep326599 https://www.bilibili.com/bangumi/play/ss34319 # 音视频合成 ffmpeg -i ./video.m4s -i ./audio.m4s -codec copy ./video.mp4 第一种BV 对于BV格式视频,视频的下载地址就在网页源代码中,直接请求url地址即可,请求头中带上已登录账号的cookie发送请求就可以拿到视频下载地址,如果你的账号是大会员,拿到的视频下载地址中就会有大会员专享视频。拿到下载地址后,发送一个请求头中带referer的请求(值为url)就可以下载了。下面我以node.js为例子 const got = require('got'); const stream = require('stream'); const {promisify} = require('util'); const pipeline = promisify(stream.pipeline); const fs = require('fs'); // 获取下载地址 (async () => { try { const response = await got('https://www.bilibili.com/video/BV1k54y1C7R6',{ headers: { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', 'cookie': '_uuid=D87F5597-9F58-9410-7C9A-EC6EE452205A44601infoc; buvid3=69498676-73DD-451C-A606-02CA33B5AEE553917infoc; CURRENT_FNVAL=16; LIVE_BUVID=AUTO2115924816109117; Hm_lvt_8a6e55dbd2870f0f5bc9194cddf32a02=1596722341; CURRENT_QUALITY=116; blackside_state=1; finger=481832271; sid=ax362991; DedeUserID=14899614; DedeUserID__ckMd5=6fb380360cc351f0; SESSDATA=122d1191%2C1614940578%2C4f586*91' } }); console.log('success') // bv系列 let str = response.body.match(/\<script\>window\.\_\_playinfo\_\_\=([\s\S]*?)\<\/script\>\<script\>window\.\_\_INITIAL\_STATE\_\_\=/)[1]; console.log(str) } catch (error) { console.log('error') console.log(error); } })() // 下载视频 const options = { headers: { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:56.0) Gecko/20100101 Firefox/56.0', 'referer': 'https://www.bilibili.com/video/BV1k54y1C7R6' } }; const url = 'https://upos-sz-mirrorkodo.bilivideo.com/upgcxcode/43/27/229752743/229752743-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1600025170&gen=playurl&os=kodobv&oi=975672835&trid=a9b798c7f52640c68c3850b379ab524bp&platform=pc&upsig=65c15861b8e6dc6f46012dc21bf034c5&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=14899614&orderid=0,3&agrr=0&logo=80000000'; (async () => { await pipeline( got.stream(url, options) .on('downloadProgress', progress => { console.log(progress) }) .on('error', error => { console.log(error) }), fs.createWriteStream('./video/audio2.m4s') ); })(); 第二种EP ep系列视频,下载视频和bv类似,都是在网页源代码中找到视频下载地址,不同到是,ep视频下载地址获取规则和bv有一点区别而且ep系列还需要在源代码中找到当前视频到BV号,BV号在下载视频时需要作为请求头到referer ...

September 6, 2020 · 2 min · 282 words · Norman Wang

Awtrix2.0 WIFI像素时钟搭建全过程(极简方案)

最近在B站、youtube看了许多像素时钟的视频,它们都源于wtrix2.0这个开源项目。于是,我也萌生了DIY一个属于自己的像素时钟的想法了。 购买硬件 在购买之前,我做了大量准备。包括看官方文档和其他大佬的搭建视频。awtrix2.0分为标准版和pro版本,还可以装各种传感器实现特定的功能。但是由于自身硬件技术几乎为零,电烙铁技术垃圾。我采用了一个最简单的方案。甚至都用不到电烙铁这些东西。请看下图: 需要购买硬件有: wemos D1 MINI开发板(已焊接) ¥14 若干杜邦线(公对母和公对公最好都买) ¥5 8*32点阵屏 ¥60 椴木外壳套件 ¥80 小型充电宝 ¥25 外壳是看的B站UP主创客尹白猿MakerApe的解决方案,购买链接仅供参考不是广告 软件搭建 环境搭建 **awtrix服务端是需要 JAVA8环境,请提前配置好环境 ** macOS:https://blog.csdn.net/weixin_42191789/article/details/99070311 Ubuntu18.04:https://blog.csdn.net/zbj18314469395/article/details/86064849 Windows10:https://jingyan.baidu.com/article/6b97984dd257b41ca2b0bf86.html 点击下载最新版jar包: AWTRIX Java Application,服务会启动到7000端口,请务必保证端口畅通 macOS/Linux sudo java -jar awtrix.jar Windows java -jar awtrix.jar Linux Installer 适用于Linux一键命令 wget -N https://blueforcer.de/awtrix/awtrix.sh ; sudo sh awtrix.sh sudo service awtrix start sudo service awtrix stop sudo service awtrix restart Docker Docker hub 硬件安装 刷入固件 这里是windows下教程 点击下载刷机软件和固件 用数据线将开发板连接到电脑 打开刷机软件,软件自动识别com口 切换到config页面,点击齿轮图标选择固件 返回operation页面,点击flash,待进度条走完即可 设置WIFI 开发板通过usb方式接入电源,并按照上图连接好点阵屏。 打开手机热点,选择AWTRIX Controller 点击configure进入配置页面 填入当前WIFI名称和密码和awtrix服务端ip地址(matrix port维持默认7001,matrixtype2不要勾选) 点击save,过10秒钟屏幕会出现wifi成功host成功,自动进去时钟模式,到此固件配置已完成 安装硬件 参考创客尹白猿MakerApe大佬视频 ...

August 16, 2020 · 1 min · 90 words · Norman Wang

vue中web-shell简单实现

原理 客户端使用xterm.js展示命令行,服务端使用ssh2.js连接服务器,服务端与客户端通过sock进行通信 版本 xterm.js@3.12.0 ssh2.js@0.8.9 socket.io@2.3.0 相关代码 https://github.com/blogwy/vue-web-shell 客户端 // 初始化Terminal const term = new Terminal({ cursorBlink: true }) term.open(document.getElementById('terminal')) term.fit() // 启动socket服务 const socket = openSocket('http://192.168.1.105:3100/ssh') socket.on('connect', () => { console.log('---连接成功---') console.log(`---socket.id:${socket.id}---`) socket.emit('init_data', { ip: '000.0.000.00', username: 'root', password: '00000' }) }) // 监听Terminal输入,把输入命令通过socket发送到服务端 term.on('data', res => { socket.emit('ssh_client_data', res) }) // 监听服务端返回的命令运行结果,显示到Terminal中 socket.on('ssh_server_data', res => { term.write(res) }) 服务端 const app = require('express')(); const http = require('http').createServer(app); const io = require('socket.io')(http); const sshNamespace = io.of('/ssh') const SSHClient = require('ssh2').Client; const ssh = new SSHClient(); const utf8 = require('utf8'); sshNamespace.on('connection', socket => { console.log('socket.id:', socket.id) socket.on('init_data', res => { console.log(res) // 拿到ip数据,初始化连接 initSSH(socket, res) }) }) http.listen(3100, () => { console.log('listening on http://localhost:3100'); }); function initSSH (socket, config) { console.log(config) ssh.on('ready', () => { ssh.shell((err, stream) => { if (err) { socket.emit('shell_error', '\r\n*** SSH SHELL ERROR: ' + err.message + ' ***\r\n'); } // 监听客户端发送的命令 socket.on('ssh_client_data', data => { stream.write(data); }); // 监听返回结果并emit到客户端 stream.on('data', d => { socket.emit('ssh_server_data', utf8.decode(d.toString('binary'))); }).on('close', () => { console.log('close'); ssh.end(); }); }); }).on('close', () => { socket.emit('connect_closed', '\r\n*** SSH CONNECTION CLOSED ***\r\n'); }).on('error', err => { console.log(err); socket.emit('connect_error', '\r\n*** SSH CONNECTION ERROR: ' + err.message + ' ***\r\n'); }).connect({ host: config.ip, port: 22, username: config.username, password: config.password }); }

July 15, 2020 · 1 min · 205 words · Norman Wang

Electron-Vue 环境搭建 + 基本入门 + 软件打包 + 软件更新

electron是一个使用JS,CSS,HTML构建跨平台的桌面应用程序的框架,微软的VScode就是使用该技术开发 环境搭建 安装node环境 由于使用的是electron-vue脚手架工具,首先要安装vuecli npm install -g @vue/cli # OR yarn global add @vue/cli 起步 vue init阶段会出现一些项目基本选项,按照自己需求选择就好,打包工具选择elelctron-builder之后会用到它打包和更新 vue init simulatedgreg/electron-vue my-project cd my-project npm install # OR yarn npm run dev # OR yarn dev 出现以下界面及成功 注意事项 npm install时候可能会由于网络原因导致包安装失败,使用cnpm或者nrm切换软件源 npm install时候可能会遇到electron下载失败情况,有两种解决方法 在项目根目录下新建.npmrc或者.yarnrc文件,里面写入 electron_mirror=http://npm.taobao.org/mirrors/electron/ 在淘宝镜像下载对应系统和版本的electron包到electron缓存目录 mac/win/liunx: 当前用户名/.electron/ windows用户在npm install时候会遇到node-gyp错误,这是由于你的系统没有安装正确到构建工具,可以使用windows-build-tools一键安装所有到所需工具包 npm install --global windows-build-tools # OR yarn global add windows-build-tools npm run dev时候可能会遇到process is not defined错误,这是由于node10.X版本导致的,有两种解决方法 升级node版本到12.X 打开项目/src/index.ejs,修改!process.browser为!require('process').browser 基础入门 插件使用 插件使用和vue一样,npm/yarn直接装包就可以,脚手架自带electron-vuex可以实现主进程与渲染线程共享数据,推荐使用 ...

July 7, 2020 · 4 min · 673 words · Norman Wang

electron中使用ffmpeg

依赖库 fluent-ffmpeg ffmpeg的node版驱动软件,提供丰富的API调用ffmpeg,可以指定ffmpeg路径 @ffprobe-installer 根据当前系统下载对应版本的ffmprobe @ffmpeg-installer 根据当前系统下载对应版本的ffmpeg demo import { app } from 'electron' const ffmpegPath = require('@ffmpeg-installer/ffmpeg') const ffprobePath = require('@ffprobe-installer/ffprobe') const ffmpeg = require('fluent-ffmpeg') // asar打包后路径有所变化 if (process.env.NODE_ENV !== 'development') { ffmpeg.setFfmpegPath(ffmpegPath.path.replace('app.asar', 'app.asar.unpacked')) ffmpeg.setFfprobePath(ffprobePath.path.replace('app.asar', 'app.asar.unpacked')) } else { ffmpeg.setFfmpegPath(ffmpegPath.path) ffmpeg.setFfprobePath(ffprobePath.path) } // rtsp/rtmp直播地址转m3u8例子 export default class VideoServer { constructor (video) { this.liveUrl = video.liveUrl; this.m3u8Path = video.m3u8Path; this.ffmpegCommand; } killFfmpegCommand () { if (this.ffmpegCommand) { this.ffmpegCommand.kill() } } startTransCode (fun) { this.ffmpegCommand = ffmpeg(this.liveUrl) .outputOptions([ '-fflags flush_packets', '-max_delay 1', '-an', '-flags', '-global_header', '-hls_time 1', '-hls_list_size 3', '-hls_wrap 3', '-vcodec copy' ]) .on('start', function(e) { console.log('---开始转码---') console.log(e); fun('info', e) }) .on('end', function() { console.log('file has been converted succesfully'); }) .on('error', function(err) { console.log('an error happened: ' + err.message); fun('error') }) .save(this.m3u8Path) } }

May 15, 2020 · 1 min · 124 words · Norman Wang