BiliOpen


NameBiliOpen JSON
Version 2.0.1 PyPI version JSON
download
home_pagehttps://github.com/Wodlie/BiliOpen
Summary☁️ 哔哩开放云,支持任意文件的全速上传与下载
upload_time2025-08-06 01:33:15
maintainerNone
docs_urlNone
authorHsury & Wodlie
requires_python>=3.6
licenseNone
keywords bilibili cloud disk drive storage pan yun b站 哔哩哔哩 网盘
VCS
bugtrack_url
requirements requests Pillow numpy
Travis-CI
coveralls test coverage No coveralls.
            >由于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"
}
        
Elapsed time: 0.65609s