Sun-Panel 是一个服务器/NAS导航面板工具。本 skill 帮助 AI Agent 通过 API 操作它。
配置文件路径: ~/.openclaw/skills/sun-panel/config.json
json
{
"url": "http://your-sunpanel-host:3002",
"username": "your_username",
"password": "your_password"
}
bash
CONFIG_FILE="$HOME/.openclaw/skills/sun-panel/config.json"
# 检查配置文件是否存在
if [ ! -f "$CONFIG_FILE" ]; then
echo "首次使用 Sun-Panel 技能,请提供以下信息:"
echo "1. Sun-Panel 服务地址(如 http://192.168.10.3:3002)"
echo "2. 登录账号"
echo "3. 登录密码"
echo ""
echo "AI Agent 将引导用户输入并创建配置文件"
fi
# 读取配置
SUN_PANEL_URL=$(jq -r '.url' "$CONFIG_FILE")
SUN_PANEL_USERNAME=$(jq -r '.username' "$CONFIG_FILE")
SUN_PANEL_PASSWORD=$(jq -r '.password' "$CONFIG_FILE")
bash
# 确保目录存在
mkdir -p "$HOME/.openclaw/skills/sun-panel"
# 写入配置文件(使用用户提供的值)
cat > "$HOME/.openclaw/skills/sun-panel/config.json" << 'EOF'
{
"url": "USER_PROVIDED_URL",
"username": "USER_PROVIDED_USERNAME",
"password": "USER_PROVIDED_PASSWORD"
}
EOF
echo "配置已保存到 $HOME/.openclaw/skills/sun-panel/config.json"
bash
# 从配置文件读取
CONFIG_FILE="$HOME/.openclaw/skills/sun-panel/config.json"
SUN_PANEL_URL=$(jq -r '.url' "$CONFIG_FILE")
SUN_PANEL_USERNAME=$(jq -r '.username' "$CONFIG_FILE")
SUN_PANEL_PASSWORD=$(jq -r '.password' "$CONFIG_FILE")
# 登录
RESPONSE=$(curl -s -X POST "$SUN_PANEL_URL/api/login" \
-H "Content-Type: application/json" \
-d "{\"username\":\"$SUN_PANEL_USERNAME\",\"password\":\"$SUN_PANEL_PASSWORD\"}")
# 检查登录结果
if echo "$RESPONSE" | jq -e '.code == 0' > /dev/null; then
TOKEN=$(echo "$RESPONSE" | jq -r '.data.token')
echo "登录成功,Token 已获取"
else
echo "登录失败:$(echo "$RESPONSE" | jq -r '.msg')"
fi
bash
curl -s -X POST "$SUN_PANEL_URL/api/panel/itemIconGroup/getList" \
-H "Content-Type: application/json" \
-H "token: $TOKEN"
# 返回示例:
# {"code":0,"data":{"list":[{"id":1,"title":"开发工具","icon":"","sort":1}]}}
bash
curl -s -X POST "$SUN_PANEL_URL/api/panel/itemIconGroup/edit" \
-H "Content-Type: application/json" \
-H "token: $TOKEN" \
-d '{"title":"AI工具","icon":"mdi:robot","description":"AI相关工具"}'
# id=0 时创建新分组,返回包含新 id
bash
curl -s -X POST "$SUN_PANEL_URL/api/panel/itemIcon/addMultiple" \
-H "Content-Type: application/json" \
-H "token: $TOKEN" \
-d '[
{
"title": "GitHub",
"url": "https://github.com",
"lanUrl": "",
"description": "代码托管平台",
"icon": {"itemType": 3, "text": "mdi:github"},
"openMethod": 2,
"itemIconGroupId": 1
},
{
"title": "ChatGPT",
"url": "https://chat.openai.com",
"icon": {"itemType": 3, "text": "mdi:chat"},
"openMethod": 2,
"itemIconGroupId": 2
}
]'
bash
curl -s -X POST "$SUN_PANEL_URL/api/panel/itemIcon/edit" \
-H "Content-Type: application/json" \
-H "token: $TOKEN" \
-d '{
"title": "Google",
"url": "https://google.com",
"icon": {"itemType": 3, "text": "mdi:google"},
"openMethod": 2,
"itemIconGroupId": 1
}'
# id=0 时创建,有 id 时更新
bash
curl -s -X POST "$SUN_PANEL_URL/api/panel/itemIcon/getSiteFavicon" \
-H "Content-Type: application/json" \
-H "token: $TOKEN" \
-d '{"url":"https://github.com"}'
# 返回:{"code":0,"data":{"iconUrl":"/uploads/xxx.png"}}
# 使用此路径作为 itemType=2 的 src
itemType说明必填字段1文字图标text(显示的文字)2图片图标src(图片路径,可从 favicon API 获取)3Iconify图标text(图标ID,如 mdi:github)
值说明1当前页面打开2新窗口打开3小窗打开(iframe)
网站推荐 Iconify 图标github.commdi:githubgoogle.commdi:googleyoutube.commdi:youtubetwitter.com / x.commdi:twitterfacebook.commdi:facebookinstagram.commdi:instagramreddit.commdi:redditlinkedin.commdi:linkedinstackoverflow.commdi:stack-overflownotion.somdi:notionfigma.commdi:figmaslack.commdi:slackdiscord.commdi:discordspotify.commdi:spotifytwitch.tvmdi:twitchpinterest.commdi:pinterestmedium.commdi:mediumdribbble.commdi:dribbblebehance.netmdi:behancetrello.commdi:trellojira.atlassian.commdi:jirabitbucket.orgmdi:bitbucketgitlab.commdi:gitlabdocker.commdi:dockerkubernetes.iomdi:kubernetesaws.amazon.commdi:awsazure.microsoft.commdi:azurecloud.google.commdi:google-clouddigitalocean.commdi:digital-oceanvercel.commdi:vercelnetlify.commdi:netlifyheroku.commdi:heroku
网站推荐 Iconify 图标chat.openai.commdi:chat 或 mdi:robotclaude.aimdi:robot-outlinegemini.google.commdi:sparklescopilot.microsoft.commdi:robot-happyhuggingface.comdi:face-man-hugreplicate.commdi:content-copyperplexity.aimdi:magnifymidjourney.commdi:palettestability.aimdi:creationanthropic.commdi:brainopenai.commdi:robot
类型推荐 Iconify 图标Gitmdi:gitVS Codemdi:visual-studio-codeJetBrainsmdi:intellijTerminal/SSHmdi:consoleDatabasemdi:databaseAPImdi:apiDockermdi:dockerKubernetesmdi:kubernetesServermdi:serverNginxmdi:webRedismdi:flashPostgreSQLmdi:database-postgreMySQLmdi:database-mysqlMongoDBmdi:leaf
用途推荐 Iconify 图标文档/笔记mdi:file-document, mdi:notebook, mdi:book-open搜索mdi:magnify, mdi:search-web邮件mdi:email, mdi:mail云存储mdi:cloud, mdi:folder-cloud音乐mdi:music, mdi:playlist-music视频mdi:video, mdi:play-circle图片mdi:image, mdi:camera下载mdi:download, mdi:cloud-download设置mdi:cog, mdi:settings监控mdi:monitor, mdi:chart-line安全mdi:shield, mdi:lock日历mdi:calendar聊天mdi:chat, mdi:message书签mdi:bookmark, mdi:star首页mdi:home, mdi:house
网站类型推荐分组名推荐分组图标GitHub, GitLab, Bitbucket开发工具mdi:codeChatGPT, Claude, GeminiAI工具mdi:robotYouTube, Netflix, Spotify视频娱乐mdi:play-circleTwitter, Facebook, Discord社交媒体mdi:account-groupGoogle, Bing, DuckDuckGo搜索引擎mdi:magnifyNotion, Trello, Jira效率工具mdi:clipboard-checkGmail, Outlook, ProtonMail邮件服务mdi:emailAWS, Azure, GCP云服务mdi:cloudPlex, Jellyfin, Emby媒体服务器mdi:server-networkGrafana, Prometheus监控工具mdi:chart-areasplinePortainer, Dockge容器管理mdi:dockerNextcloud, Syncthing文件同步mdi:folder-sync
bash
# Step 1: 检查配置文件
CONFIG_FILE="$HOME/.openclaw/skills/sun-panel/config.json"
if [ ! -f "$CONFIG_FILE" ]; then
# 引导用户创建配置
echo "首次使用 Sun-Panel 技能"
echo "请提供 Sun-Panel 的配置信息:"
echo "- URL: Sun-Panel 服务地址"
echo "- Username: 登录账号"
echo "- Password: 登录密码"
# 等待用户提供信息后,创建配置文件
exit 0
fi
# Step 2: 读取配置
SUN_PANEL_URL=$(jq -r '.url' "$CONFIG_FILE")
SUN_PANEL_USERNAME=$(jq -r '.username' "$CONFIG_FILE")
SUN_PANEL_PASSWORD=$(jq -r '.password' "$CONFIG_FILE")
# Step 3: 登录获取 Token
RESPONSE=$(curl -s -X POST "$SUN_PANEL_URL/api/login" \
-H "Content-Type: application/json" \
-d "{\"username\":\"$SUN_PANEL_USERNAME\",\"password\":\"$SUN_PANEL_PASSWORD\"}")
if ! echo "$RESPONSE" | jq -e '.code == 0' > /dev/null; then
echo "登录失败,请检查配置文件中的账号密码"
exit 1
fi
TOKEN=$(echo "$RESPONSE" | jq -r '.data.token')
# Step 4: 执行用户请求的操作
# (添加网站、创建分组等)
bash
# 1. 检查是否存在 "AI工具" 分组
GROUPS=$(curl -s -X POST "$SUN_PANEL_URL/api/panel/itemIconGroup/getList" \
-H "token: $TOKEN")
AI_GROUP_ID=$(echo "$GROUPS" | jq -r '.data.list[] | select(.title=="AI工具") | .id')
# 2. 如果不存在,创建分组
if [ -z "$AI_GROUP_ID" ] || [ "$AI_GROUP_ID" == "null" ]; then
curl -s -X POST "$SUN_PANEL_URL/api/panel/itemIconGroup/edit" \
-H "Content-Type: application/json" \
-H "token: $TOKEN" \
-d '{"title":"AI工具","icon":"mdi:robot"}'
GROUPS=$(curl -s -X POST "$SUN_PANEL_URL/api/panel/itemIconGroup/getList" -H "token: $TOKEN")
AI_GROUP_ID=$(echo "$GROUPS" | jq -r '.data.list[] | select(.title=="AI工具") | .id')
fi
# 3. 批量添加图标
curl -X POST "$SUN_PANEL_URL/api/panel/itemIcon/addMultiple" \
-H "Content-Type: application/json" \
-H "token: $TOKEN" \
-d "[
{
\"title\": \"ChatGPT\",
\"url\": \"https://chat.openai.com\",
\"description\": \"OpenAI ChatGPT\",
\"icon\": {\"itemType\": 3, \"text\": \"mdi:chat\"},
\"openMethod\": 2,
\"itemIconGroupId\": $AI_GROUP_ID
},
{
\"title\": \"Claude\",
\"url\": \"https://claude.ai\",
\"description\": \"Anthropic Claude AI\",
\"icon\": {\"itemType\": 3, \"text\": \"mdi:robot-outline\"},
\"openMethod\": 2,
\"itemIconGroupId\": $AI_GROUP_ID
},
{
\"title\": \"Gemini\",
\"url\": \"https://gemini.google.com\",
\"description\": \"Google Gemini AI\",
\"icon\": {\"itemType\": 3, \"text\": \"mdi:sparkles\"},
\"openMethod\": 2,
\"itemIconGroupId\": $AI_GROUP_ID
}
]"
当用户说"帮我添加 xxx 网站"时:
示例:用户说"添加 bilibili"
bash
# bilibili 不在预设表中,但属于视频娱乐类
# 推荐: icon=mdi:video, group=视频娱乐
# 1. 获取/创建分组
# 2. 添加图标
curl -X POST "$SUN_PANEL_URL/api/panel/itemIcon/edit" \
-H "Content-Type: application/json" \
-H "token: $TOKEN" \
-d '{
"title": "Bilibili",
"url": "https://www.bilibili.com",
"description": "哔哩哔哩视频网站",
"icon": {"itemType": 3, "text": "mdi:video"},
"openMethod": 2,
"itemIconGroupId": 3
}'
bash
# 获取网站 favicon
ICON_RESP=$(curl -s -X POST "$SUN_PANEL_URL/api/panel/itemIcon/getSiteFavicon" \
-H "Content-Type: application/json" \
-H "token: $TOKEN" \
-d '{"url":"https://example.com"}')
ICON_URL=$(echo $ICON_RESP | jq -r '.data.iconUrl')
# 使用获取到的 favicon 作为图标
curl -X POST "$SUN_PANEL_URL/api/panel/itemIcon/edit" \
-H "Content-Type: application/json" \
-H "token: $TOKEN" \
-d '{
"title": "Example",
"url": "https://example.com",
"icon": {"itemType": 2, "src": "'$ICON_URL'"},
"openMethod": 2,
"itemIconGroupId": 1
}'
如果推荐表中没有对应图标,可以搜索:
mdi (Material Design Icons), fa (Font Awesome), carbon, tabler搜索格式:
text
# Material Design Icons 示例
mdi:github → GitHub
mdi:home → 首页图标
mdi:cog → 设置图标
# Font Awesome 示例
fa:github
fa:home
AI Agent 引导用户创建配置文件,收集 URL、账号、密码信息。
重新登录获取新 token。
先调用 itemIconGroup/edit 创建分组,再添加图标。
mdi:xxx)getSiteFavicon 自动获取网站图标检查配置文件中的账号密码是否正确,提示用户更新配置。