>由于b站停用了相簿以及相关api,BiliOpen已失效,本存储库仅作为学习参考。
<h1 align="center">- BiliOpen -</h1>
<h4 align="center">☁️ 哔哩开放云,支持任意文件的全速上传与下载 ☁️</h4>
## 特色
- 轻量:无复杂依赖,资源占用少
- 自由:无文件格式与大小限制,无容量限制
- 开放:基于BiliDrive二次开源
- 安全:上传的文件需要通过生成的META URL才能访问,他人无法随意查看
- 稳定:带有分块校验与超时重试机制,在较差的网络环境中依然能确保文件的完整性
- 快速:支持多线程传输与断点续传,同时借助B站的CDN资源,能最大化地利用网络环境进行上传与下载
- API支持:提供简洁的Python API,可轻松集成到其他项目中
- 自定义背景:支持使用自定义图像作为载体,让上传的文件看起来像正常图片,增强隐蔽性
## 安装
### 方法1:下载可执行文件
前往[发布页](https://github.com/Wodlie/BiliOpen/releases/latest)获取可直接运行的二进制文件
### 方法2:使用Python运行
下载[源代码](https://github.com/Wodlie/BiliOpen/archive/master.zip)后使用Python 3.6或更高版本运行
```bash
# 安装依赖
pip install -r requirements.txt
# 创建cookie.txt文件(见下文获取方法)
# 然后就可以使用了
```
## Cookie获取方法
1. 访问 https://www.bilibili.com 并登录
2. 按F12打开开发者工具
3. 在Application/存储 > Cookies > https://www.bilibili.com 中找到:
- `SESSDATA`
- `bili_jct`
4. 将这些值按以下格式写入 `cookie.txt`:
```
SESSDATA=你的SESSDATA值; bili_jct=你的bili_jct值
```
## 使用方法
### 🚀 Python API 使用(推荐)
#### 基本使用
```python
import BiliOpen
# 上传文件
meta_url = BiliOpen.upload("my_file.txt")
print(f"上传成功: {meta_url}")
# 下载文件
downloaded_file = BiliOpen.download(meta_url, "downloaded_file.txt")
print(f"下载成功: {downloaded_file}")
# 上传二进制数据
data = b"Hello, BiliOpen!"
meta_url = BiliOpen.upload(data, filename="hello.txt")
# 下载到内存
downloaded_data = BiliOpen.download(meta_url)
print(f"下载数据: {downloaded_data}")
# 获取文件信息
info = BiliOpen.get_info(meta_url)
print(f"文件信息: {info}")
```
#### 高级用法
```python
# 使用API类进行更多控制
api = BiliOpen.BiliOpenAPI()
# 自定义上传参数
meta_url = api.upload_bytes(
data=b"Large file data",
filename="large_file.dat",
block_size_mb=8, # 8MB分块
thread_count=8 # 8个上传线程
)
# 🆕 使用自定义背景图像上传
meta_url = api.upload_file(
"my_file.txt",
background_image="custom_background.bmp" # 指定背景图像
)
# 也可以传入二进制数据作为背景
with open("background.bmp", "rb") as f:
bg_data = f.read()
meta_url = api.upload_bytes(
data=b"File data",
filename="file.dat",
background_image=bg_data # 使用二进制数据作为背景
)
# 自定义下载参数
data = api.download_bytes(
meta_url,
thread_count=16 # 16个下载线程
)
# 下载到文件并强制覆盖
file_path = api.download_file(
meta_url,
"output.dat",
force_overwrite=True
)
```
#### 使用自定义Cookies
```python
# 方法1:传入Cookie字典
cookies = {
'SESSDATA': 'your_sessdata',
'bili_jct': 'your_bili_jct'
}
meta_url = BiliOpen.upload(data, cookies=cookies, filename="test.txt")
# 🆕 使用自定义背景图像上传
meta_url = BiliOpen.upload(
"my_file.txt",
cookies=cookies,
background_image="beautiful_image.bmp" # 指定背景图像
)
# 方法2:使用API类
api = BiliOpen.BiliOpenAPI(cookies=cookies)
meta_url = api.upload_bytes(data, "test.txt")
```
#### 错误处理
```python
try:
meta_url = BiliOpen.upload("file.txt")
if meta_url:
print(f"上传成功: {meta_url}")
data = BiliOpen.download(meta_url)
if data:
print("下载成功")
else:
print("下载失败")
else:
print("上传失败")
except ValueError as e:
print(f"参数错误: {e}")
except FileNotFoundError as e:
print(f"文件不存在: {e}")
except Exception as e:
print(f"未知错误: {e}")
```
#### API参考
##### 便捷函数
- `BiliOpen.upload(data_or_path, cookies=None, filename=None, background_image=None, **kwargs)` - 上传文件或数据
- `BiliOpen.download(meta_string, output_path=None, cookies=None, **kwargs)` - 下载文件
- `BiliOpen.get_info(meta_string, cookies=None)` - 获取文件信息
##### BiliOpenAPI类方法
- `upload_file(file_path, block_size_mb=4, thread_count=4, background_image=None)` - 上传文件
- `upload_bytes(data, filename=None, block_size_mb=4, thread_count=4, background_image=None)` - 上传二进制数据
- `download_file(meta_string, output_path=None, force_overwrite=False, thread_count=8)` - 下载到文件
- `download_bytes(meta_string, thread_count=8)` - 下载到内存
- `get_file_info(meta_string)` - 获取文件信息
### 📟 命令行使用
#### 上传
```bash
python -m BiliOpen upload [-h] [-b BLOCK_SIZE] [-t THREAD] [-p PICTURE] file
# 参数说明:
# file: 待上传的文件路径
# -b BLOCK_SIZE: 分块大小(MB), 默认值为4
# -t THREAD: 上传线程数, 默认值为4
# -p PICTURE: 自定义背景图像路径, 默认值为纯黑背景图
```
上传完毕后,终端会打印一串META URL(通常以`biliopen://`开头)用于下载或分享,请妥善保管
#### 下载
```bash
python -m BiliOpen download [-h] [-f] [-t THREAD] meta [file]
# 参数说明:
# meta: META URL(通常以biliopen://开头)
# file: 另存为新的文件名, 不指定则保存为上传时的文件名
# -f: 覆盖已有文件
# -t THREAD: 下载线程数, 默认值为8
```
下载完毕后会自动进行文件完整性校验,对于大文件该过程可能需要较长时间,若不愿等待可直接退出
#### 查看文件元数据
```bash
python -m BiliOpen info [-h] meta
# meta: META URL(通常以biliopen://开头)
```
#### 查看历史记录
```bash
python -m BiliOpen history [-h]
```
#### 交互模式
不传入任何命令行参数,直接运行程序即可进入交互模式
该模式下,程序会打印命令提示符`BiliOpen > `,并等待用户输入命令
## 应用示例
### 文件备份工具
```python
import BiliOpen
import os
def backup_file(file_path):
"""备份单个文件到B站"""
if not os.path.exists(file_path):
print(f"文件不存在: {file_path}")
return None
print(f"备份文件: {file_path}")
meta_url = BiliOpen.upload(file_path)
if meta_url:
print(f"备份成功: {meta_url}")
return meta_url
else:
print("备份失败")
return None
def restore_file(meta_url, output_path):
"""从B站恢复文件"""
print(f"恢复文件到: {output_path}")
result = BiliOpen.download(meta_url, output_path)
if result:
print("恢复成功")
return result
else:
print("恢复失败")
return None
# 使用示例
meta_url = backup_file("important_document.pdf")
if meta_url:
restore_file(meta_url, "restored_document.pdf")
```
### 云存储服务
```python
import BiliOpen
class CloudStorage:
def __init__(self):
self.api = BiliOpen.BiliOpenAPI()
def save(self, name: str, data: bytes) -> str:
"""保存数据到云端"""
meta_url = self.api.upload_bytes(data, name)
if not meta_url:
raise Exception("保存失败")
return meta_url
def load(self, meta_url: str) -> bytes:
"""从云端加载数据"""
data = self.api.download_bytes(meta_url)
if not data:
raise Exception("加载失败")
return data
def get_info(self, meta_url: str) -> dict:
"""获取文件信息"""
info = self.api.get_file_info(meta_url)
if not info:
raise Exception("获取信息失败")
return info
# 使用示例
storage = CloudStorage()
# 保存数据
data = b"Important data to store"
meta_url = storage.save("my_data.bin", data)
print(f"已保存: {meta_url}")
# 加载数据
loaded_data = storage.load(meta_url)
print(f"已加载: {loaded_data}")
# 获取信息
info = storage.get_info(meta_url)
print(f"文件信息: {info}")
```
## 技术实现
将任意文件分块编码为图片后上传至B站,对该操作逆序即可下载并还原文件
## 参数调优建议
- `block_size_mb`: 较大的分块适合大文件和良好的网络环境,建议4-8MB
- `thread_count`: 增加线程数可以提高速度,但过多可能导致限流
- 上传建议使用4-8个线程
- 下载建议使用8-16个线程
## 性能指标
### 测试文件1
>原作者测试
文件名:[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
### 测试文件2
文件名:test.iso
大小: 5.91 GB
分块: 6 MB * 1009
META URL: biliopen://96f1cad8d8674750cd6592a28b162c4e91b7e4fa
### 上传
地理位置:新加坡 microsoft.com
运营商:Microsoft Azure
平均速度:3.06 MB/s
## 注意事项
1. 请遵守B站的使用条款,不要上传违规内容
2. 大文件上传可能需要较长时间,请耐心等待
3. 建议定期备份重要的META URL
4. Cookie有效期有限,失效时需要重新获取
5. 请自行对重要文件做好本地备份
## 免责声明
请自行对重要文件做好本地备份
请勿使用本项目上传不符合社会主义核心价值观的文件
请合理使用本项目,避免对哔哩哔哩的存储与带宽资源造成无意义的浪费
该项目仅用于学习和技术交流,开发者不承担任何由使用者的行为带来的法律责任
## 许可证
BiliOpen is under The Star And Thank Author License (SATA)
本项目基于MIT协议发布,并增加了SATA协议
您有义务为此开源项目点赞,并考虑额外给予作者适当的奖励 ∠( ᐛ 」∠)_
Raw data
{
"_id": null,
"home_page": "https://github.com/Wodlie/BiliOpen",
"name": "BiliOpen",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": null,
"keywords": "bilibili, cloud, disk, drive, storage, pan, yun, B\u7ad9, \u54d4\u54e9\u54d4\u54e9, \u7f51\u76d8",
"author": "Hsury & Wodlie",
"author_email": "i@hsury.com",
"download_url": "https://files.pythonhosted.org/packages/82/84/8c7b8497a54fc22dcf0eafd4691086e3d5898d17cb402cddee69d1cbd507/biliopen-2.0.1.tar.gz",
"platform": null,
"description": ">\u7531\u4e8eb\u7ad9\u505c\u7528\u4e86\u76f8\u7c3f\u4ee5\u53ca\u76f8\u5173api\uff0cBiliOpen\u5df2\u5931\u6548\uff0c\u672c\u5b58\u50a8\u5e93\u4ec5\u4f5c\u4e3a\u5b66\u4e60\u53c2\u8003\u3002\n\n<h1 align=\"center\">- BiliOpen -</h1>\n\n<h4 align=\"center\">\u2601\ufe0f \u54d4\u54e9\u5f00\u653e\u4e91\uff0c\u652f\u6301\u4efb\u610f\u6587\u4ef6\u7684\u5168\u901f\u4e0a\u4f20\u4e0e\u4e0b\u8f7d \u2601\ufe0f</h4>\n\n## \u7279\u8272\n\n- \u8f7b\u91cf\uff1a\u65e0\u590d\u6742\u4f9d\u8d56\uff0c\u8d44\u6e90\u5360\u7528\u5c11\n- \u81ea\u7531\uff1a\u65e0\u6587\u4ef6\u683c\u5f0f\u4e0e\u5927\u5c0f\u9650\u5236\uff0c\u65e0\u5bb9\u91cf\u9650\u5236\n- \u5f00\u653e\uff1a\u57fa\u4e8eBiliDrive\u4e8c\u6b21\u5f00\u6e90\n- \u5b89\u5168\uff1a\u4e0a\u4f20\u7684\u6587\u4ef6\u9700\u8981\u901a\u8fc7\u751f\u6210\u7684META URL\u624d\u80fd\u8bbf\u95ee\uff0c\u4ed6\u4eba\u65e0\u6cd5\u968f\u610f\u67e5\u770b\n- \u7a33\u5b9a\uff1a\u5e26\u6709\u5206\u5757\u6821\u9a8c\u4e0e\u8d85\u65f6\u91cd\u8bd5\u673a\u5236\uff0c\u5728\u8f83\u5dee\u7684\u7f51\u7edc\u73af\u5883\u4e2d\u4f9d\u7136\u80fd\u786e\u4fdd\u6587\u4ef6\u7684\u5b8c\u6574\u6027\n- \u5feb\u901f\uff1a\u652f\u6301\u591a\u7ebf\u7a0b\u4f20\u8f93\u4e0e\u65ad\u70b9\u7eed\u4f20\uff0c\u540c\u65f6\u501f\u52a9B\u7ad9\u7684CDN\u8d44\u6e90\uff0c\u80fd\u6700\u5927\u5316\u5730\u5229\u7528\u7f51\u7edc\u73af\u5883\u8fdb\u884c\u4e0a\u4f20\u4e0e\u4e0b\u8f7d\n- API\u652f\u6301\uff1a\u63d0\u4f9b\u7b80\u6d01\u7684Python API\uff0c\u53ef\u8f7b\u677e\u96c6\u6210\u5230\u5176\u4ed6\u9879\u76ee\u4e2d\n- \u81ea\u5b9a\u4e49\u80cc\u666f\uff1a\u652f\u6301\u4f7f\u7528\u81ea\u5b9a\u4e49\u56fe\u50cf\u4f5c\u4e3a\u8f7d\u4f53\uff0c\u8ba9\u4e0a\u4f20\u7684\u6587\u4ef6\u770b\u8d77\u6765\u50cf\u6b63\u5e38\u56fe\u7247\uff0c\u589e\u5f3a\u9690\u853d\u6027\n\n## \u5b89\u88c5\n\n### \u65b9\u6cd51\uff1a\u4e0b\u8f7d\u53ef\u6267\u884c\u6587\u4ef6\n\u524d\u5f80[\u53d1\u5e03\u9875](https://github.com/Wodlie/BiliOpen/releases/latest)\u83b7\u53d6\u53ef\u76f4\u63a5\u8fd0\u884c\u7684\u4e8c\u8fdb\u5236\u6587\u4ef6\n\n### \u65b9\u6cd52\uff1a\u4f7f\u7528Python\u8fd0\u884c\n\u4e0b\u8f7d[\u6e90\u4ee3\u7801](https://github.com/Wodlie/BiliOpen/archive/master.zip)\u540e\u4f7f\u7528Python 3.6\u6216\u66f4\u9ad8\u7248\u672c\u8fd0\u884c\n\n```bash\n# \u5b89\u88c5\u4f9d\u8d56\npip install -r requirements.txt\n\n# \u521b\u5efacookie.txt\u6587\u4ef6\uff08\u89c1\u4e0b\u6587\u83b7\u53d6\u65b9\u6cd5\uff09\n# \u7136\u540e\u5c31\u53ef\u4ee5\u4f7f\u7528\u4e86\n```\n\n## Cookie\u83b7\u53d6\u65b9\u6cd5\n\n1. \u8bbf\u95ee https://www.bilibili.com \u5e76\u767b\u5f55\n2. \u6309F12\u6253\u5f00\u5f00\u53d1\u8005\u5de5\u5177\n3. \u5728Application/\u5b58\u50a8 > Cookies > https://www.bilibili.com \u4e2d\u627e\u5230\uff1a\n - `SESSDATA`\n - `bili_jct`\n4. \u5c06\u8fd9\u4e9b\u503c\u6309\u4ee5\u4e0b\u683c\u5f0f\u5199\u5165 `cookie.txt`\uff1a\n ```\n SESSDATA=\u4f60\u7684SESSDATA\u503c; bili_jct=\u4f60\u7684bili_jct\u503c\n ```\n\n## \u4f7f\u7528\u65b9\u6cd5\n\n### \ud83d\ude80 Python API \u4f7f\u7528\uff08\u63a8\u8350\uff09\n\n#### \u57fa\u672c\u4f7f\u7528\n\n```python\nimport BiliOpen\n\n# \u4e0a\u4f20\u6587\u4ef6\nmeta_url = BiliOpen.upload(\"my_file.txt\")\nprint(f\"\u4e0a\u4f20\u6210\u529f: {meta_url}\")\n\n# \u4e0b\u8f7d\u6587\u4ef6\ndownloaded_file = BiliOpen.download(meta_url, \"downloaded_file.txt\")\nprint(f\"\u4e0b\u8f7d\u6210\u529f: {downloaded_file}\")\n\n# \u4e0a\u4f20\u4e8c\u8fdb\u5236\u6570\u636e\ndata = b\"Hello, BiliOpen!\"\nmeta_url = BiliOpen.upload(data, filename=\"hello.txt\")\n\n# \u4e0b\u8f7d\u5230\u5185\u5b58\ndownloaded_data = BiliOpen.download(meta_url)\nprint(f\"\u4e0b\u8f7d\u6570\u636e: {downloaded_data}\")\n\n# \u83b7\u53d6\u6587\u4ef6\u4fe1\u606f\ninfo = BiliOpen.get_info(meta_url)\nprint(f\"\u6587\u4ef6\u4fe1\u606f: {info}\")\n```\n\n#### \u9ad8\u7ea7\u7528\u6cd5\n\n```python\n# \u4f7f\u7528API\u7c7b\u8fdb\u884c\u66f4\u591a\u63a7\u5236\napi = BiliOpen.BiliOpenAPI()\n\n# \u81ea\u5b9a\u4e49\u4e0a\u4f20\u53c2\u6570\nmeta_url = api.upload_bytes(\n data=b\"Large file data\",\n filename=\"large_file.dat\",\n block_size_mb=8, # 8MB\u5206\u5757\n thread_count=8 # 8\u4e2a\u4e0a\u4f20\u7ebf\u7a0b\n)\n\n# \ud83c\udd95 \u4f7f\u7528\u81ea\u5b9a\u4e49\u80cc\u666f\u56fe\u50cf\u4e0a\u4f20\nmeta_url = api.upload_file(\n \"my_file.txt\",\n background_image=\"custom_background.bmp\" # \u6307\u5b9a\u80cc\u666f\u56fe\u50cf\n)\n\n# \u4e5f\u53ef\u4ee5\u4f20\u5165\u4e8c\u8fdb\u5236\u6570\u636e\u4f5c\u4e3a\u80cc\u666f\nwith open(\"background.bmp\", \"rb\") as f:\n bg_data = f.read()\nmeta_url = api.upload_bytes(\n data=b\"File data\",\n filename=\"file.dat\",\n background_image=bg_data # \u4f7f\u7528\u4e8c\u8fdb\u5236\u6570\u636e\u4f5c\u4e3a\u80cc\u666f\n)\n\n# \u81ea\u5b9a\u4e49\u4e0b\u8f7d\u53c2\u6570\ndata = api.download_bytes(\n meta_url,\n thread_count=16 # 16\u4e2a\u4e0b\u8f7d\u7ebf\u7a0b\n)\n\n# \u4e0b\u8f7d\u5230\u6587\u4ef6\u5e76\u5f3a\u5236\u8986\u76d6\nfile_path = api.download_file(\n meta_url,\n \"output.dat\",\n force_overwrite=True\n)\n```\n\n#### \u4f7f\u7528\u81ea\u5b9a\u4e49Cookies\n\n```python\n# \u65b9\u6cd51\uff1a\u4f20\u5165Cookie\u5b57\u5178\ncookies = {\n 'SESSDATA': 'your_sessdata',\n 'bili_jct': 'your_bili_jct'\n}\n\nmeta_url = BiliOpen.upload(data, cookies=cookies, filename=\"test.txt\")\n\n# \ud83c\udd95 \u4f7f\u7528\u81ea\u5b9a\u4e49\u80cc\u666f\u56fe\u50cf\u4e0a\u4f20\nmeta_url = BiliOpen.upload(\n \"my_file.txt\", \n cookies=cookies, \n background_image=\"beautiful_image.bmp\" # \u6307\u5b9a\u80cc\u666f\u56fe\u50cf\n)\n\n# \u65b9\u6cd52\uff1a\u4f7f\u7528API\u7c7b\napi = BiliOpen.BiliOpenAPI(cookies=cookies)\nmeta_url = api.upload_bytes(data, \"test.txt\")\n```\n\n#### \u9519\u8bef\u5904\u7406\n\n```python\ntry:\n meta_url = BiliOpen.upload(\"file.txt\")\n if meta_url:\n print(f\"\u4e0a\u4f20\u6210\u529f: {meta_url}\")\n \n data = BiliOpen.download(meta_url)\n if data:\n print(\"\u4e0b\u8f7d\u6210\u529f\")\n else:\n print(\"\u4e0b\u8f7d\u5931\u8d25\")\n else:\n print(\"\u4e0a\u4f20\u5931\u8d25\")\n \nexcept ValueError as e:\n print(f\"\u53c2\u6570\u9519\u8bef: {e}\")\nexcept FileNotFoundError as e:\n print(f\"\u6587\u4ef6\u4e0d\u5b58\u5728: {e}\")\nexcept Exception as e:\n print(f\"\u672a\u77e5\u9519\u8bef: {e}\")\n```\n\n#### API\u53c2\u8003\n\n##### \u4fbf\u6377\u51fd\u6570\n- `BiliOpen.upload(data_or_path, cookies=None, filename=None, background_image=None, **kwargs)` - \u4e0a\u4f20\u6587\u4ef6\u6216\u6570\u636e\n- `BiliOpen.download(meta_string, output_path=None, cookies=None, **kwargs)` - \u4e0b\u8f7d\u6587\u4ef6\n- `BiliOpen.get_info(meta_string, cookies=None)` - \u83b7\u53d6\u6587\u4ef6\u4fe1\u606f\n\n##### BiliOpenAPI\u7c7b\u65b9\u6cd5\n- `upload_file(file_path, block_size_mb=4, thread_count=4, background_image=None)` - \u4e0a\u4f20\u6587\u4ef6\n- `upload_bytes(data, filename=None, block_size_mb=4, thread_count=4, background_image=None)` - \u4e0a\u4f20\u4e8c\u8fdb\u5236\u6570\u636e\n- `download_file(meta_string, output_path=None, force_overwrite=False, thread_count=8)` - \u4e0b\u8f7d\u5230\u6587\u4ef6\n- `download_bytes(meta_string, thread_count=8)` - \u4e0b\u8f7d\u5230\u5185\u5b58\n- `get_file_info(meta_string)` - \u83b7\u53d6\u6587\u4ef6\u4fe1\u606f\n\n### \ud83d\udcdf \u547d\u4ee4\u884c\u4f7f\u7528\n\n#### \u4e0a\u4f20\n\n```bash\npython -m BiliOpen upload [-h] [-b BLOCK_SIZE] [-t THREAD] [-p PICTURE] file\n\n# \u53c2\u6570\u8bf4\u660e:\n# file: \u5f85\u4e0a\u4f20\u7684\u6587\u4ef6\u8def\u5f84\n# -b BLOCK_SIZE: \u5206\u5757\u5927\u5c0f(MB), \u9ed8\u8ba4\u503c\u4e3a4\n# -t THREAD: \u4e0a\u4f20\u7ebf\u7a0b\u6570, \u9ed8\u8ba4\u503c\u4e3a4\n# -p PICTURE: \u81ea\u5b9a\u4e49\u80cc\u666f\u56fe\u50cf\u8def\u5f84, \u9ed8\u8ba4\u503c\u4e3a\u7eaf\u9ed1\u80cc\u666f\u56fe\n```\n\n\u4e0a\u4f20\u5b8c\u6bd5\u540e\uff0c\u7ec8\u7aef\u4f1a\u6253\u5370\u4e00\u4e32META URL\uff08\u901a\u5e38\u4ee5`biliopen://`\u5f00\u5934\uff09\u7528\u4e8e\u4e0b\u8f7d\u6216\u5206\u4eab\uff0c\u8bf7\u59a5\u5584\u4fdd\u7ba1\n\n#### \u4e0b\u8f7d\n\n```bash\npython -m BiliOpen download [-h] [-f] [-t THREAD] meta [file]\n\n# \u53c2\u6570\u8bf4\u660e:\n# meta: META URL(\u901a\u5e38\u4ee5biliopen://\u5f00\u5934)\n# file: \u53e6\u5b58\u4e3a\u65b0\u7684\u6587\u4ef6\u540d, \u4e0d\u6307\u5b9a\u5219\u4fdd\u5b58\u4e3a\u4e0a\u4f20\u65f6\u7684\u6587\u4ef6\u540d\n# -f: \u8986\u76d6\u5df2\u6709\u6587\u4ef6\n# -t THREAD: \u4e0b\u8f7d\u7ebf\u7a0b\u6570, \u9ed8\u8ba4\u503c\u4e3a8\n```\n\n\u4e0b\u8f7d\u5b8c\u6bd5\u540e\u4f1a\u81ea\u52a8\u8fdb\u884c\u6587\u4ef6\u5b8c\u6574\u6027\u6821\u9a8c\uff0c\u5bf9\u4e8e\u5927\u6587\u4ef6\u8be5\u8fc7\u7a0b\u53ef\u80fd\u9700\u8981\u8f83\u957f\u65f6\u95f4\uff0c\u82e5\u4e0d\u613f\u7b49\u5f85\u53ef\u76f4\u63a5\u9000\u51fa\n\n#### \u67e5\u770b\u6587\u4ef6\u5143\u6570\u636e\n\n```bash\npython -m BiliOpen info [-h] meta\n\n# meta: META URL(\u901a\u5e38\u4ee5biliopen://\u5f00\u5934)\n```\n\n#### \u67e5\u770b\u5386\u53f2\u8bb0\u5f55\n\n```bash\npython -m BiliOpen history [-h]\n```\n\n#### \u4ea4\u4e92\u6a21\u5f0f\n\n\u4e0d\u4f20\u5165\u4efb\u4f55\u547d\u4ee4\u884c\u53c2\u6570\uff0c\u76f4\u63a5\u8fd0\u884c\u7a0b\u5e8f\u5373\u53ef\u8fdb\u5165\u4ea4\u4e92\u6a21\u5f0f\n\n\u8be5\u6a21\u5f0f\u4e0b\uff0c\u7a0b\u5e8f\u4f1a\u6253\u5370\u547d\u4ee4\u63d0\u793a\u7b26`BiliOpen > `\uff0c\u5e76\u7b49\u5f85\u7528\u6237\u8f93\u5165\u547d\u4ee4\n\n## \u5e94\u7528\u793a\u4f8b\n\n### \u6587\u4ef6\u5907\u4efd\u5de5\u5177\n```python\nimport BiliOpen\nimport os\n\ndef backup_file(file_path):\n \"\"\"\u5907\u4efd\u5355\u4e2a\u6587\u4ef6\u5230B\u7ad9\"\"\"\n if not os.path.exists(file_path):\n print(f\"\u6587\u4ef6\u4e0d\u5b58\u5728: {file_path}\")\n return None\n \n print(f\"\u5907\u4efd\u6587\u4ef6: {file_path}\")\n meta_url = BiliOpen.upload(file_path)\n \n if meta_url:\n print(f\"\u5907\u4efd\u6210\u529f: {meta_url}\")\n return meta_url\n else:\n print(\"\u5907\u4efd\u5931\u8d25\")\n return None\n\ndef restore_file(meta_url, output_path):\n \"\"\"\u4eceB\u7ad9\u6062\u590d\u6587\u4ef6\"\"\"\n print(f\"\u6062\u590d\u6587\u4ef6\u5230: {output_path}\")\n result = BiliOpen.download(meta_url, output_path)\n \n if result:\n print(\"\u6062\u590d\u6210\u529f\")\n return result\n else:\n print(\"\u6062\u590d\u5931\u8d25\")\n return None\n\n# \u4f7f\u7528\u793a\u4f8b\nmeta_url = backup_file(\"important_document.pdf\")\nif meta_url:\n restore_file(meta_url, \"restored_document.pdf\")\n```\n\n### \u4e91\u5b58\u50a8\u670d\u52a1\n```python\nimport BiliOpen\n\nclass CloudStorage:\n def __init__(self):\n self.api = BiliOpen.BiliOpenAPI()\n \n def save(self, name: str, data: bytes) -> str:\n \"\"\"\u4fdd\u5b58\u6570\u636e\u5230\u4e91\u7aef\"\"\"\n meta_url = self.api.upload_bytes(data, name)\n if not meta_url:\n raise Exception(\"\u4fdd\u5b58\u5931\u8d25\")\n return meta_url\n \n def load(self, meta_url: str) -> bytes:\n \"\"\"\u4ece\u4e91\u7aef\u52a0\u8f7d\u6570\u636e\"\"\"\n data = self.api.download_bytes(meta_url)\n if not data:\n raise Exception(\"\u52a0\u8f7d\u5931\u8d25\")\n return data\n \n def get_info(self, meta_url: str) -> dict:\n \"\"\"\u83b7\u53d6\u6587\u4ef6\u4fe1\u606f\"\"\"\n info = self.api.get_file_info(meta_url)\n if not info:\n raise Exception(\"\u83b7\u53d6\u4fe1\u606f\u5931\u8d25\")\n return info\n\n# \u4f7f\u7528\u793a\u4f8b\nstorage = CloudStorage()\n\n# \u4fdd\u5b58\u6570\u636e\ndata = b\"Important data to store\"\nmeta_url = storage.save(\"my_data.bin\", data)\nprint(f\"\u5df2\u4fdd\u5b58: {meta_url}\")\n\n# \u52a0\u8f7d\u6570\u636e\nloaded_data = storage.load(meta_url)\nprint(f\"\u5df2\u52a0\u8f7d: {loaded_data}\")\n\n# \u83b7\u53d6\u4fe1\u606f\ninfo = storage.get_info(meta_url)\nprint(f\"\u6587\u4ef6\u4fe1\u606f: {info}\")\n```\n\n## \u6280\u672f\u5b9e\u73b0\n\n\u5c06\u4efb\u610f\u6587\u4ef6\u5206\u5757\u7f16\u7801\u4e3a\u56fe\u7247\u540e\u4e0a\u4f20\u81f3B\u7ad9\uff0c\u5bf9\u8be5\u64cd\u4f5c\u9006\u5e8f\u5373\u53ef\u4e0b\u8f7d\u5e76\u8fd8\u539f\u6587\u4ef6\n\n## \u53c2\u6570\u8c03\u4f18\u5efa\u8bae\n\n- `block_size_mb`: \u8f83\u5927\u7684\u5206\u5757\u9002\u5408\u5927\u6587\u4ef6\u548c\u826f\u597d\u7684\u7f51\u7edc\u73af\u5883\uff0c\u5efa\u8bae4-8MB\n- `thread_count`: \u589e\u52a0\u7ebf\u7a0b\u6570\u53ef\u4ee5\u63d0\u9ad8\u901f\u5ea6\uff0c\u4f46\u8fc7\u591a\u53ef\u80fd\u5bfc\u81f4\u9650\u6d41\n - \u4e0a\u4f20\u5efa\u8bae\u4f7f\u75284-8\u4e2a\u7ebf\u7a0b\n - \u4e0b\u8f7d\u5efa\u8bae\u4f7f\u75288-16\u4e2a\u7ebf\u7a0b\n\n## \u6027\u80fd\u6307\u6807\n\n### \u6d4b\u8bd5\u6587\u4ef61\n\n>\u539f\u4f5c\u8005\u6d4b\u8bd5\n\n\u6587\u4ef6\u540d\uff1a[Vmoe]Hatsune Miku\u300cMagical Mirai 2017\u300d[BDrip][1920x1080p][HEVC_YUV420p10_60fps_2FLAC_5.1ch&2.0ch_Chapter][Effect Subtitles].mkv\n\n\u5927\u5c0f\uff1a14.5 GB (14918.37 MB)\n\n\u5206\u5757\uff1a10 MB * 1492\n\nMETA URL\uff1abdrive://d28784bff1086450a6c331fb322accccd382228e\n\n### \u4e0a\u4f20\n\n\u5730\u7406\u4f4d\u7f6e\uff1a\u56db\u5ddd\u6210\u90fd\n\n\u8fd0\u8425\u5546\uff1a\u6559\u80b2\u7f51\n\n\u4e0a\u884c\u901f\u7387\uff1a20 Mbps\n\n\u7528\u65f6\uff1a02:16:39\n\n\u5e73\u5747\u901f\u5ea6\uff1a1.82 MB/s\n\n### \u4e0b\u8f7d\n\n#### \u6d4b\u8bd5\u70b91\n\n\u5730\u7406\u4f4d\u7f6e\uff1a\u798f\u5efa\u798f\u5dde\n\n\u8fd0\u8425\u5546\uff1a\u4e2d\u56fd\u7535\u4fe1\n\n\u4e0b\u884c\u901f\u7387\uff1a100 Mbps\n\n\u7528\u65f6\uff1a00:18:15\n\n\u5e73\u5747\u901f\u5ea6\uff1a13.62 MB/s\n\n#### \u6d4b\u8bd5\u70b92\n\n\u5730\u7406\u4f4d\u7f6e\uff1a\u4e0a\u6d77\n\n\u8fd0\u8425\u5546\uff1a\u4e2d\u56fd\u7535\u4fe1\n\n\u4e0b\u884c\u901f\u7387\uff1a1 Gbps\n\n\u7528\u65f6\uff1a00:02:22\n\n\u5e73\u5747\u901f\u5ea6\uff1a104.97 MB/s\n\n### \u6d4b\u8bd5\u6587\u4ef62\n\n\u6587\u4ef6\u540d\uff1atest.iso\n\n\u5927\u5c0f: 5.91 GB\n\n\u5206\u5757: 6 MB * 1009\n\nMETA URL: biliopen://96f1cad8d8674750cd6592a28b162c4e91b7e4fa\n\n### \u4e0a\u4f20\n\n\u5730\u7406\u4f4d\u7f6e\uff1a\u65b0\u52a0\u5761 microsoft.com\n\n\u8fd0\u8425\u5546\uff1aMicrosoft Azure\n\n\u5e73\u5747\u901f\u5ea6\uff1a3.06 MB/s\n\n## \u6ce8\u610f\u4e8b\u9879\n\n1. \u8bf7\u9075\u5b88B\u7ad9\u7684\u4f7f\u7528\u6761\u6b3e\uff0c\u4e0d\u8981\u4e0a\u4f20\u8fdd\u89c4\u5185\u5bb9\n2. \u5927\u6587\u4ef6\u4e0a\u4f20\u53ef\u80fd\u9700\u8981\u8f83\u957f\u65f6\u95f4\uff0c\u8bf7\u8010\u5fc3\u7b49\u5f85\n3. \u5efa\u8bae\u5b9a\u671f\u5907\u4efd\u91cd\u8981\u7684META URL\n4. Cookie\u6709\u6548\u671f\u6709\u9650\uff0c\u5931\u6548\u65f6\u9700\u8981\u91cd\u65b0\u83b7\u53d6\n5. \u8bf7\u81ea\u884c\u5bf9\u91cd\u8981\u6587\u4ef6\u505a\u597d\u672c\u5730\u5907\u4efd\n\n## \u514d\u8d23\u58f0\u660e\n\n\u8bf7\u81ea\u884c\u5bf9\u91cd\u8981\u6587\u4ef6\u505a\u597d\u672c\u5730\u5907\u4efd\n\n\u8bf7\u52ff\u4f7f\u7528\u672c\u9879\u76ee\u4e0a\u4f20\u4e0d\u7b26\u5408\u793e\u4f1a\u4e3b\u4e49\u6838\u5fc3\u4ef7\u503c\u89c2\u7684\u6587\u4ef6\n\n\u8bf7\u5408\u7406\u4f7f\u7528\u672c\u9879\u76ee\uff0c\u907f\u514d\u5bf9\u54d4\u54e9\u54d4\u54e9\u7684\u5b58\u50a8\u4e0e\u5e26\u5bbd\u8d44\u6e90\u9020\u6210\u65e0\u610f\u4e49\u7684\u6d6a\u8d39\n\n\u8be5\u9879\u76ee\u4ec5\u7528\u4e8e\u5b66\u4e60\u548c\u6280\u672f\u4ea4\u6d41\uff0c\u5f00\u53d1\u8005\u4e0d\u627f\u62c5\u4efb\u4f55\u7531\u4f7f\u7528\u8005\u7684\u884c\u4e3a\u5e26\u6765\u7684\u6cd5\u5f8b\u8d23\u4efb\n\n## \u8bb8\u53ef\u8bc1\n\nBiliOpen is under The Star And Thank Author License (SATA)\n\n\u672c\u9879\u76ee\u57fa\u4e8eMIT\u534f\u8bae\u53d1\u5e03\uff0c\u5e76\u589e\u52a0\u4e86SATA\u534f\u8bae\n\n\u60a8\u6709\u4e49\u52a1\u4e3a\u6b64\u5f00\u6e90\u9879\u76ee\u70b9\u8d5e\uff0c\u5e76\u8003\u8651\u989d\u5916\u7ed9\u4e88\u4f5c\u8005\u9002\u5f53\u7684\u5956\u52b1 \u2220( \u141b \u300d\u2220)\uff3f\n",
"bugtrack_url": null,
"license": null,
"summary": "\u2601\ufe0f \u54d4\u54e9\u5f00\u653e\u4e91\uff0c\u652f\u6301\u4efb\u610f\u6587\u4ef6\u7684\u5168\u901f\u4e0a\u4f20\u4e0e\u4e0b\u8f7d",
"version": "2.0.1",
"project_urls": {
"Homepage": "https://github.com/Wodlie/BiliOpen"
},
"split_keywords": [
"bilibili",
" cloud",
" disk",
" drive",
" storage",
" pan",
" yun",
" b\u7ad9",
" \u54d4\u54e9\u54d4\u54e9",
" \u7f51\u76d8"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "9783b2a22d8d7e5c9c9cdc46cae436be80bdfb2b195ac21204ce56a039761d5f",
"md5": "07521cbdff9032dbfc5a26e1e1cfc0d9",
"sha256": "b5b6b076124ca0fe67724c89304abdccc27d3a1c8eadc5b1af76987018ff3487"
},
"downloads": -1,
"filename": "biliopen-2.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "07521cbdff9032dbfc5a26e1e1cfc0d9",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 21304,
"upload_time": "2025-08-06T01:33:14",
"upload_time_iso_8601": "2025-08-06T01:33:14.451670Z",
"url": "https://files.pythonhosted.org/packages/97/83/b2a22d8d7e5c9c9cdc46cae436be80bdfb2b195ac21204ce56a039761d5f/biliopen-2.0.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "82848c7b8497a54fc22dcf0eafd4691086e3d5898d17cb402cddee69d1cbd507",
"md5": "6230c4871634af5f62b18ee838d94d3f",
"sha256": "d970835c79a949eb685a897de12e75020bc60fbad79468e3da88626e21d872b0"
},
"downloads": -1,
"filename": "biliopen-2.0.1.tar.gz",
"has_sig": false,
"md5_digest": "6230c4871634af5f62b18ee838d94d3f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 17786,
"upload_time": "2025-08-06T01:33:15",
"upload_time_iso_8601": "2025-08-06T01:33:15.827119Z",
"url": "https://files.pythonhosted.org/packages/82/84/8c7b8497a54fc22dcf0eafd4691086e3d5898d17cb402cddee69d1cbd507/biliopen-2.0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-06 01:33:15",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Wodlie",
"github_project": "BiliOpen",
"travis_ci": true,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "requests",
"specs": []
},
{
"name": "Pillow",
"specs": []
},
{
"name": "numpy",
"specs": []
}
],
"lcname": "biliopen"
}