前言

B站视频容易失效,我收藏的视频一般都是我很喜欢的,以后想看的时候没了那多可惜。于是我马上有了个想法:我收藏完视频后我的VPS自动把视频下好,然后上传至OneDrive

前期准备

  • VPS
  • you-get
  • 脚本

4K下载

you-get支持4K下载

当然,4K并不能白嫖,还是需要你有B站的大会员,在下载时使用你大会员cookies来进行下载。

获取cookies需要用到一个Chrome插件:EditThisCookie

安装完EditThisCookie插件后,在设置中将 cookies 格式改为如图所示

然后打开B站主页,登录账号,导出即可

导出后 cookies 自行创建 txt 文件粘贴即可,下载命令

you-get -c cookies.txt URL

xml 转换为 ass字幕

you-get 在下载时会自动下载一个xml文件,其实就是弹幕文件,需要把它转换为ass才能正常播放。这里我用的是 danmu2ass

需要安装python3,下载到vps给予运行权限,用法:

python3 danmaku2ass.py abc.xml

脚本

这次一共有两个脚本,一个是检查收藏列表更新,还有一个是检查you-get进程,建议放在一个文件夹下面,方便管理;

检查收藏列表更新

#!/bin/sh
you=/usr/local/bin/you-get
#RSS地址自行修改
content=$(wget https://rsshub.app/bilibili/fav/10385631/928435831/0 -q -O -)
#获得时间戳
subpubdate=${content#*<pubDate>}
pubdate=${subpubdate%%</pubDate>*}
#获得封面图下载链接
subcontent=${content#*<img src=\"}
photolink=${subcontent%%\"*}
#如果时间戳记录文本不存在则创建(此处文件地址自行修改)
if [ ! -f "/root/bili/date.txt" ];then
        echo 313340 > /root/bili/date.txt
    fi
#获得上一个视频的时间戳(文件地址自行修改)
olddate=$(cat /root/bili/date.txt)
#获得视频下载链接
sublink=${subpubdate#*<link>}
link=${sublink%%</link>*}
av=${link#*video/}
#获得视频标题并记录(文件地址自行修改)
content1=$(wget https://rsshub.app/bilibili/video/reply/$av -q -O -)
subname=${content1#*\[CDATA\[}
name=${subname%% 的 评*}
echo $name > /root/bili/title.txt
    
#此处为视频存储位置,自行修改
filename="/var/www/webdav/Bilibili/"$name""
#判断当前时间戳和上次记录是否相同,不同则代表收藏列表更新
if [ $pubdate != $olddate ];
    then
#判断文件是否存在(防止删除收藏导致的重复下载)
    if [ -d $filename ];then
       echo $pubdate > /root/bili/date.txt
    else
        #下载封面图(图片存储位置应和视频一致)
        nohup wget -P /var/www/webdav/Bilibili/"$name" $photolink &
        #记录时间戳
        echo $pubdate > /root/bili/date.txt
        #获取视频清晰度以及大小信息
        stat=$($you -i -c /root/cookies.txt $link)
        substat=${stat#*quality:}
        data=${substat%%#*}
        quality=${data%%size*}
        size=${data#*size:}
        #发送开始下载邮件(自行修改邮件地址)
        echo "$name<br>Quality: $quality<br>Size: $size" | mail -s "$(echo -e "=?UTF-8?B?$(echo -n '开始下载' | base64)?=\nContent-Type:text/html;charset=UTF-8")" 1379771811@qq.com
        #下载视频到指定位置(视频存储位置自行修改;you-get下载B站经常会出错,所以添加了出错重试代码)
        while true
        do
        $you -k -l -c /root/cookies.txt -o /var/www/webdav/Bilibili/"$name" $link
            if [ $? -eq 0 ]; then
                break;
            else
            sleep 2
              fi
           done
     fi
fi

检查you-get进程

#!/bin/sh
#每两秒检测
step=2
for (( i = 0; i < 60; i=(i+step) )); do
#记录进程输出(文件位置自行修改)
ps -f -C you-get > /root/bili/check.txt
#获取视频标题(从上一个脚本存储位置获取,注意)
title=$(cat /root/bili/title.txt)
#根据条件判断进程状态(第二个判断条件是存储视频文件夹的文件名,自行修改)
content=$(cat /root/bili/check.txt)
result=$(echo $content | grep "you-get" | grep "Bilibili")
if [ "$result" != "" ];then
   #自动下载中,标记(文件位置自行修改)
   echo y > /root/bili/check1.txt
else
   #下载完成
   check1=$(cat /root/bili/check1.txt)
   if [ "$check1" = "y" ];then
        #检查文件是否下载完成
        mp4check=$(find /var/www/webdav/Bilibili/"$title" -name "*.download")
        if [ "$mp4check" = "" ];then
        #获取封面图文件名
        content1=$(wget https://rsshub.app/bilibili/fav/10385631/928435831/0 -q -O -)
        subcontent=${content1#*<img src=\"}
        photolink=${subcontent%%\"*}
        pname=${photolink#*archive/}
        #重命名封面图(封面图位置和上一个脚本位置一致)
        result1=$(echo $pname | grep "jpg")
        if [ "$result1" != "" ];then
               mv /var/www/webdav/Bilibili/"$title"/$pname /var/www/webdav/Bilibili/"$title"/poster.jpg
             else
               mv /var/www/webdav/Bilibili/"$title"/$pname /var/www/webdav/Bilibili/"$title"/poster.png
          fi
          #xml转ass(同样是上一个脚本的存储位置)
          filename=$(find /var/www/webdav/Bilibili/"$title" -name "*.xml")
          /usr/bin/python3 /root/bili/danmaku2ass.py /var/www/webdav/Bilibili/"$title"/"$fullfilen"
          echo n > /root/bili/check1.txt
          #获取下载完的视频文件大小
          videoname=$(find /var/www/webdav/Bilibili/"$title" -name "*.mp4")
          videostat=$(du -h "$videoname")
          videosize=${videostat%%\/*}
          #发送下载完成邮件(自行修改邮件地址)
          echo "$title<br>Size: $videosize" | mail -s "$(echo -e "=?UTF-8?B?$(echo -n '下载完成' | base64)?=\nContent-Type:text/html;charset=UTF-8")" 1379771811@qq.com
          #上传至onedrive(自行修改文件位置)
          /usr/bin/rclone copy /var/www/webdav/Bilibili OneDrive:Bilibili
      fi
    fi
fi
sleep $step
done
exit 0

具体的文件地址啥的自行修改,注释都写了,自行查看
不想改也可以和我保持一致,自行创建相关文件夹
编辑完脚本后,授予运行权限,crontab设置为每分钟执行一次。

*/1 * * * * /bin/bash /root/bili/bili.sh >/dev/null 2>&1
*/1 * * * * /bin/bash /root/bili/bilicheck.sh >/dev/null 2>&1

效果展示

TO DO
Last modification:May 1st, 2023 at 09:55 pm
不积小流无以成江海,赞赏我的人多了我就有钱了。