Code Monkey home page Code Monkey logo

cdndrive's Introduction

CDNDrive = BiliDrive + SuperBed

☁️ 废墟之上,重建辉煌! ☁️

☁️ 支持任意文件的全速上传与下载 ☁️

特色

  • 轻量:无复杂依赖,资源占用少
  • 自由:无文件格式与大小限制,无容量限制
  • 安全:上传的文件需要通过生成的 META URL 才能访问,他人无法随意查看
  • 稳定:带有分块校验与超时重试机制,在较差的网络环境中依然能确保文件的完整性
  • 快速:支持多线程传输与断点续传,同时借助各个站点的 CDN 资源,能最大化地利用网络环境进行上传与下载

使用指南

安装

通过pip(推荐):

pip install CDNDrive

从源码安装:

pip install git+https://github.com/apachecn/CDNDrive

登录

cdrive login [-h] site username password

site: 站点名称(见 -h)
username: 用户名
password: 密码

运行 cdrive 报错

$ cdrive
-bash: cdrive: command not found

解决方案: #7

设置 Cookie

cdrive cookies [-h] site cookies

site: 站点名称(见 -h)
cookies: Cookie

查看登录状态

cdrive userinfo [-h] site

site: 站点名称(见 -h)

上传

cdrive upload [-h] [-b BLOCK_SIZE] [-t THREAD] site file

site: 站点名称(见 -h)
file: 待上传的文件路径

-b BLOCK_SIZE: 分块大小(MB), 默认值为4
-t THREAD: 上传线程数, 默认值为4

上传完毕后,终端会打印一串 META URL 用于下载或分享,请妥善保管

下载

cdrive download [-h] [-f] [-t THREAD] meta [file]

meta: META URL (通常以 cdrive:// 开头)
file: 另存为新的文件名, 不指定则保存为上传时的文件名

-f: 覆盖已有文件
-t THREAD: 下载线程数, 默认值为8

下载完毕后会自动进行文件完整性校验,对于大文件该过程可能需要较长时间,若不愿等待可直接退出

查看文件元数据

cdrive info [-h] meta

meta: META URL

查看历史记录

cdrive history [-h]

交互模式

不传入任何命令行参数,直接运行程序即可进入交互模式

该模式下,程序会打印命令提示符CDNDrive > ,并等待用户输入命令

技术实现

将任意文件分块编码为图片后上传至各个站点,对该操作逆序即可下载并还原文件

性能指标

测试文件

文件名:[Vmoe]Hatsune Miku「Magical Mirai 2017」[BDrip][1920x1080p][HEVC_YUV420p10_60fps_2FLAC_5.1ch&2.0ch_Chapter][Effect Subtitles].mkv

大小:14.5 GB (14918.37 MB)

分块:10 MB * 1492

META URL:bdrive://d28784bff1086450a6c331fb322accccd382228e

上传

地理位置:四川成都

运营商:教育网

上行速率:20 Mbps

用时:02:16:39

平均速度:1.82 MB/s

下载

测试点1

地理位置:福建福州

运营商:**电信

下行速率:100 Mbps

用时:00:18:15

平均速度:13.62 MB/s

测试点2

地理位置:上海

运营商:**电信

下行速率:1 Gbps

用时:00:02:22

平均速度:104.97 MB/s

历史记录

见这里

免责声明

  • 请自行对重要文件做好本地备份。
  • 请不要上传含有个人隐私的文件,因为无法删除。
  • 请勿使用本项目上传不符合社会主义核心价值观的文件。
  • 请合理使用本项目,避免对哔哩哔哩的存储与带宽资源造成无意义的浪费。
  • 该项目仅用于学习和技术交流,开发者不承担任何由使用者的行为带来的法律责任。

协议

本项目基于 SATA 协议发布。

您有义务为此开源项目点赞,并考虑额外给予作者适当的奖励。

致谢

本项目基于 HsuryBiliDrive,在此表示感谢。

同时感谢 goocarder 提供的思路。

赞助我们

另见

cdndrive's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cdndrive's Issues

功能建议,建议添加直接上传文件夹支持

在本地读取文件树结构,并且设计一种储存格式,在分别上传文件夹内文件的时候将文件和对应的url对应起来,之后作为一个总index上传至图床作为文件夹url。
只是个人建议的思路,这个功能有个还是很不错的

b站直接登录和cookie登录均失败

使用用户名和密码登录:
[2021-02-24 17:13:26] 登录失败:服务繁忙, 请稍后再试

使用34位SESSDATA参数登录:
[2021-02-24 17:13:33] 用户信息获取失败

上传失败

[root@linode bilibili_椎名菜羽-ShiinaNanoha_22347054]# cdrive upload ali 【B限】钢琴弾唱♪_20200830200230754.flv
[2020-08-30 23:49:38] 上传: 【B限】钢琴弾唱♪_20200830200230754.flv (1.70 GB)
Traceback (most recent call last):
  File "/usr/local/bin/cdrive", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.6/site-packages/CDNDrive/__main__.py", line 321, in main
    args.func(args)
  File "/usr/local/lib/python3.6/site-packages/CDNDrive/__main__.py", line 120, in upload_handle
    history = read_history(args.site)
  File "/usr/local/lib/python3.6/site-packages/CDNDrive/util.py", line 64, in read_history
    history = json.loads(f.read())
  File "/usr/lib64/python3.6/json/__init__.py", line 354, in loads
    return _default_decoder.decode(s)
  File "/usr/lib64/python3.6/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib64/python3.6/json/decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
[root@linode bilibili_椎名菜羽-ShiinaNanoha_22347054]#

请问有没有支持ipv6的CDN啊?

请问有没有支持IPv6的CDN呀?
校园网流量太贵了,ipv6却免费用。
所以想找一个能走ipv6的CDN,或者让程序也支持ipv6?

b站直接登录和cookies登录均失败

Version: PIP newest

G:\>cdrive login bili ** ***
[2021-05-31 19:57:10] 用户信息获取失败

G:\>cdrive cookies bili d:\cookies.txt
[2021-05-31 19:57:18] 用户信息获取失败

Version: mater latest

G:\>cdrive login bili *** ***
[2021-05-31 19:58:24] 登录失败:服务繁忙, 请稍后再试

G:\>cdrive cookies bili "d:\cookies.txt"
[2021-05-31 19:58:32] 用户信息获取失败

See also: #19

【解决方案】cdrive 运行报错 -bash: cdrive: command not found

安装方式

如果你是pip安装: pip install CDNDrive

使用报错

运行 cdrive 报错

$ cdrive
-bash: cdrive: command not found

根据报错,说明:环境变量没配置

解决方案

sudo find / -name cdrive

路径:  ~/Library/Python/3.8/bin/cdrive

vim ~/.bash_profile

export PATH=$PATH:~/Library/Python/3.8/bin

source ~/.bash_profile

cdrive

usage: CDNDrive [-h] [-v] {login,cookies,userinfo,upload,download,info,history,help,version,exit} ...

Make Picbeds Great Cloud Storages!

positional arguments:
  {login,cookies,userinfo,upload,download,info,history,help,version,exit}
    login               log in to the site
    cookies             set cookies to the site
    userinfo            get userinfo
    upload              upload a file
    download            download a file
    info                show meta info
    history             show upload history
    help                show this help message
    version             show program's version number
    exit                exit program

optional arguments:
  -h, --help            show this help message and exit
  -v, --version         show program's version number and exit
CDNDrive >

下载失败

登录显示成功,但下载时出现问题:
比如:网页上链接是:

「帅张和他的朋友们」第二期精华电子书.pdf (1.49 MB) | bdex://0f39451b7944df1e8483897753af1ee443ded38c

到下载时,
cdrive download bdex://0f39451b7944df1e8483897753af1ee443ded38c
[2020-04-10 18:00:34] 下载: 「帅张和他的朋友们」第二期精华电子书.pdf (1.49 MB), 共有1个分块, 上传于2020-01-25 17:18:02
[2020-04-10 18:00:34] 线程数: 8
[2020-04-10 18:00:50] 分块1/1第1次下载失败
[2020-04-10 18:01:32] 分块1/1下载完毕
[2020-04-10 18:01:32] 「帅张和他的朋友们」第二期精华电子书.pdf (1.49 MB) 下载完毕, 用时58.4秒, 平均速度26.15 KB/s
[2020-04-10 18:01:32] 文件校验通过

这个是成功的,然后换一个大一些的文件:

吾爱破解论坛精华集 2019 第四部分.epub (28.50 MB) bdex://25819e6fc4988b119c4b9965af3f325647cb968f

cdrive download bdex://25819e6fc4988b119c4b9965af3f325647cb968f
[2020-04-10 18:04:43] 下载: 吾爱破解论坛精华集 2019 第四部分.epub (28.50 MB), 共有8个分块, 上传于2020-03-28 10:47:11
文件已存在, 是否覆盖? [y/N] y
[2020-04-10 18:04:47] 线程数: 8
[2020-04-10 18:04:56] 分块5/8第1次下载失败
[2020-04-10 18:04:56] 分块6/8第1次下载失败
[2020-04-10 18:04:57] 分块1/8第1次下载失败
[2020-04-10 18:04:58] 分块8/8第1次下载失败
[2020-04-10 18:04:59] 分块3/8第1次下载失败
[2020-04-10 18:05:00] 分块2/8第1次下载失败
[2020-04-10 18:05:04] 分块7/8第1次下载失败
[2020-04-10 18:05:08] 分块8/8第2次下载失败
[2020-04-10 18:05:09] 分块4/8第1次下载失败
[2020-04-10 18:05:09] 分块3/8第2次下载失败
[2020-04-10 18:05:11] 分块1/8第2次下载失败
[2020-04-10 18:05:13] 分块5/8第2次下载失败
[2020-04-10 18:05:14] 分块2/8第2次下载失败
[2020-04-10 18:05:17] 分块6/8第2次下载失败
[2020-04-10 18:05:18] 分块4/8第2次下载失败
[2020-04-10 18:05:18] 分块7/8第2次下载失败
[2020-04-10 18:05:19] 分块8/8第3次下载失败
[2020-04-10 18:05:21] 分块1/8第3次下载失败
[2020-04-10 18:05:24] 分块2/8第3次下载失败
[2020-04-10 18:05:25] 分块5/8第3次下载失败
[2020-04-10 18:05:28] 分块6/8第3次下载失败
[2020-04-10 18:05:32] 分块7/8第3次下载失败
[2020-04-10 18:05:33] 分块2/8第4次下载失败
[2020-04-10 18:05:34] 分块8/8第4次下载失败
[2020-04-10 18:05:35] 分块3/8第3次下载失败
[2020-04-10 18:05:38] 分块4/8第3次下载失败
[2020-04-10 18:05:39] 分块5/8第4次下载失败
[2020-04-10 18:05:43] 分块7/8第4次下载失败
[2020-04-10 18:05:43] 分块8/8下载完毕
[2020-04-10 18:05:50] 分块2/8第5次下载失败
[2020-04-10 18:05:50] 分块4/8第4次下载失败
[2020-04-10 18:05:55] 分块1/8第4次下载失败
[2020-04-10 18:05:56] 分块5/8第5次下载失败
[2020-04-10 18:05:58] 分块6/8第4次下载失败
[2020-04-10 18:06:00] 分块7/8第5次下载失败
[2020-04-10 18:06:01] 分块2/8第6次下载失败
[2020-04-10 18:06:02] 分块4/8第5次下载失败
[2020-04-10 18:06:02] 分块3/8第4次下载失败
[2020-04-10 18:06:06] 分块5/8第6次下载失败
[2020-04-10 18:06:08] 分块1/8第5次下载失败
[2020-04-10 18:06:08] 分块7/8第6次下载失败
[2020-04-10 18:06:12] 分块3/8第5次下载失败
[2020-04-10 18:06:14] 分块2/8第7次下载失败
[2020-04-10 18:06:16] 分块6/8第5次下载失败
[2020-04-10 18:06:16] 分块4/8第6次下载失败
[2020-04-10 18:06:19] 分块7/8第7次下载失败
[2020-04-10 18:06:20] 分块1/8第6次下载失败
[2020-04-10 18:06:22] 分块3/8第6次下载失败
[2020-04-10 18:06:27] 分块4/8第7次下载失败
[2020-04-10 18:06:28] 分块5/8第7次下载失败
[2020-04-10 18:06:29] 分块6/8第6次下载失败
[2020-04-10 18:06:35] 分块5/8第8次下载失败
[2020-04-10 18:06:40] 分块1/8第7次下载失败
[2020-04-10 18:06:40] 分块4/8第8次下载失败
[2020-04-10 18:06:45] 分块6/8第7次下载失败
[2020-04-10 18:06:49] 分块1/8第8次下载失败
[2020-04-10 18:06:50] 分块5/8第9次下载失败
[2020-04-10 18:06:51] 分块3/8第7次下载失败
[2020-04-10 18:06:52] 分块4/8第9次下载失败
[2020-04-10 18:06:57] 分块6/8第8次下载失败
[2020-04-10 18:07:05] 分块1/8第9次下载失败
[2020-04-10 18:07:05] 分块3/8第8次下载失败
[2020-04-10 18:07:06] 分块2/8第8次下载失败
[2020-04-10 18:07:06] 分块5/8第10次下载失败
[2020-04-10 18:07:07] 分块6/8第9次下载失败
[2020-04-10 18:07:16] 分块1/8第10次下载失败
[2020-04-10 18:07:18] 分块3/8第9次下载失败
[2020-04-10 18:07:22] 分块4/8第10次下载失败
[2020-04-10 18:08:04] 分块2/8第9次下载失败
[2020-04-10 18:08:05] 分块7/8下载完毕

随后就退出,没有下载成功,这是怎么回事啊?

macos 10.15 安装出错

pip install CDNDrive
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
ERROR: Could not find a version that satisfies the requirement CDNDrive (from versions: none)
ERROR: No matching distribution found for CDNDrive

bili的上传文件无法下载

之前一直没问题的,最近一两周出现的问题,上传的时候没问题,但是下载失败:

cdrive download bdex://5787c80246b33*****************
Traceback (most recent call last):
File "E:\Programs\Python\Python310\lib\runpy.py", line 196, in run_module_as_main
return run_code(code, main_globals, None,
File "E:\Programs\Python\Python310\lib\runpy.py", line 86, in run_code
exec(code, run_globals)
File "E:\Programs\Python\Python310\Scripts\cdrive.exe_main
.py", line 7, in
File "E:\Programs\Python\Python310\lib\site-packages\CDNDrive_main
.py", line 329, in main
args.func(args)
File "E:\Programs\Python\Python310\lib\site-packages\CDNDrive_main
.py", line 203, in download_handle
meta_dict = fetch_meta(args.meta)
File "E:\Programs\Python\Python310\lib\site-packages\CDNDrive_main_.py", line 50, in fetch_meta
meta_dict = json.loads(encoder.decode(full_meta).decode("utf-8"))
File "E:\Programs\Python\Python310\lib\json_init_.py", line 346, in loads
return _default_decoder.decode(s)
File "E:\Programs\Python\Python310\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "E:\Programs\Python\Python310\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

用的是Windows系统,同时上传的baijia和微博都没问题,可以下载下来

[Enhanced] 关于添加文件夹上传解决方案

使用场景

当用户有多个文件需要上传时,如果一个一个上传,是一个十分费力不讨好的事情。

解决方案

  • 方案一

采用对文件夹进行递归搜索,自动上传

 .
├── 3006101
│   ├── 【肯尼亞-NR】炸鸡:女大学生最爱的安娜-092526-752.flv
│   └── 【肯尼亞-NR】炸鸡:女大学生最爱的安娜-092706-288.flv
├── 5655865
│   └── 【木之本切】我是猪-023439-113.flv
├── config.backup.json
└── config.json

对于所选定的文件夹进行全部深程递归,依次自动上传,并将每个文件对目标文件夹的相对路径做记录,与上传的分享链接组成key - value

在将整个字典进行base64的编码(过长的话可以考虑压缩)分享,类似于vemss/vless的分享链接

  • 方案二

对目标文件夹进行tar gz 类型的压缩,然后整体上传,这样的缺点很明显,太占用系统的存储空间了。优点则是简单易懂,多平台兼容

在linux环境下使用不支持方向键

按下方向键后出现类似 ^[[A 的字符串,环境为WSL Ubuntu 20.04。已经安装python3-readlike,并且经验证在python3.8默认的交互界面下可以支持方向键。作为对比,直接使用Windows平台下的Python3则可以支持方向键。

163下载和info报错

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xaf in position 0: invalid start byte
OS:linux

所以,site是什么

[root@linode ~]$ cdrive -h
usage: CDNDrive [-h] [-v]
                {login,cookies,userinfo,upload,download,info,history} ...

Make Picbeds Great Cloud Storages!

positional arguments:
  {login,cookies,userinfo,upload,download,info,history}
    login               log in to the site
    cookies             set cookies to the site
    userinfo            get userinfo
    upload              upload a file
    download            download a file
    info                show meta info
    history             show upload history

optional arguments:
  -h, --help            show this help message and exit
  -v, --version         show program's version number and exit
[root@linode ~]$ cdrive login -h
usage: CDNDrive login [-h]
                      {***DELETED CONTENT***}
                      username password

positional arguments:
  {***DELETED CONTENT***}
                        site
  username              username
  password              password

optional arguments:
  -h, --help            show this help message and exit

不是说了 -h 可以看支持的站点吗 QwQ

下载时出错:image file is truncated

下载时报错:
[2021-02-26 20:23:16] 分块2564/5530下载完毕
Traceback (most recent call last):
File "d:\anaconda3\envs\web\lib\site-packages\PIL\ImageFile.py", line 247, in load
s = read(self.decodermaxblock)
File "d:\anaconda3\envs\web\lib\site-packages\PIL\PngImagePlugin.py", line 896, in load_read
cid, pos, length = self.png.read()
File "d:\anaconda3\envs\web\lib\site-packages\PIL\PngImagePlugin.py", line 162, in read
length = i32(s)
File "d:\anaconda3\envs\web\lib\site-packages\PIL_binary.py", line 75, in i32be
return unpack_from(">I", c, o)[0]
struct.error: unpack_from requires a buffer of at least 4 bytes

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "d:\anaconda3\envs\web\lib\runpy.py", line 193, in run_module_as_main
"main", mod_spec)
File "d:\anaconda3\envs\web\lib\runpy.py", line 85, in run_code
exec(code, run_globals)
File "D:\anaconda3\envs\web\Scripts\cdrive.exe_main
.py", line 7, in
File "d:\anaconda3\envs\web\lib\site-packages\CDNDrive_main
.py", line 321, in main
args.func(args)
File "d:\anaconda3\envs\web\lib\site-packages\CDNDrive_main_.py", line 226, in download_handle
for h in hdls: h.result()
File "d:\anaconda3\envs\web\lib\concurrent\futures_base.py", line 435, in result
return self.__get_result()
File "d:\anaconda3\envs\web\lib\concurrent\futures_base.py", line 384, in __get_result
raise self.exception
File "d:\anaconda3\envs\web\lib\concurrent\futures\thread.py", line 57, in run
result = self.fn(*self.args, **self.kwargs)
File "d:\anaconda3\envs\web\lib\site-packages\CDNDrive_main
.py", line 179, in tr_download
block = encoder.decode(block)
File "d:\anaconda3\envs\web\lib\site-packages\CDNDrive\encoders\PngEncoder.py", line 72, in decode
return self.decode_png(data)
File "d:\anaconda3\envs\web\lib\site-packages\CDNDrive\encoders\PngEncoder.py", line 62, in decode_png
data = img.tobytes()
File "d:\anaconda3\envs\web\lib\site-packages\PIL\Image.py", line 734, in tobytes
self.load()
File "d:\anaconda3\envs\web\lib\site-packages\PIL\ImageFile.py", line 253, in load
raise OSError("image file is truncated") from e
OSError: image file is truncated
[2021-02-26 20:23:33] 分块2561/5530第1次下载失败
[2021-02-26 20:23:35] 分块2565/5530第1次下载失败
[2021-02-26 20:24:53] 分块3175/5530第1次下载失败
[2021-02-26 20:25:33] 分块3626/5530第1次下载失败
[2021-02-26 20:25:34] 分块3634/5530第1次下载失败

[Enhanced]批量下载列表中的文件

我有批量下载大量小文件的需求,最多的情况下有接近100000个,我以一行一个的格式把meta链接存储在一个list文件中。我尝试用脚本并发多线程循环遍历下载,但随着并发数的增加,python崩溃的机率也增加了,这导致最后会漏掉不少文件(5%~10%),而且CPU开销也很大。我本人不太懂python,所以也不知道该怎么改。
从我查资料的情况来看,异步多线程无阻塞的实现方式是效率最高的。我建议为该项目添加-l (list)和-j (jobs)参数,前者表示从列表文件中读取meta链接,后者表示最大并发数。

【求助】登陆bili成功,上传文件失败,现实HTTP 403错误

通过cookies正常登陆bili,但是上传文件的时候显示
[2023-11-14 15:08:04] 分块4/5第1次上传失败:HTTP 403
[2023-11-14 15:08:04] 分块1/5第1次上传失败:HTTP 403
[2023-11-14 15:08:04] 分块2/5第1次上传失败:HTTP 403
......
想知道怎么解决该问题,谢谢!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.