Name | qnshare JSON |
Version |
0.1.0
JSON |
| download |
home_page | None |
Summary | 七牛云文件共享工具 - 一个简单易用的七牛云存储命令行工具 |
upload_time | 2025-08-01 13:36:03 |
maintainer | None |
docs_url | None |
author | wmymz |
requires_python | >=3.8 |
license | None |
keywords |
qiniu
cloud
storage
file-sharing
cli
|
VCS |
 |
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# QnShare - 七牛云文件共享工具
一个简单易用的七牛云存储命令行工具,支持文件上传、下载、管理等功能。
## 特性
- 🚀 现代化的命令行界面
- 🔒 安全的配置管理(配置文件存储在用户目录)
- 📁 支持文件上传、下载、删除等操作
- 🌐 支持离线下载网络文件
- 🔄 支持CDN刷新
- 🔗 支持生成下载链接和防盗链
- 📦 可作为uv tool安装
## 安装
### 使用 uv(推荐)
```bash
# 作为工具安装
uv tool install qnshare
# 或者从本地安装
uv tool install .
```
### 使用 pip
```bash
pip install qnshare
```
## 快速开始
### 1. 初始化配置
首次使用需要配置七牛云的Access Key和Secret Key:
```bash
qnshare init
```
按提示输入您的七牛云密钥信息。配置文件将安全地存储在 `~/.qn/config.json`。
### 2. 基本使用
```bash
# 列出云端文件
qnshare list
# 上传文件
qnshare upload file1.txt file2.jpg
# 下载文件
qnshare download file1.txt
# 离线下载网络文件
qnshare fetch https://example.com/file.zip
# 删除文件
qnshare delete file1.txt
# 刷新CDN
qnshare refresh file1.txt
# 获取下载链接
qnshare link file1.txt
# 获取防盗链(带时间戳,会自动生成加密密钥)
qnshare link file1.txt --timestamp
# 手动设置防盗链加密密钥(可选)
qnshare config --set-encrypt-key
# 重新生成随机加密密钥(可选)
qnshare config --generate-encrypt-key
# 配置存储空间和域名(可选)
qnshare config --list-buckets # 列出可用存储空间
qnshare config --set-bucket my-bucket # 设置存储空间
qnshare config --list-domains my-bucket # 列出域名
qnshare config --set-domain my.domain.com # 设置域名
# 启动交互式模式(类似原版体验)
qnshare interactive
# 或使用简写
qnshare -i
```
## 命令详解
### `qnshare init`
初始化配置,设置七牛云的Access Key、Secret Key等信息。
### `qnshare config [OPTIONS]`
显示或修改当前配置(敏感信息会被隐藏)。
选项:
- `--set-encrypt-key`: 设置防盗链加密密钥
- `--generate-encrypt-key`: 生成新的随机加密密钥
- `--set-bucket <name>`: 设置存储空间名称
- `--set-domain <domain>`: 设置绑定域名
- `--list-buckets`: 列出可用的存储空间
- `--list-domains <bucket>`: 列出指定存储空间的绑定域名
### `qnshare list [--prefix PREFIX]`
列出云端文件,可选择指定前缀过滤。
### `qnshare upload FILES... [--delete-after DAYS]`
上传一个或多个本地文件,可设置自动删除时间。
### `qnshare download FILENAME [--output OUTPUT]`
下载云端文件到本地,可指定输出文件名。
### `qnshare fetch URL [--name NAME] [--delete-after DAYS] [--no-download]`
离线下载网络文件到云端,默认同时下载到本地。
### `qnshare delete FILENAME`
删除云端文件(需要确认)。
### `qnshare refresh FILENAME`
刷新文件的CDN缓存。
### `qnshare link FILENAME [--timestamp]`
获取文件下载链接,可选择生成带时间戳的防盗链。
### `qnshare interactive` 或 `qnshare -i`
启动交互式模式,提供类似原版qn.py的命令行体验。
在交互式模式中可用的命令:
- `l` 或 `list` - 列出文件
- `p` 或 `upload` - 上传文件(支持文件选择对话框)
- `g <filename>` 或 `download <filename>` - 下载文件
- `s <url>` 或 `fetch <url>` - 离线下载
- `d <filename>` 或 `delete <filename>` - 删除文件
- `r <filename>` 或 `refresh <filename>` - 刷新CDN
- `link <filename>` - 获取文件链接
- `config` - 显示配置信息
- `help` - 显示帮助
- `exit` 或 `q` - 退出
## 配置文件
配置文件位于 `~/.qn/config.json`,包含以下字段:
```json
{
"access_key": "your_access_key",
"secret_key": "your_secret_key",
"encrypt_key": "your_encrypt_key",
"prefix": "share/",
"dead_time": 3600,
"bucket_name": null,
"domain": null
}
```
- `access_key`: 七牛云Access Key(必需)
- `secret_key`: 七牛云Secret Key(必需)
- `encrypt_key`: 防盗链加密密钥(可选,留空时会在需要时自动生成)
- `prefix`: 文件前缀,默认为 "share/"
- `dead_time`: 防盗链有效期(秒),默认3600秒
- `bucket_name`: 存储空间名称(可手动设置,留空则自动获取第一个)
- `domain`: 绑定域名(可手动设置,留空则自动获取第一个)
## 编程接口
除了命令行工具,您也可以在Python代码中使用:
```python
from qnshare import QiniuClient, init_config
# 初始化配置(仅需一次)
init_config(
access_key="your_access_key",
secret_key="your_secret_key"
)
# 创建客户端
client = QiniuClient()
# 上传文件
remote_name = client.upload_local_file("local_file.txt")
# 获取下载链接
download_url = client.get_download_link(remote_name)
# 列出文件
files = client.get_file_list()
```
## 迁移指南
如果您之前使用的是旧版本的qn.py,请注意:
1. **配置方式变更**:不再使用硬编码的密钥,需要运行 `qnshare init` 进行配置
2. **命令行界面**:新的CLI命令替代了原有的交互式shell
3. **API变更**:建议使用新的 `QiniuClient` 类替代旧的 `Qiniu` 类
旧的接口仍然可用但已标记为弃用,建议尽快迁移到新接口。
## 安全注意事项
- 配置文件会自动设置适当的权限(仅用户可读写)
- 不要在代码中硬编码密钥信息
- 定期检查和更新您的七牛云密钥
## 许可证
MIT License
## 贡献
欢迎提交Issue和Pull Request!
Raw data
{
"_id": null,
"home_page": null,
"name": "qnshare",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "qiniu, cloud, storage, file-sharing, cli",
"author": "wmymz",
"author_email": "wmymz <wmymz@icloud.com>",
"download_url": "https://files.pythonhosted.org/packages/02/6e/c486db12bac3f8a667e993adc54bcb1d60303e25377c232b3dfb0ad3eb11/qnshare-0.1.0.tar.gz",
"platform": null,
"description": "# QnShare - \u4e03\u725b\u4e91\u6587\u4ef6\u5171\u4eab\u5de5\u5177\r\n\r\n\u4e00\u4e2a\u7b80\u5355\u6613\u7528\u7684\u4e03\u725b\u4e91\u5b58\u50a8\u547d\u4ee4\u884c\u5de5\u5177\uff0c\u652f\u6301\u6587\u4ef6\u4e0a\u4f20\u3001\u4e0b\u8f7d\u3001\u7ba1\u7406\u7b49\u529f\u80fd\u3002\r\n\r\n## \u7279\u6027\r\n\r\n- \ud83d\ude80 \u73b0\u4ee3\u5316\u7684\u547d\u4ee4\u884c\u754c\u9762\r\n- \ud83d\udd12 \u5b89\u5168\u7684\u914d\u7f6e\u7ba1\u7406\uff08\u914d\u7f6e\u6587\u4ef6\u5b58\u50a8\u5728\u7528\u6237\u76ee\u5f55\uff09\r\n- \ud83d\udcc1 \u652f\u6301\u6587\u4ef6\u4e0a\u4f20\u3001\u4e0b\u8f7d\u3001\u5220\u9664\u7b49\u64cd\u4f5c\r\n- \ud83c\udf10 \u652f\u6301\u79bb\u7ebf\u4e0b\u8f7d\u7f51\u7edc\u6587\u4ef6\r\n- \ud83d\udd04 \u652f\u6301CDN\u5237\u65b0\r\n- \ud83d\udd17 \u652f\u6301\u751f\u6210\u4e0b\u8f7d\u94fe\u63a5\u548c\u9632\u76d7\u94fe\r\n- \ud83d\udce6 \u53ef\u4f5c\u4e3auv tool\u5b89\u88c5\r\n\r\n## \u5b89\u88c5\r\n\r\n### \u4f7f\u7528 uv\uff08\u63a8\u8350\uff09\r\n\r\n```bash\r\n# \u4f5c\u4e3a\u5de5\u5177\u5b89\u88c5\r\nuv tool install qnshare\r\n\r\n# \u6216\u8005\u4ece\u672c\u5730\u5b89\u88c5\r\nuv tool install .\r\n```\r\n\r\n### \u4f7f\u7528 pip\r\n\r\n```bash\r\npip install qnshare\r\n```\r\n\r\n## \u5feb\u901f\u5f00\u59cb\r\n\r\n### 1. \u521d\u59cb\u5316\u914d\u7f6e\r\n\r\n\u9996\u6b21\u4f7f\u7528\u9700\u8981\u914d\u7f6e\u4e03\u725b\u4e91\u7684Access Key\u548cSecret Key\uff1a\r\n\r\n```bash\r\nqnshare init\r\n```\r\n\r\n\u6309\u63d0\u793a\u8f93\u5165\u60a8\u7684\u4e03\u725b\u4e91\u5bc6\u94a5\u4fe1\u606f\u3002\u914d\u7f6e\u6587\u4ef6\u5c06\u5b89\u5168\u5730\u5b58\u50a8\u5728 `~/.qn/config.json`\u3002\r\n\r\n### 2. \u57fa\u672c\u4f7f\u7528\r\n\r\n```bash\r\n# \u5217\u51fa\u4e91\u7aef\u6587\u4ef6\r\nqnshare list\r\n\r\n# \u4e0a\u4f20\u6587\u4ef6\r\nqnshare upload file1.txt file2.jpg\r\n\r\n# \u4e0b\u8f7d\u6587\u4ef6\r\nqnshare download file1.txt\r\n\r\n# \u79bb\u7ebf\u4e0b\u8f7d\u7f51\u7edc\u6587\u4ef6\r\nqnshare fetch https://example.com/file.zip\r\n\r\n# \u5220\u9664\u6587\u4ef6\r\nqnshare delete file1.txt\r\n\r\n# \u5237\u65b0CDN\r\nqnshare refresh file1.txt\r\n\r\n# \u83b7\u53d6\u4e0b\u8f7d\u94fe\u63a5\r\nqnshare link file1.txt\r\n\r\n# \u83b7\u53d6\u9632\u76d7\u94fe\uff08\u5e26\u65f6\u95f4\u6233\uff0c\u4f1a\u81ea\u52a8\u751f\u6210\u52a0\u5bc6\u5bc6\u94a5\uff09\r\nqnshare link file1.txt --timestamp\r\n\r\n# \u624b\u52a8\u8bbe\u7f6e\u9632\u76d7\u94fe\u52a0\u5bc6\u5bc6\u94a5\uff08\u53ef\u9009\uff09\r\nqnshare config --set-encrypt-key\r\n\r\n# \u91cd\u65b0\u751f\u6210\u968f\u673a\u52a0\u5bc6\u5bc6\u94a5\uff08\u53ef\u9009\uff09\r\nqnshare config --generate-encrypt-key\r\n\r\n# \u914d\u7f6e\u5b58\u50a8\u7a7a\u95f4\u548c\u57df\u540d\uff08\u53ef\u9009\uff09\r\nqnshare config --list-buckets # \u5217\u51fa\u53ef\u7528\u5b58\u50a8\u7a7a\u95f4\r\nqnshare config --set-bucket my-bucket # \u8bbe\u7f6e\u5b58\u50a8\u7a7a\u95f4\r\nqnshare config --list-domains my-bucket # \u5217\u51fa\u57df\u540d\r\nqnshare config --set-domain my.domain.com # \u8bbe\u7f6e\u57df\u540d\r\n\r\n# \u542f\u52a8\u4ea4\u4e92\u5f0f\u6a21\u5f0f\uff08\u7c7b\u4f3c\u539f\u7248\u4f53\u9a8c\uff09\r\nqnshare interactive\r\n# \u6216\u4f7f\u7528\u7b80\u5199\r\nqnshare -i\r\n```\r\n\r\n## \u547d\u4ee4\u8be6\u89e3\r\n\r\n### `qnshare init`\r\n\u521d\u59cb\u5316\u914d\u7f6e\uff0c\u8bbe\u7f6e\u4e03\u725b\u4e91\u7684Access Key\u3001Secret Key\u7b49\u4fe1\u606f\u3002\r\n\r\n### `qnshare config [OPTIONS]`\r\n\u663e\u793a\u6216\u4fee\u6539\u5f53\u524d\u914d\u7f6e\uff08\u654f\u611f\u4fe1\u606f\u4f1a\u88ab\u9690\u85cf\uff09\u3002\r\n\r\n\u9009\u9879\uff1a\r\n- `--set-encrypt-key`: \u8bbe\u7f6e\u9632\u76d7\u94fe\u52a0\u5bc6\u5bc6\u94a5\r\n- `--generate-encrypt-key`: \u751f\u6210\u65b0\u7684\u968f\u673a\u52a0\u5bc6\u5bc6\u94a5\r\n- `--set-bucket <name>`: \u8bbe\u7f6e\u5b58\u50a8\u7a7a\u95f4\u540d\u79f0\r\n- `--set-domain <domain>`: \u8bbe\u7f6e\u7ed1\u5b9a\u57df\u540d\r\n- `--list-buckets`: \u5217\u51fa\u53ef\u7528\u7684\u5b58\u50a8\u7a7a\u95f4\r\n- `--list-domains <bucket>`: \u5217\u51fa\u6307\u5b9a\u5b58\u50a8\u7a7a\u95f4\u7684\u7ed1\u5b9a\u57df\u540d\r\n\r\n### `qnshare list [--prefix PREFIX]`\r\n\u5217\u51fa\u4e91\u7aef\u6587\u4ef6\uff0c\u53ef\u9009\u62e9\u6307\u5b9a\u524d\u7f00\u8fc7\u6ee4\u3002\r\n\r\n### `qnshare upload FILES... [--delete-after DAYS]`\r\n\u4e0a\u4f20\u4e00\u4e2a\u6216\u591a\u4e2a\u672c\u5730\u6587\u4ef6\uff0c\u53ef\u8bbe\u7f6e\u81ea\u52a8\u5220\u9664\u65f6\u95f4\u3002\r\n\r\n### `qnshare download FILENAME [--output OUTPUT]`\r\n\u4e0b\u8f7d\u4e91\u7aef\u6587\u4ef6\u5230\u672c\u5730\uff0c\u53ef\u6307\u5b9a\u8f93\u51fa\u6587\u4ef6\u540d\u3002\r\n\r\n### `qnshare fetch URL [--name NAME] [--delete-after DAYS] [--no-download]`\r\n\u79bb\u7ebf\u4e0b\u8f7d\u7f51\u7edc\u6587\u4ef6\u5230\u4e91\u7aef\uff0c\u9ed8\u8ba4\u540c\u65f6\u4e0b\u8f7d\u5230\u672c\u5730\u3002\r\n\r\n### `qnshare delete FILENAME`\r\n\u5220\u9664\u4e91\u7aef\u6587\u4ef6\uff08\u9700\u8981\u786e\u8ba4\uff09\u3002\r\n\r\n### `qnshare refresh FILENAME`\r\n\u5237\u65b0\u6587\u4ef6\u7684CDN\u7f13\u5b58\u3002\r\n\r\n### `qnshare link FILENAME [--timestamp]`\r\n\u83b7\u53d6\u6587\u4ef6\u4e0b\u8f7d\u94fe\u63a5\uff0c\u53ef\u9009\u62e9\u751f\u6210\u5e26\u65f6\u95f4\u6233\u7684\u9632\u76d7\u94fe\u3002\r\n\r\n### `qnshare interactive` \u6216 `qnshare -i`\r\n\u542f\u52a8\u4ea4\u4e92\u5f0f\u6a21\u5f0f\uff0c\u63d0\u4f9b\u7c7b\u4f3c\u539f\u7248qn.py\u7684\u547d\u4ee4\u884c\u4f53\u9a8c\u3002\r\n\r\n\u5728\u4ea4\u4e92\u5f0f\u6a21\u5f0f\u4e2d\u53ef\u7528\u7684\u547d\u4ee4\uff1a\r\n- `l` \u6216 `list` - \u5217\u51fa\u6587\u4ef6\r\n- `p` \u6216 `upload` - \u4e0a\u4f20\u6587\u4ef6\uff08\u652f\u6301\u6587\u4ef6\u9009\u62e9\u5bf9\u8bdd\u6846\uff09\r\n- `g <filename>` \u6216 `download <filename>` - \u4e0b\u8f7d\u6587\u4ef6\r\n- `s <url>` \u6216 `fetch <url>` - \u79bb\u7ebf\u4e0b\u8f7d\r\n- `d <filename>` \u6216 `delete <filename>` - \u5220\u9664\u6587\u4ef6\r\n- `r <filename>` \u6216 `refresh <filename>` - \u5237\u65b0CDN\r\n- `link <filename>` - \u83b7\u53d6\u6587\u4ef6\u94fe\u63a5\r\n- `config` - \u663e\u793a\u914d\u7f6e\u4fe1\u606f\r\n- `help` - \u663e\u793a\u5e2e\u52a9\r\n- `exit` \u6216 `q` - \u9000\u51fa\r\n\r\n## \u914d\u7f6e\u6587\u4ef6\r\n\r\n\u914d\u7f6e\u6587\u4ef6\u4f4d\u4e8e `~/.qn/config.json`\uff0c\u5305\u542b\u4ee5\u4e0b\u5b57\u6bb5\uff1a\r\n\r\n```json\r\n{\r\n \"access_key\": \"your_access_key\",\r\n \"secret_key\": \"your_secret_key\",\r\n \"encrypt_key\": \"your_encrypt_key\",\r\n \"prefix\": \"share/\",\r\n \"dead_time\": 3600,\r\n \"bucket_name\": null,\r\n \"domain\": null\r\n}\r\n```\r\n\r\n- `access_key`: \u4e03\u725b\u4e91Access Key\uff08\u5fc5\u9700\uff09\r\n- `secret_key`: \u4e03\u725b\u4e91Secret Key\uff08\u5fc5\u9700\uff09\r\n- `encrypt_key`: \u9632\u76d7\u94fe\u52a0\u5bc6\u5bc6\u94a5\uff08\u53ef\u9009\uff0c\u7559\u7a7a\u65f6\u4f1a\u5728\u9700\u8981\u65f6\u81ea\u52a8\u751f\u6210\uff09\r\n- `prefix`: \u6587\u4ef6\u524d\u7f00\uff0c\u9ed8\u8ba4\u4e3a \"share/\"\r\n- `dead_time`: \u9632\u76d7\u94fe\u6709\u6548\u671f\uff08\u79d2\uff09\uff0c\u9ed8\u8ba43600\u79d2\r\n- `bucket_name`: \u5b58\u50a8\u7a7a\u95f4\u540d\u79f0\uff08\u53ef\u624b\u52a8\u8bbe\u7f6e\uff0c\u7559\u7a7a\u5219\u81ea\u52a8\u83b7\u53d6\u7b2c\u4e00\u4e2a\uff09\r\n- `domain`: \u7ed1\u5b9a\u57df\u540d\uff08\u53ef\u624b\u52a8\u8bbe\u7f6e\uff0c\u7559\u7a7a\u5219\u81ea\u52a8\u83b7\u53d6\u7b2c\u4e00\u4e2a\uff09\r\n\r\n## \u7f16\u7a0b\u63a5\u53e3\r\n\r\n\u9664\u4e86\u547d\u4ee4\u884c\u5de5\u5177\uff0c\u60a8\u4e5f\u53ef\u4ee5\u5728Python\u4ee3\u7801\u4e2d\u4f7f\u7528\uff1a\r\n\r\n```python\r\nfrom qnshare import QiniuClient, init_config\r\n\r\n# \u521d\u59cb\u5316\u914d\u7f6e\uff08\u4ec5\u9700\u4e00\u6b21\uff09\r\ninit_config(\r\n access_key=\"your_access_key\",\r\n secret_key=\"your_secret_key\"\r\n)\r\n\r\n# \u521b\u5efa\u5ba2\u6237\u7aef\r\nclient = QiniuClient()\r\n\r\n# \u4e0a\u4f20\u6587\u4ef6\r\nremote_name = client.upload_local_file(\"local_file.txt\")\r\n\r\n# \u83b7\u53d6\u4e0b\u8f7d\u94fe\u63a5\r\ndownload_url = client.get_download_link(remote_name)\r\n\r\n# \u5217\u51fa\u6587\u4ef6\r\nfiles = client.get_file_list()\r\n```\r\n\r\n## \u8fc1\u79fb\u6307\u5357\r\n\r\n\u5982\u679c\u60a8\u4e4b\u524d\u4f7f\u7528\u7684\u662f\u65e7\u7248\u672c\u7684qn.py\uff0c\u8bf7\u6ce8\u610f\uff1a\r\n\r\n1. **\u914d\u7f6e\u65b9\u5f0f\u53d8\u66f4**\uff1a\u4e0d\u518d\u4f7f\u7528\u786c\u7f16\u7801\u7684\u5bc6\u94a5\uff0c\u9700\u8981\u8fd0\u884c `qnshare init` \u8fdb\u884c\u914d\u7f6e\r\n2. **\u547d\u4ee4\u884c\u754c\u9762**\uff1a\u65b0\u7684CLI\u547d\u4ee4\u66ff\u4ee3\u4e86\u539f\u6709\u7684\u4ea4\u4e92\u5f0fshell\r\n3. **API\u53d8\u66f4**\uff1a\u5efa\u8bae\u4f7f\u7528\u65b0\u7684 `QiniuClient` \u7c7b\u66ff\u4ee3\u65e7\u7684 `Qiniu` \u7c7b\r\n\r\n\u65e7\u7684\u63a5\u53e3\u4ecd\u7136\u53ef\u7528\u4f46\u5df2\u6807\u8bb0\u4e3a\u5f03\u7528\uff0c\u5efa\u8bae\u5c3d\u5feb\u8fc1\u79fb\u5230\u65b0\u63a5\u53e3\u3002\r\n\r\n## \u5b89\u5168\u6ce8\u610f\u4e8b\u9879\r\n\r\n- \u914d\u7f6e\u6587\u4ef6\u4f1a\u81ea\u52a8\u8bbe\u7f6e\u9002\u5f53\u7684\u6743\u9650\uff08\u4ec5\u7528\u6237\u53ef\u8bfb\u5199\uff09\r\n- \u4e0d\u8981\u5728\u4ee3\u7801\u4e2d\u786c\u7f16\u7801\u5bc6\u94a5\u4fe1\u606f\r\n- \u5b9a\u671f\u68c0\u67e5\u548c\u66f4\u65b0\u60a8\u7684\u4e03\u725b\u4e91\u5bc6\u94a5\r\n\r\n## \u8bb8\u53ef\u8bc1\r\n\r\nMIT License\r\n\r\n## \u8d21\u732e\r\n\r\n\u6b22\u8fce\u63d0\u4ea4Issue\u548cPull Request\uff01",
"bugtrack_url": null,
"license": null,
"summary": "\u4e03\u725b\u4e91\u6587\u4ef6\u5171\u4eab\u5de5\u5177 - \u4e00\u4e2a\u7b80\u5355\u6613\u7528\u7684\u4e03\u725b\u4e91\u5b58\u50a8\u547d\u4ee4\u884c\u5de5\u5177",
"version": "0.1.0",
"project_urls": {
"Homepage": "https://github.com/qy527145/qnshare",
"Issues": "https://github.com/qy527145/qnshare/issues",
"Repository": "https://github.com/qy527145/qnshare"
},
"split_keywords": [
"qiniu",
" cloud",
" storage",
" file-sharing",
" cli"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "e30518432f9585ec22b4431bd0aac3652bf5e4b4695c9cbe27ad2aa590604446",
"md5": "308f4d497bd30dda8753fbab5b8b27d1",
"sha256": "ead03483eb7c8c00d9df3eb3fb9fca8d4c8c34a0b415fe73c9185ec277ec77b0"
},
"downloads": -1,
"filename": "qnshare-0.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "308f4d497bd30dda8753fbab5b8b27d1",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 22219,
"upload_time": "2025-08-01T13:36:01",
"upload_time_iso_8601": "2025-08-01T13:36:01.872240Z",
"url": "https://files.pythonhosted.org/packages/e3/05/18432f9585ec22b4431bd0aac3652bf5e4b4695c9cbe27ad2aa590604446/qnshare-0.1.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "026ec486db12bac3f8a667e993adc54bcb1d60303e25377c232b3dfb0ad3eb11",
"md5": "dc81904bd6646b9a7cb0a3838e618f27",
"sha256": "916697352981a411881f821fbd3b362e7074483aadf60589d5df244290f13c6f"
},
"downloads": -1,
"filename": "qnshare-0.1.0.tar.gz",
"has_sig": false,
"md5_digest": "dc81904bd6646b9a7cb0a3838e618f27",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 16282,
"upload_time": "2025-08-01T13:36:03",
"upload_time_iso_8601": "2025-08-01T13:36:03.417040Z",
"url": "https://files.pythonhosted.org/packages/02/6e/c486db12bac3f8a667e993adc54bcb1d60303e25377c232b3dfb0ad3eb11/qnshare-0.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-01 13:36:03",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "qy527145",
"github_project": "qnshare",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "qnshare"
}