Files
openclaw-skill-qiniu/openclaw-handler.js
daoqi 1aeae9cc51 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
2026-03-07 16:02:18 +08:00

163 lines
3.8 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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();