initial: 七牛云上传 OpenClaw Skill

功能特性:
- 支持 /upload, /u 命令上传文件到七牛云
- 支持 /qiniu-config 配置管理
- 支持飞书卡片交互
- 支持指定上传路径和存储桶
- 自动刷新 CDN 缓存
- 支持文件覆盖上传

包含组件:
- OpenClaw 处理器 (openclaw-processor.js)
- 独立监听器 (scripts/feishu-listener.js)
- 核心上传脚本 (scripts/upload-to-qiniu.js)
- 部署脚本 (deploy.sh)
- 完整文档

部署方式:
1. 复制 skill 到 ~/.openclaw/workspace/skills/
2. 配置 ~/.openclaw/credentials/qiniu-config.json
3. 重启 OpenClaw Gateway
This commit is contained in:
daoqi
2026-03-07 16:02:18 +08:00
commit 1aeae9cc51
36 changed files with 6826 additions and 0 deletions

162
openclaw-handler.js Normal file
View File

@@ -0,0 +1,162 @@
#!/usr/bin/env node
/**
* OpenClaw 飞书消息处理器 - 七牛云上传
*
* 用途:作为 OpenClaw 的飞书消息中间件,处理七牛云相关命令
*
* 使用方式:
* 1. 在 OpenClaw 配置中注册为飞书消息处理器
* 2. 或作为独立服务运行,接收 OpenClaw 转发的消息
*/
const fs = require('fs');
const path = require('path');
const { exec } = require('child_process');
const http = require('http');
// ============ 配置 ============
const CONFIG = {
port: process.env.QINIU_HANDLER_PORT || 3001,
openclawGateway: {
host: '127.0.0.1',
port: 17733
},
scriptDir: path.join(__dirname, 'scripts'),
credentials: path.join(process.env.HOME || process.env.USERPROFILE, '.openclaw/credentials')
};
// ============ 工具函数 ============
function log(...args) {
const timestamp = new Date().toISOString();
console.log(`[${timestamp}]`, ...args);
}
// ============ 命令解析 ============
function isQiniuCommand(text) {
const trimmed = text.trim();
return /^\/(upload|qiniu-config|qiniu-help)/i.test(trimmed);
}
// ============ 消息处理 ============
async function handleMessage(message) {
const text = message.content?.text || '';
if (!isQiniuCommand(text)) {
return { handled: false };
}
log('处理七牛云命令:', text);
// 调用上传脚本
const uploadScript = path.join(CONFIG.scriptDir, 'upload-to-qiniu.js');
// 解析命令
if (text.trim().startsWith('/upload')) {
return await handleUpload(message, uploadScript);
}
if (text.trim().startsWith('/qiniu-config')) {
return await handleConfig(message, uploadScript);
}
if (text.trim().startsWith('/qiniu-help')) {
return await handleHelp(message);
}
return { handled: false };
}
async function handleUpload(message, script) {
// TODO: 实现文件下载和上传逻辑
return {
handled: true,
reply: '🚧 上传功能开发中...\n\n请使用独立监听器模式\nhttp://47.83.185.237:3000'
};
}
async function handleConfig(message, script) {
const configCmd = message.content.text.replace('/qiniu-config', 'config');
return new Promise((resolve) => {
exec(`node "${script}" ${configCmd}`, (error, stdout, stderr) => {
if (error) {
resolve({
handled: true,
reply: `❌ 错误:${stderr || error.message}`
});
return;
}
resolve({
handled: true,
reply: '```\n' + stdout + '\n```'
});
});
});
}
async function handleHelp(message) {
const helpText = `
🍙 七牛云上传 - 使用帮助
📤 上传文件:
/upload [目标路径] [存储桶名]
/upload --original [存储桶名]
⚙️ 配置管理:
/qiniu-config list
/qiniu-config set <key> <value>
/qiniu-config set-bucket <name> <json>
`;
return {
handled: true,
reply: helpText
};
}
// ============ HTTP 服务器 ============
function startServer() {
const server = http.createServer(async (req, res) => {
if (req.method !== 'POST') {
res.writeHead(405);
res.end('Method Not Allowed');
return;
}
let body = '';
req.on('data', chunk => body += chunk);
req.on('end', async () => {
try {
const event = JSON.parse(body);
const result = await handleMessage(event.message);
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify(result));
} catch (e) {
log('处理失败:', e.message);
res.writeHead(500);
res.end('Internal Server Error');
}
});
});
server.listen(CONFIG.port, () => {
log(`🚀 七牛云处理器启动,端口:${CONFIG.port}`);
});
}
// ============ 主函数 ============
function main() {
log('🍙 OpenClaw 飞书消息处理器 - 七牛云');
startServer();
}
main();