viperadnan-git/transferit-py
GitHub: viperadnan-git/transferit-py
一个纯 Python 的客户端,通过 transfer.it 服务实现无需浏览器与账户的文件加密上传与下载。
Stars: 0 | Forks: 0
transferit
从 Python 或终端上传和下载文件到 transfer.it —— 无需浏览器、无需 MEGA 账户、无需外部 CLI 工具。
```
from transferit import Transferit
with Transferit() as tx:
url = tx.upload("report.pdf").url # → https://transfer.it/t/…
```
- **端到端加密** — AES-128-CTR + CBC-MAC,方案与官方 Web 客户端相同。
- **并发 WebSocket 上传** — 每个文件最多 8 个连接,与 MEGA 的 `ulDefConcurrency` 匹配。
- **流式下载 + 解密** — 通过 `httpx.stream`,内存占用恒定,与文件大小无关。
- **文件夹** — 递归上传,保留双向层级结构。
- **每个表单字段均已连接** — 标题、消息、密码、发件人、过期时间、到期通知、最大下载次数、收件人、定时投递。
- **丰富的 CLI 与库 API** — 同一套四个动词(`upload` / `download` / `info` / `metadata`)在两种界面中通用,并通过 `--json` 全面支持脚本化。
## 安装
| 使用场景 | 命令 |
|---|---|
| 仅库 | `pip install transferit-py` |
| 库 **+** CLI | `pip install 'transferit-py[cli]'` |
需要 **Python 3.11+**。`uv add transferit-py` / `uv add 'transferit-py[cli]'` 同样适用。
## CLI
| 命令 | 用途 |
|---|---|
| `transferit upload PATH` | 上传文件或文件夹并打印分享链接 |
| `transferit download LINK` | 将传输镜像到本地目录 |
| `transferit info LINK` | 元数据面板 + 文件/文件夹树 |
| `transferit metadata LINK` | 仅元数据面板 |
每个命令均支持 `--json` 以输出机器可读数据。`LINK` 可以是完整分享 URL 或 12 位标识符。
```
# 最简单 — 单文件,无选项
transferit upload report.pdf
# 文件夹上传,7 天过期
transferit upload ./project -e 7d --sender me@example.com
# 完整的“发送文件”模式
transferit upload big.mp4 \
--title "Q1 demo" --message "review please" \
--password hunter2 --sender me@example.com \
--expiry 7d --notify-expiry \
--max-downloads 50 \
-r alice@example.com -r bob@example.com \
--schedule 2026-04-25T09:00
```
`--expiry` 接受从 `1s` 到 `10y` 的任意时长:`30s`、`5m`、`2h`、`7d`、`1w`、`1y` 或类似组合形式,如 `1y6m3d`。运行 `transferit
--help` 查看完整标志列表。
## 库
整个界面封装在单一类中 —— **`Transferit`**。一个实例拥有一个 HTTP 连接池,并在需要时(写操作)惰性地创建一个匿名临时 MEGA 账户,该账户在所有写操作中重复使用。
```
from transferit import Transferit
with Transferit(default_sender="me@example.com", default_expiry="7d") as tx:
result = tx.upload("./q1.pdf", title="Quarterly report")
# => UploadResult(xh=…, url=…, title=…, total_bytes=…, file_count=1, folder_count=0)
meta = tx.metadata(result.url) # → TransferInfo
nodes = tx.info(result.url) # → list[TransferNode]
tx.download(result.url, "./dl") # → DownloadResult
```
| 方法 | 返回值 | 需要会话? |
|---|---|---|
| `tx.upload(path, **opts)` | `UploadResult` | 是(惰性创建) |
| `tx.download(link, dir, **opts)` | `DownloadResult` | 否 |
| `tx.info(link, password=…)` | `list[TransferNode]` | 否 |
| `tx.metadata(link, password=…)` | `TransferInfo` | 否 |
**`upload()`** 接受所有网页表单字段作为关键字参数 —— `title`、`message`、`password`、`sender`、`expiry`(秒数或持续时间字符串)、`notify_expiry`、`max_downloads`、`recipients`、`schedule`、`concurrency` 以及三个进度回调(`on_progress`、`on_file_start`、`on_file_done`)。
### 类型化返回值
`TransferInfo`、`TransferNode`、`UploadResult`、`DownloadResult` 是冻结的数据类。每个对象都提供 `.to_json_dict()` 用于序列化;`TransferNode` 还暴露 `.is_file` / `.is_folder`。原始服务器响应保留在 `.raw` 中作为应急通道。
```
meta = tx.metadata(url)
print(meta.title, meta.total_bytes, meta.password_protected)
```
### 进度钩子
```
def on_progress(sent: int, total: int) -> None:
print(f"{sent/total:6.1%} {sent:>12,} / {total:,} bytes")
tx.upload("./big.mp4", on_progress=on_progress)
```
`tx.download` 提供更丰富的回调:`on_start`、`on_file_start`、`on_file_progress`、`on_file_done`、`on_skip`。
### 默认值
`Transferit(default_sender=…, default_expiry=…, default_concurrency=…)` —— 未提供每调用参数时将使用这些默认值。
### 低级访问
高级调用者可直接使用 `MegaAPI` —— 每个 MEGA 命令(`create_ephemeral_session`、`create_transfer`、`fetch_transfer`、`set_transfer_attributes` 等)都是其方法。通过 `Transferit(api=MegaAPI(...))` 注入,可用于测试或固定到备用端点。
## 工作原理
transfer.it 是构建在 MEGA 的 `bt7` API 集群之上的轻量白标层。每次上传都会启动一个匿名临时 MEGA 账户,创建一个传输容器,通过 WebSocket 以 AES-128-CTR 加密流式传输数据块(带有 CBC-MAC 完整性校验),并经由专有的 `x*` 命令族最终化节点列表。完整协议参考(API 动词、加密方案、WebSocket 帧结构、密码派生)位于 [`docs/REVERSE_ENGINEERING.md`](docs/REVERSE_ENGINEERING.md)。
## 许可证
MIT —— 参见 [`LICENSE`](LICENSE)。
## 免责声明
**transferit 是一个独立、社区维护的项目。** 它
不
隶属于、 endorsed by、赞助或与
MEGA Limited、transfer.it 或其任何子公司有关联。所有产品名称、标志和品牌均为其各自所有者财产。
本项目通过重新实现官方 Web 客户端分发给每个访问者的公开 JavaScript 来与 transfer.it 互操作 —— 不使用专有 SDK、不使用私有端点、不规避任何访问控制。协议说明文档在
[`docs/REVERSE_ENGINEERING.md`](docs/REVERSE_ENGINEERING.md)
中提供,**仅供教育和互操作性使用**。
**在使用 transferit 前**,请确保您的使用符合:
- [transfer.it 的服务条款](https://transfer.it/terms)
- [MEGA 的服务条款](https://mega.io/terms)
- 适用于您的任何出口管制、数据保护或本地法律
您独自承担通过此库上传的内容和访问的传输。维护者不对误用、数据丢失、服务中断、账户终止或由此软件产生的任何其他后果承担责任。软件按“原样”提供,不附带任何形式的担保 —— 完整法律文本请参见 [`LICENSE`](LICENSE)。
如果您是权利人并认为此项目侵犯了您的权利,请在采取任何其他行动之前向项目仓库提交问题 —— 大多数问题可以直接解决。标签:AES-128-CTR, API安全, CBC-MAC, JSON输出, MEGA, pip, PyPI, Python, Python 3.11+, SEO: transfer.it, SEO: transferit-py, transfer.it, uv, WebSocket, 上传, 下载, 依赖分析, 元数据, 功能: download, 功能: info, 功能: metadata, 功能: upload, 动态分析, 客户端, 并发上传, 库API, 开源, 技术栈: Python, 文件传输, 无后门, 无浏览器, 无账户, 无需外部CLI, 流式下载, 流解密, 端到端加密, 纯Python, 网络调试, 脚本化, 自动化, 表单字段, 运行时操纵, 逆向工具, 递归文件夹