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:
162
openclaw-handler.js
Normal file
162
openclaw-handler.js
Normal 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();
|
||||
Reference in New Issue
Block a user