聊天平台机器人文件发送方案:从失败到创新的探索之路

2026年7月9日 server 39 分钟阅读 4 次阅读
📖 文章摘要

针对多聊天社交平台机器人文件发送痛点,对比传统分发方案短板,提供博客网盘中转方案,附完整 Python 上传脚本与权限配置实操。

聊天平台机器人文件发送方案:从失败到创新的探索之路

作者:leap
日期:2026-07-09
个人博客:https://vue2.xyz


前言

作为一名软件工程专业的我一直在折腾和探索。最近遇到了一个问题就是让机器人能够以安全无限制的方式发送文件。然而,这个看似简单的需求,却让我经历了多次失败,最终才找到了一个创新的解决方案。

在这篇文档中,我将分享我的探索历程,包括失败的经历和最终的创新思路。希望对同样在探索AI机器人开发的朋友有所帮助。


一、需求背景

1.1 我的聊天平台机器人

我使用 OpenClaw 框架搭建了一个聊天平台机器人,部署在境外云服务器上。虽然是容器化部署,但是对于个人使用,我将其配置好脚本环境和可能会用到的各种依赖,并挂载到了根目录下,提升至近乎最高的root权限!因此这个机器人可以通过自然对话进行:

  • 执行任何任务
  • 调用各种技能
  • 处理各种文档
  • 任意访问外网(不受GFW中国防火长城限制)
  • websearch最新的信息

支持的聊天平台

  • QQ(通过 @tencent-connect/openclaw-qqbot 插件)
  • Telegram(通过 @openclaw/telegram 插件)
  • 微信(通过企业微信或第三方桥接)
  • 飞书(通过飞书开放平台API)
  • 其他聊天平台(Slack、Discord、钉钉等)

1.2 文件发送需求

用户经常会有这样的请求:

  • "帮我生成一个随机密码文件并发给我"
  • "把今天的日志发过来"
  • "把这个报告发送给我"

这些需求都很合理,但实现起来却遇到了很多问题。


二、第一次尝试:直接发送文件(失败)

2.1 初步想法

最初的想法很简单:用户请求发送文件,机器人生成文件后直接发送给用户。

实现方式:使用各平台的原生文件发送功能。

QQ示例

# 使用 qqbot-media 技能
print("<qqmedia>/tmp/password.txt</qqmedia>")

Telegram示例

# 使用 Telegram Bot API
bot.send_document(chat_id, open('/tmp/password.txt', 'rb'))

微信示例

# 使用企业微信API
WeChatClient.send_file(chat_id, '/tmp/password.txt')

2.2 遇到的问题

问题1:文件大小限制

  • QQ Bot 直接发送文件最大 100MB
  • Telegram Bot API 限制 50MB
  • 微信文件限制 100MB
  • 大文件无法发送
  • 工具插件调用失败
  • 初始的配置错误

问题2:传输不稳定

  • 大文件传输容易失败
  • 网络波动导致传输中断
  • 不同平台的传输机制不同

问题3:无密码保护

  • 文件发送后任何人都可以下载
  • 无法控制访问权限
  • 无法追踪下载者

问题4:无过期机制

  • 文件长期存留在服务器
  • 无法自动清理
  • 占用存储空间

问题5:无下载统计

  • 无法追踪文件下载情况
  • 无法审计和监控
  • 无法分析使用情况

2.3 失败总结

直接发送文件的方式虽然简单,但存在很多限制,无法满足用户的需求。而且不同平台的限制不同,需要针对每个平台单独处理。


三、第二次尝试:使用云存储(失败)

3.1 改进想法

既然直接发送有限制,那能不能把文件上传到云存储,然后发送下载链接?

实现方式:使用腾讯云 COS、阿里云 OSS、七牛云等对象存储服务。

代码示例

import boto3

# 上传到腾讯云 COS
s3 = boto3.client('s3',
    endpoint_url='https://cos.ap-guangzhou.myqcloud.com',
    aws_access_key_id='YOUR_ACCESS_KEY',
    aws_secret_access_key='YOUR_SECRET_KEY'
)
s3.upload_file('/tmp/password.txt', 'my-bucket', 'password.txt')

# 获取下载链接
url = f"https://my-bucket.cos.ap-guangzhou.myqcloud.com/password.txt"
print(f"文件已上传,下载链接:{url}")

3.2 遇到的问题

问题1:配置复杂

  • 需要注册云服务账号
  • 需要配置 API 密钥
  • 需要配置存储桶
  • 不同云服务配置方式不同

问题2:成本问题

  • 云存储按流量和存储收费
  • 频繁使用会产生费用
  • 大文件上传下载费用高

问题3:安全性问题

  • 文件上传后任何人都可以下载
  • 无密码保护
  • 无下载限制
  • 需要额外配置访问控制

问题4:管理复杂

  • 需要管理存储桶
  • 需要清理过期文件
  • 需要监控使用情况
  • 需要处理多平台兼容性

3.3 失败总结

使用云存储虽然解决了文件大小限制,但引入了新的问题:配置复杂、有成本、安全性差、管理复杂。而且不同云服务的配置方式不同,需要针对每个云服务单独处理。


四、第三次尝试:自建文件服务器(失败)

4.1 再次改进

既然云存储有问题,那能不能自己搭建一个文件服务器?

实现方式:在服务器上搭建一个简单的文件上传下载服务。

代码示例

from flask import Flask, request, send_file

app = Flask(__name__)

@app.route('/upload', methods=['POST'])
def upload():
    file = request.files['file']
    file.save(f"/uploads/{file.filename}")
    return f"上传成功,下载链接:http://example.com/download/{file.filename}"

@app.route('/download/<filename>')
def download(filename):
    return send_file(f"/uploads/{filename}")

if __name__ == '__main__':
    app.run(port=8080)

4.2 遇到的问题

问题1:安全性差

  • 无身份认证
  • 无密码保护
  • 任何人可以上传下载
  • 容易被攻击

问题2:功能简单

  • 无文件夹管理
  • 无下载限制
  • 无过期机制
  • 无下载统计

问题3:维护成本

  • 需要自己维护服务器
  • 需要自己处理安全问题
  • 需要自己监控和清理
  • 需要处理多平台兼容性

问题4:性能问题

  • 无法处理大文件
  • 无流式上传
  • 无断点续传
  • 并发性能差

4.3 失败总结

自建文件服务器虽然灵活,但安全性差、功能简单、维护成本高,不是理想的解决方案。而且需要针对每个平台单独适配,工作量大。


五、创新思路:利用博客网盘(成功)

5.1 灵感来源

在经历了多次失败后,我突然想到:我自己的博客系统已经有一个功能完善的网盘!

博客网盘特性

  • ✅ 支持最大 20GB 文件
  • ✅ 有密码保护
  • ✅ 有下载次数限制
  • ✅ 有过期时间
  • ✅ 有下载统计
  • ✅ HTTPS 加密传输
  • ✅ 流式上传,支持断点续传
  • ✅ 有进度条和速度显示

为什么不直接利用这个网盘呢?

5.2 核心思想

利用博客网盘作为中转站,实现聊天平台机器人安全、高效地发送大文件。

传统方式

用户请求 → 机器人生成文件 → 直接发送给用户

创新方式

用户请求 → 机器人生成文件 → 上传到博客网盘 → 获取分享链接 → 发送链接给用户

5.3 技术实现

5.3.1 整体架构

用户(QQ/Telegram/微信/飞书等)
    │
    │ 发送文件请求
    ▼
聊天平台机器人(OpenClaw)
    │
    │ 调用 pan 技能
    ▼
upload_script.py 脚本
    │
    │ 1. 登录博客获取JWT token
    │ 2. 上传文件到博客网盘
    │ 3. 获取分享链接和密码
    ▼
博客服务器(FastAPI)
    │
    │ API调用
    ▼
博客网盘(SQLite + 文件系统)
    │
    │ 返回下载链接
    ▼
用户收到下载链接

5.3.2 脚本实现原理

脚本名称upload_script.py
脚本位置/root/.openclaw/workspace/scripts/upload_script.py

核心功能

  1. 登录博客获取 JWT token
  2. 上传文件到博客网盘的指定文件夹
  3. 自动生成随机下载密码
  4. 设置下载次数限制(默认10次)
  5. 设置过期时间(默认1天)
  6. 返回下载链接和密码

详细实现

#!/usr/bin/env python3
"""上传文件到博客网盘,返回分享链接"""

import urllib.request
import json
import os
import sys
import random
import string
import time

# 配置信息(需要替换为自己的配置)
BLOG_URL = "https://your-blog-domain.com"
USERNAME = "your_username"
PASSWORD = "your_password"

# Token缓存(内存中)
_token_cache = {"token": None, "expire": 0}


def generate_password(length=8):
    """生成随机密码"""
    chars = string.ascii_letters + string.digits
    return ''.join(random.choices(chars, k=length))


def login():
    """登录获取JWT token(带缓存,7天有效)"""
    now = time.time()
    # 检查缓存是否有效(提前5分钟刷新,避免临界过期)
    if _token_cache["token"] and _token_cache["expire"] > now + 300:
        return _token_cache["token"]

    url = f"{BLOG_URL}/api/auth/login"
    data = json.dumps({"username": USERNAME, "password": PASSWORD}).encode()
    req = urllib.request.Request(url, data=data, headers={"Content-Type": "application/json"})
    with urllib.request.urlopen(req) as resp:
        result = json.loads(resp.read())
        _token_cache["token"] = result["access_token"]
        _token_cache["expire"] = now + 7 * 24 * 3600  # 缓存7天
        return _token_cache["token"]


def get_folder_id(token, folder_name="robot_uploads"):
    """通过文件夹名称获取文件夹ID"""
    url = f"{BLOG_URL}/api/pan/folders"
    req = urllib.request.Request(url, headers={"Authorization": f"Bearer {token}"})
    with urllib.request.urlopen(req) as resp:
        folders = json.loads(resp.read())
        for folder in folders:
            if folder["name"] == folder_name:
                return folder["id"]
        # 如果文件夹不存在,创建一个
        return create_folder(token, folder_name)


def create_folder(token, folder_name):
    """创建文件夹"""
    url = f"{BLOG_URL}/api/pan/folders"
    data = json.dumps({"name": folder_name}).encode()
    req = urllib.request.Request(url, data=data, headers={
        "Authorization": f"Bearer {token}",
        "Content-Type": "application/json"
    })
    with urllib.request.urlopen(req) as resp:
        result = json.loads(resp.read())
        return result["id"]


def upload_file(file_path, password, download_limit=10, expire_days=1, folder_name="robot_uploads"):
    """上传文件到网盘"""
    token = login()

    # 获取文件夹ID
    folder_id = get_folder_id(token, folder_name)

    with open(file_path, "rb") as f:
        file_data = f.read()

    boundary = "----WebKitFormBoundary" + ''.join(random.choices(string.ascii_letters + string.digits, k=16))

    body = ""
    body += f"--{boundary}\r\n"
    body += f'Content-Disposition: form-data; name="file"; filename="{os.path.basename(file_path)}"\r\n'
    body += f"Content-Type: application/octet-stream\r\n\r\n"

    body_bytes = body.encode() + file_data + f"\r\n--{boundary}--\r\n".encode()

    # 参数通过query传递
    params = f"password={password}&download_limit={download_limit}&expire_days={expire_days}&folder_id={folder_id}"
    url = f"{BLOG_URL}/api/pan/upload?{params}"
    req = urllib.request.Request(url, data=body_bytes, headers={
        "Authorization": f"Bearer {token}",
        "Content-Type": f"multipart/form-data; boundary={boundary}"
    })

    with urllib.request.urlopen(req) as resp:
        result = json.loads(resp.read())
        return {
            "share_id": result["id"],
            "share_url": f"{BLOG_URL}{result['url']}",
            "file_name": result["file_name"],
            "file_size": result["file_size"]
        }


if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: python3 upload_script.py <file_path> [password]")
        sys.exit(1)

    file_path = sys.argv[1]
    password = sys.argv[2] if len(sys.argv) > 2 else generate_password()

    if not os.path.exists(file_path):
        print(f"Error: File not found: {file_path}")
        sys.exit(1)

    try:
        result = upload_file(file_path, password)
        print(f"上传成功!")
        print(f"下载链接: {result['share_url']}")
        print(f"下载密码: {password}")
        print(f"文件名: {result['file_name']}")
        print(f"文件大小: {result['file_size']} bytes")
    except Exception as e:
        print(f"上传失败: {e}")
        sys.exit(1)

5.3.3 关键技术点

1. JWT Token 缓存

_token_cache = {"token": None, "expire": 0}

def login():
    """登录获取JWT token(带缓存,7天有效)"""
    now = time.time()
    # 检查缓存是否有效(提前5分钟刷新,避免临界过期)
    if _token_cache["token"] and _token_cache["expire"] > now + 300:
        return _token_cache["token"]
    
    # 缓存无效,重新登录
    # ... 登录逻辑 ...
    _token_cache["token"] = result["access_token"]
    _token_cache["expire"] = now + 7 * 24 * 3600  # 缓存7天
    return _token_cache["token"]

原理

  • JWT token 有效期为 7 天(博客系统配置)
  • 在内存中缓存 token,7 天内复用
  • 提前 5 分钟刷新,避免临界过期
  • 脚本重启后重新登录

优势

  • 避免每次上传都重新登录
  • 减少登录频率,降低限流风险
  • 提高性能

2. 通过文件夹名称定位

def get_folder_id(token, folder_name="robot_uploads"):
    """通过文件夹名称获取文件夹ID"""
    url = f"{BLOG_URL}/api/pan/folders"
    req = urllib.request.Request(url, headers={"Authorization": f"Bearer {token}"})
    with urllib.request.urlopen(req) as resp:
        folders = json.loads(resp.read())
        for folder in folders:
            if folder["name"] == folder_name:
                return folder["id"]
        # 如果文件夹不存在,创建一个
        return create_folder(token, folder_name)

原理

  • 不通过文件夹 ID 定位(ID 可能变化)
  • 通过文件夹名称定位(名称固定)
  • 如果文件夹不存在,自动创建

优势

  • 即使文件夹 ID 或者 顺序 变化,只要名称不变就能正常工作
  • 更健壮,更可靠

3. 自动生成密码

def generate_password(length=8):
    """生成随机密码"""
    chars = string.ascii_letters + string.digits
    return ''.join(random.choices(chars, k=length))

原理

  • 使用字母和数字随机组合
  • 默认 8 位长度
  • 用户也可以指定密码

优势

  • 密码复杂度高,安全性好
  • 自动生成,方便快捷

4. Multipart/form-data 上传

boundary = "----WebKitFormBoundary" + ''.join(random.choices(string.ascii_letters + string.digits, k=16))

body = ""
body += f"--{boundary}\r\n"
body += f'Content-Disposition: form-data; name="file"; filename="{os.path.basename(file_path)}"\r\n'
body += f"Content-Type: application/octet-stream\r\n\r\n"

body_bytes = body.encode() + file_data + f"\r\n--{boundary}--\r\n".encode()

原理

  • 使用 multipart/form-data 格式上传文件
  • 符合 HTTP 文件上传标准
  • 支持大文件上传

优势

  • 兼容性好
  • 支持大文件
  • 符合标准

六、Skill 设计

6.1 Skill 命名

名称pan(网盘的拼音,3个字母)

优势

  • 简短易记(3个字母)
  • 中文拼音,用户容易理解
  • 与博客网盘功能对应
  • 平台无关,适用于任何聊天平台机器人

6.2 Skill 配置

文件位置/root/.openclaw/workspace/skills/pan/SKILL.md

配置内容

---
name: pan
description: 上传文件到博客网盘,返回下载链接。支持最大20GB文件,自动设置密码、下载次数和过期时间。
metadata: {"openclaw":{"emoji":"📦","requires":{"config":["channels qqbot"]}}}
---

# 博客网盘上传

## 用法

当用户请求发送文件时,使用此技能上传到博客网盘并返回下载链接。

### 命令格式

```bash
python3 /root/.openclaw/workspace/scripts/upload_script.py <文件路径> [密码]

参数说明

  • 文件路径:要上传的文件的绝对路径
  • 密码:可选,下载密码(默认随机生成8位字母数字组合)

输出格式

上传成功!
下载链接: https://your-blog-domain.com/pan/123
下载密码: Abc12345
文件名: file.txt
文件大小: 123 bytes

默认设置

  • 下载次数限制:10次
  • 过期时间:1天
  • 密码长度:8位(字母+数字随机组合)
  • 上传文件夹:robot_uploads(自动创建)

规则

  1. 文件路径必须是绝对路径(以 / 开头)
  2. 上传前检查文件是否存在
  3. 上传前检查文件大小(最大20GB)
  4. 危险文件类型会被拒绝(.exe, .bat, .sh, .py等)
  5. 上传成功后必须返回下载链接和密码
  6. 下载链接格式https://your-blog-domain.com/pan/{share_id}
  7. 密码必须告知用户(随机生成或用户指定)

支持的文件类型

  • 所有常见文件类型
  • 危险文件类型会被拒绝:.exe, .bat, .cmd, .sh, .py, .msi, .vbs, .ps1, .scr, .com, .reg, .jar, .dll, .dylib, .dmg, .pif, .wsf, .hta, .docm, .php, .asp, .aspx, .jsp, .jspx, .pl, .rb, .wasm

注意事项

  • 文件上传到博客网盘后,用户需要输入密码才能下载
  • 下载链接有效期为1天
  • 每个文件最多可下载10次
  • 文件大小限制为20GB
  • 上传过程需要登录博客API(自动处理)

6.3 Skill 工作流程

  1. 用户请求:用户说"帮我生成一个随机密码文件并发给我"
  2. 机器人理解:机器人理解用户意图,决定使用 pan 技能
  3. 生成文件:机器人生成密码文件 password.txt
  4. 调用脚本:机器人调用 python3 /root/.openclaw/workspace/scripts/upload_script.py /tmp/password.txt
  5. 上传文件:脚本上传文件到博客网盘的 robot_uploads 文件夹
  6. 获取链接:脚本获取分享链接和密码
  7. 返回结果:机器人将下载链接和密码发送给用户

七、博客联动设计

7.1 博客网盘 API

认证 API

POST /api/auth/login
Content-Type: application/json

{
  "username": "your_username",
  "password": "your_password"
}

Response:
{
  "access_token": "your_jwt_token",
  "token_type": "bearer"
}

上传 API

POST /api/pan/upload?password=xxx&download_limit=10&expire_days=1&folder_id=3
Authorization: Bearer <token>
Content-Type: multipart/form-data

file: <文件内容>

Response:
{
  "id": 123,
  "url": "/pan/123",
  "file_name": "test.txt",
  "file_size": 1234
}

文件夹 API

GET /api/pan/folders
Authorization: Bearer <token>

Response:
[
  {"id": 3, "name": "robot_uploads", "file_count": 5},
  {"id": 2, "name": "personal", "file_count": 3},
  {"id": 1, "name": "blog_sharing", "file_count": 1}
]

7.2 文件夹管理

设计思路

  • 通过文件夹名称定位,而不是 ID
  • 即使 ID 变化,只要名称不变就能正常工作
  • 如果文件夹不存在,自动创建

实现逻辑

def get_folder_id(token, folder_name="robot_uploads"):
    """通过文件夹名称获取文件夹ID"""
    # 1. 获取所有文件夹列表
    # 2. 查找名称匹配的文件夹
    # 3. 如果不存在,创建一个
    # 4. 返回文件夹ID

7.3 身份认证

JWT Token 机制

  • Token 有效期:7 天
  • 脚本缓存 token:7 天内复用
  • 提前 5 分钟刷新:避免临界过期

实现逻辑

_token_cache = {"token": None, "expire": 0}

def login():
    """登录获取JWT token(带缓存)"""
    now = time.time()
    # 检查缓存是否有效
    if _token_cache["token"] and _token_cache["expire"] > now + 300:
        return _token_cache["token"]
    
    # 缓存无效,重新登录
    # ... 登录逻辑 ...
    _token_cache["token"] = result["access_token"]
    _token_cache["expire"] = now + 7 * 24 * 3600  # 缓存7天
    return _token_cache["token"]

八、安全设计

8.1 密码策略

  • 密码长度:8 位
  • 密码组成:字母 + 数字随机组合
  • 生成方式string.ascii_letters + string.digits
  • 用户可指定:支持用户自定义密码

8.2 下载限制

  • 下载次数:默认 10 次
  • 过期时间:默认 1 天
  • 可自定义:支持用户指定次数和时间

8.3 文件安全

危险文件拦截

BLOCKED_EXTS = {'.exe', '.bat', '.cmd', '.sh', '.py', '.msi', '.vbs', '.ps1', 
                '.scr', '.com', '.reg', '.jar', '.dll', '.dylib', '.dmg', '.pif', 
                '.wsf', '.hta', '.docm', '.php', '.asp', '.aspx', '.jsp', '.jspx', 
                '.pl', '.rb', '.wasm'}

路径穿越防护

  • 上传文件名使用 UUID 重命名
  • 防止路径穿越攻击

8.4 传输安全

  • HTTPS:所有 API 调用使用 HTTPS
  • Token 认证:JWT token 认证
  • CORS:域名白名单限制

九、使用示例

9.1 基本使用

用户说:"帮我生成一个随机密码文件并发给我"

机器人执行

  1. 生成密码文件 password.txt

  2. 调用:python3 /root/.openclaw/workspace/scripts/upload_script.py /tmp/password.txt

  3. 获取分享链接

  4. 发送给用户:

    文件已上传!
    下载链接:https://your-blog-domain.com/pan/123
    下载密码:QxnreKag
    有效期:1天
    下载次数:10次
    

9.2 指定密码

用户说:"把这个文件发给我,密码是 MyPass123"

机器人执行

  1. 调用:python3 /root/.openclaw/workspace/scripts/upload_script.py /path/to/file.txt MyPass123
  2. 获取分享链接
  3. 发送给用户

9.3 智能选择

文件大小判断

  • 小于 100MB:使用原生文件发送功能
  • 大于 100MB:使用 pan 上传到网盘

用户意图识别

  • "发一份报告给我" → 自动生成报告并上传
  • "把今天的日志发过来" → 获取日志并上传
  • "上传这个文件到网盘" → 直接上传指定文件

9.4 多平台示例

QQ示例

用户:帮我生成一个随机密码文件并发给我
机器人:文件已上传!
       下载链接:https://your-blog-domain.com/pan/123
       下载密码:QxnreKag
       有效期:1天
       下载次数:10次

Telegram示例

用户:帮我生成一个随机密码文件并发给我
机器人:文件已上传!
       下载链接:https://your-blog-domain.com/pan/123
       下载密码:QxnreKag
       有效期:1天
       下载次数:10次

微信示例

用户:帮我生成一个随机密码文件并发给我
机器人:文件已上传!
       下载链接:https://your-blog-domain.com/pan/123
       下载密码:QxnreKag
       有效期:1天
       下载次数:10次

飞书示例

用户:帮我生成一个随机密码文件并发给我
机器人:文件已上传!
       下载链接:https://your-blog-domain.com/pan/123
       下载密码:QxnreKag
       有效期:1天
       下载次数:10次

十、优势对比

10.1 与传统方式对比

特性 传统方式(原生发送) 创新方式(pan)
文件大小限制 50-100MB(平台不同) 最大 20GB
传输稳定性 一般 流式上传,稳定可靠
密码保护 ❌ 无 ✅ 支持
下载次数限制 ❌ 无 ✅ 支持(默认10次)
过期时间 ❌ 无 ✅ 支持(默认1天)
下载统计 ❌ 无 ✅ 支持
HTTPS加密 ❌ 取决于平台 ✅ 强制 HTTPS
文件管理 ❌ 无 ✅ 文件夹分类
平台兼容性 ❌ 需要针对每个平台适配 ✅ 平台无关

10.2 与云存储对比

特性 云存储(腾讯云 COS) 创新方式(pan)
配置复杂度 复杂(需注册账号、配置密钥) 简单(直接使用博客 API)
成本 按流量和存储收费 免费(利用已有博客)
安全性 一般(无密码保护) 高(密码保护+下载限制)
管理复杂度 复杂(需管理存储桶) 简单(自动管理)
平台兼容性 ❌ 需要针对每个平台适配 ✅ 平台无关

10.3 与自建文件服务器对比

特性 自建文件服务器 创新方式(pan)
安全性 差(无认证) 高(JWT+密码)
功能 简单(基本上传下载) 丰富(文件夹+限制+统计)
维护成本 高(需自己维护) 低(复用博客)
性能 一般(无流式上传) 高(流式上传+断点续传)
平台兼容性 ❌ 需要针对每个平台适配 ✅ 平台无关

十一、创新价值

11.1 技术创新

  1. 架构创新:利用博客网盘作为聊天平台机器人的文件中转站
  2. 技术创新:通过文件夹名称定位,JWT token 缓存,自动密码生成
  3. 安全创新:密码保护、下载限制、过期时间、下载统计
  4. 平台无关:同一套代码适用于所有聊天平台

11.2 业务价值

  1. 用户体验:用户只需简单请求,机器人自动完成上传和分享
  2. 成本节约:复用已有博客系统,无需额外开发和部署
  3. 安全性提升:密码保护、下载限制、过期时间,防止文件泄露
  4. 统一方案:一套代码支持所有聊天平台,降低开发成本

11.3 社会价值

  1. 知识分享:为其他开发者提供了一种创新的解决方案
  2. 技术探索:展示了如何利用现有系统解决新问题
  3. 开源精神:分享代码和设计思路,促进技术交流
  4. 平台无关:为聊天平台机器人开发提供了一种通用的文件发送方案

十二、部署和维护

12.1 部署步骤

  1. 上传脚本到 OpenClaw 容器

    base64 upload_script.py > upload_script.py.b64
    scp -P YOUR_SSH_PORT upload_script.py.b64 user@your-server:/tmp/
    ssh -p YOUR_SSH_PORT user@your-server "base64 -d /tmp/upload_script.py.b64 > /tmp/upload_script.py && docker cp /tmp/upload_script.py openclaw:/root/.openclaw/workspace/scripts/"
    
  2. 创建 Skill 目录和文件

    mkdir -p /root/.openclaw/workspace/skills/pan
    # 上传 SKILL.md 文件
    
  3. 测试功能

    docker exec openclaw python3 /root/.openclaw/workspace/scripts/upload_script.py /tmp/test.txt
    

12.2 维护要点

  1. 监控博客系统

    • 确保博客 API 正常运行
    • 监控磁盘空间
    • 定期清理过期文件
  2. 更新脚本

    • 如需修改功能,更新 upload_script.py
    • 重新部署到 OpenClaw 容器
    • 测试新功能
  3. 日志分析

    • 查看下载日志
    • 分析使用情况
    • 优化性能

十三、未来扩展

13.1 功能扩展

  1. 文件夹分类

    • 支持用户指定文件夹
    • 自动分类存储
    • 文件夹权限管理
  2. 批量上传

    • 支持多个文件同时上传
    • 自动打包成 zip
    • 分卷上传
  3. 上传进度

    • 显示上传进度条
    • 显示上传速度
    • 支持断点续传

13.2 安全增强

  1. IP 限制

    • 限制下载 IP 范围
    • 防止恶意下载
  2. 水印功能

    • 文件添加水印
    • 追踪泄露源头
  3. 加密存储

    • 文件加密存储
    • 提高安全性

13.3 平台扩展

  1. 微信集成

    • 企业微信API对接
    • 微信小程序集成
  2. 飞书集成

    • 飞书开放平台API对接
    • 飞书机器人集成
  3. 其他平台

    • 钉钉
    • Slack
    • Discord
    • 更多聊天平台

十四、总结

14.1 探索历程

从最初的直接发送文件,到使用云存储,再到自建文件服务器,每一次尝试都遇到了不同的问题。最终,我找到了一个创新的解决方案:利用博客网盘作为中转站。

14.2 创新价值

这个方案不仅解决了文件发送的问题,还带来了额外的价值:

  • 安全性提升:密码保护、下载限制、过期时间
  • 大文件支持:最大 20GB
  • 可追溯性:下载统计、下载日志
  • 成本节约:复用已有博客系统
  • 平台无关:一套代码支持所有聊天平台

14.3 技术亮点

  1. JWT Token 缓存:7 天有效期,避免频繁登录
  2. 文件夹名称定位:不依赖 ID,更健壮
  3. 自动密码生成:安全且方便
  4. 危险文件拦截:提高安全性
  5. 平台无关设计:适用于所有聊天平台

14.4 展望

这个方案为聊天平台机器人的文件发送提供了一种创新的解决方案。未来可以进一步扩展功能,增强安全性,提升用户体验。更重要的是,这个方案是平台无关的,可以应用于 QQ、Telegram、微信、飞书等所有聊天平台。


文档版本:v1.0
最后更新:2026-07-09
作者:leap
个人博客https://vue2.xyz

最后更新:2026年7月9日CC BY-NC-SA 4.0

评论

暂无评论,来写第一条吧

© 2026 My Blog. Built with Nuxt.js + FastAPI.