first commit

This commit is contained in:
jeremygan2021
2026-03-04 19:24:05 +08:00
commit f5117a90d1
28 changed files with 1647 additions and 0 deletions

View File

@@ -0,0 +1,81 @@
#!/usr/bin/env python3
import sys
import os
import subprocess
from PIL import Image
def add_logo(image_path, logo_svg_path):
if not os.path.exists(image_path):
print(f"Error: Image not found at {image_path}")
return
if not os.path.exists(logo_svg_path):
print(f"Error: Logo SVG not found at {logo_svg_path}")
return
try:
# Open the main image
img = Image.open(image_path)
img_w, img_h = img.size
# Calculate desired logo width (e.g., 20% of image width)
target_logo_width = int(img_w * 0.2)
if target_logo_width < 100: target_logo_width = 100 # Minimum width
# Convert SVG to PNG with the target width using rsvg-convert
# We use a temporary file for the logo png
logo_png_path = "/tmp/temp_logo.png"
# Check if rsvg-convert exists
rsvg_check = subprocess.run(["which", "rsvg-convert"], capture_output=True, text=True)
if rsvg_check.returncode != 0:
print("Error: rsvg-convert not found. Please install librsvg.")
return
# Convert SVG to PNG
subprocess.run([
"rsvg-convert",
"-w", str(target_logo_width),
"-f", "png",
"-o", logo_png_path,
logo_svg_path
], check=True)
# Open the logo image
logo = Image.open(logo_png_path).convert("RGBA")
# Calculate position (top-left with margin)
margin = int(img_w * 0.05)
position = (margin, margin)
# Paste logo onto image (using alpha channel as mask)
# Handle different image modes (RGB vs RGBA)
if img.mode != 'RGBA':
img = img.convert('RGBA')
img.paste(logo, position, logo)
# Save the result (overwrite original or save as new)
# We'll overwrite for now as per "add the logo" request implies modification
# But if it's JPG, we need to convert back to RGB
if image_path.lower().endswith(('.jpg', '.jpeg')):
img = img.convert('RGB')
img.save(image_path)
print(f"✅ Logo added to {image_path}")
# Clean up
if os.path.exists(logo_png_path):
os.remove(logo_png_path)
except Exception as e:
print(f"❌ Failed to add logo: {str(e)}")
if __name__ == "__main__":
if len(sys.argv) < 3:
print("Usage: python3 add_logo.py <image_path> <logo_svg_path>")
sys.exit(1)
image_path = sys.argv[1]
logo_svg_path = sys.argv[2]
add_logo(image_path, logo_svg_path)

View File

@@ -0,0 +1,96 @@
#!/bin/bash
# 活动文案生成脚本 - Event Publisher Skill
# 使用豆包大模型生成 Markdown 格式的活动文案
# 获取脚本所在目录的绝对路径
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SKILL_DIR="$(dirname "$SCRIPT_DIR")"
ASSETS_DIR="$SKILL_DIR/assets"
# 确保 assets 目录存在
mkdir -p "$ASSETS_DIR"
# 加载环境变量
if [ -f "$SCRIPT_DIR/.env" ]; then
source "$SCRIPT_DIR/.env"
elif [ -f "$SKILL_DIR/.env" ]; then
source "$SKILL_DIR/.env"
fi
# 默认值
DOUBAO_API_KEY="${DOUBAO_API_KEY:-db1f8b60-0ffc-473c-98da-40daa3a95df8}"
generate_content() {
local topic="$1"
local time="$2"
local location="$3"
local extra_info="$4"
echo "======================================"
echo "📝 正在生成活动文案..."
echo "======================================"
echo ">>> 主题: $topic"
echo ">>> 时间: $time"
echo ">>> 地点: $location"
# 构建 Prompt
local system_prompt="你是一个专业的活动策划师。请根据用户提供的信息生成一份精美的活动文案Markdown格式
要求:
1. 包含主标题H1和副标题
2. 开头要有吸引人的活动介绍包含emoji表情
3. 活动亮点部分(使用列表)
4. 时间安排(使用表格)
5. 活动流程(使用表格)
6. 结尾要有号召性用语
7. 整体风格要热情、活泼、有感染力
8. 直接输出Markdown内容不要包含```markdown```标记,也不要包含其他解释性文字。"
local user_prompt="请生成一份活动文案:
- 活动主题:$topic
- 活动时间:$time
- 活动地点:$location
- 其他要求:$extra_info"
# URL编码
local user_prompt_encoded=$(python3 -c "import urllib.parse; print(urllib.parse.quote('''$user_prompt'''))")
# JSON数据
local json_data="{\"model\":\"doubao-seed-2-0-pro-260215\",\"messages\":[{\"role\":\"system\",\"content\":\"$system_prompt\"},{\"role\":\"user\",\"content\":\"$user_prompt_encoded\"}],\"max_tokens\":2000}"
# 调用API
response=$(curl -s -X POST "https://ark.cn-beijing.volces.com/api/v3/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $DOUBAO_API_KEY" \
--data-binary "$json_data")
# 解析响应
content=$(echo "$response" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['choices'][0]['message']['content'] if d.get('choices') else '')" 2>/dev/null)
if [ -n "$content" ]; then
# 清理可能的 markdown 标记
content=$(echo "$content" | sed 's/^```markdown//' | sed 's/^```//' | sed 's/```$//')
# 生成文件名(使用主题名,替换空格为下划线)
safe_topic=$(echo "$topic" | tr ' ' '_')
output_file="$ASSETS_DIR/${safe_topic}_活动文案.md"
echo "$content" > "$output_file"
echo ""
echo "✅ 活动文案已生成: $output_file"
echo "--------------------------------------"
head -n 10 "$output_file"
echo "..."
echo "--------------------------------------"
else
echo "❌ 文案生成失败"
echo "$response"
fi
}
if [ $# -lt 1 ]; then
echo "用法: $0 <活动主题> [时间] [地点] [其他信息]"
echo "示例: $0 '春节游园会' '2月12日' '市中心广场' '包含灯谜和美食'"
exit 1
fi
generate_content "$1" "$2" "$3" "$4"

View File

@@ -0,0 +1,272 @@
#!/bin/bash
# 图片生成脚本 - 活动发布 skill
# 使用豆包大模型根据活动内容生成提示词,然后生成海报
# 包含自动添加Logo、保存规范提示词
# 获取脚本所在目录的绝对路径
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SKILL_DIR="$(dirname "$SCRIPT_DIR")"
ASSETS_DIR="$SKILL_DIR/assets"
# 确保 assets 目录存在
mkdir -p "$ASSETS_DIR"
# 加载环境变量
if [ -f "$SCRIPT_DIR/.env" ]; then
source "$SCRIPT_DIR/.env"
elif [ -f "$SKILL_DIR/.env" ]; then
source "$SKILL_DIR/.env"
fi
# 脚本路径
PROMPT_SCRIPT="$SCRIPT_DIR/generate_prompt.sh"
LOGO_SCRIPT="$SCRIPT_DIR/add_logo.py"
LOGO_FILE="$ASSETS_DIR/quant-speed.svg"
# 默认值
DOUBAO_API_KEY="${DOUBAO_API_KEY:-db1f8b60-0ffc-473c-98da-40daa3a95df8}"
NANOBANANA_API_KEY="${NANOBANANA_API_KEY:-sk-Cx883TlPrrn0nUvQFmU5wSt99OFv7tiIhg4Re5yHttNtN1Am}"
NANOBANANA_BASE_URL="${NANOBANANA_BASE_URL:-http://zx2.52youxi.cc:3000}"
# 辅助函数添加Logo
add_logo_to_image() {
local image_path="$1"
if [ -f "$LOGO_SCRIPT" ] && [ -f "$LOGO_FILE" ]; then
echo " 🔄 正在添加Logo..."
python3 "$LOGO_SCRIPT" "$image_path" "$LOGO_FILE"
else
echo " ⚠️ Logo脚本或文件不存在跳过添加Logo"
fi
}
# 辅助函数:保存提示词
save_prompt_info() {
local image_path="$1"
local prompt="$2"
local model="$3"
local timestamp=$(date +%Y-%m-%dT%H:%M:%S%z)
local txt_file="${image_path}.txt"
echo "Image: $(basename "$image_path")
Prompt: $prompt
Model: $model
Timestamp: $timestamp" > "$txt_file"
echo " 💾 提示词已保存: $(basename "$txt_file")"
}
# 使用AI生成提示词
generate_ai_prompts() {
local event_content="$1"
echo "======================================"
echo "🤖 步骤1: 使用豆包AI生成海报提示词"
echo "======================================"
echo ""
# 调用AI生成提示词
local result=$(bash "$PROMPT_SCRIPT" ai "$event_content")
# 提取提示词
local doubao_prompt=$(echo "$result" | grep "DOUBAO_PROMPT=" | sed 's/DOUBAO_PROMPT=//')
local nano_prompt=$(echo "$result" | grep "NANO_PROMPT=" | sed 's/NANO_PROMPT=//')
if [ -z "$doubao_prompt" ] || [ -z "$nano_prompt" ]; then
echo "❌ AI提示词生成失败使用默认提示词"
doubao_prompt="春节游园会,新春庆典,红灯笼,中国结,舞狮,烟花,喜庆氛围,节日活动"
nano_prompt="春节,新年,现代简约设计,扁平化风格,渐变色,孟菲斯风格"
fi
echo "✅ AI提示词生成成功"
echo ""
echo "📝 豆包提示词: ${doubao_prompt:0:80}..."
echo "📝 创意提示词: ${nano_prompt:0:80}..."
echo ""
# 返回提示词
echo "DOUBAO_PROMPT=$doubao_prompt"
echo "NANO_PROMPT=$nano_prompt"
}
# 生成豆包图片3张变体
generate_doubao_images() {
local base_prompt="$1"
local event_name="$2"
echo "======================================"
echo "🎨 步骤2: 生成豆包海报3张变体"
echo "======================================"
echo ""
# 生成3个不同的提示词变体
local prompts=$(bash "$PROMPT_SCRIPT" variations "$base_prompt")
local prompt1=$(echo "$prompts" | sed -n '1p')
local prompt2=$(echo "$prompts" | sed -n '2p')
local prompt3=$(echo "$prompts" | sed -n '3p')
echo " 提示词变体1: ${prompt1:0:60}..."
echo " 提示词变体2: ${prompt2:0:60}..."
echo " 提示词变体3: ${prompt3:0:60}..."
echo ""
local timestamp=$(date +%Y%m%d_%H%M%S)
local success_count=0
# 生成3张图片
for i in 1 2 3; do
local prompt_var=$(eval echo \$prompt$i)
local output_file="$ASSETS_DIR/${event_name}_豆包版${i}_${timestamp}.jpg"
echo ">>> 生成第 $i 张..."
response=$(curl -s -X POST "https://ark.cn-beijing.volces.com/api/v3/images/generations" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $DOUBAO_API_KEY" \
-d "{
\"model\": \"doubao-seedream-5-0-260128\",
\"prompt\": \"$prompt_var\",
\"sequential_image_generation\": \"disabled\",
\"response_format\": \"url\",
\"size\": \"2K\",
\"stream\": false,
\"watermark\": true
}")
image_url=$(echo "$response" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['data'][0]['url'] if d.get('data') else '')" 2>/dev/null)
if [ -n "$image_url" ]; then
curl -s -o "$output_file" "$image_url"
echo " ✅ 第 $i 张已保存: ${output_file}"
# 添加Logo
add_logo_to_image "$output_file"
# 保存提示词
save_prompt_info "$output_file" "$prompt_var" "doubao-seedream-5-0-260128"
success_count=$((success_count + 1))
else
echo " ❌ 第 $i 张生成失败"
fi
done
echo ""
echo "✅ 豆包图片生成完成!成功 $success_count/3 张"
}
# 生成 Nanobanana 图片
generate_nanobanana_image() {
local prompt="$1"
local event_name="$2"
echo "======================================"
echo "🎨 步骤3: 生成 Nanobanana 海报(创意版)"
echo "======================================"
echo ""
echo " 提示词: ${prompt:0:60}..."
echo ""
local timestamp=$(date +%Y%m%d_%H%M%S)
local output_file="$ASSETS_DIR/${event_name}_创意版_${timestamp}.png"
response=$(curl -s -X POST "${NANOBANANA_BASE_URL}/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $NANOBANANA_API_KEY" \
-d "{
\"model\": \"gemini-3-pro-image-preview\",
\"messages\": [{\"role\": \"user\", \"content\": \"生成一张图片:$prompt\"}],
\"max_tokens\": 4000
}")
# 提取base64图片数据
img_data=$(echo "$response" | python3 -c "
import sys, json, re
import base64
try:
d = json.load(sys.stdin)
content = d['choices'][0]['message']['content']
match = re.search(r'data:image/(\w+);base64,(.+)', content, re.DOTALL)
if match:
img_type = match.group(1)
img_b64 = match.group(2).strip()
img_bytes = base64.b64decode(img_b64)
import base64 as b64mod
print(b64mod.b64encode(img_bytes).decode('utf-8'))
except Exception as e:
print('')
" 2>/dev/null)
if [ -n "$img_data" ]; then
echo "$img_data" | base64 -d > "$output_file" 2>/dev/null
echo "✅ Nanobanana 图片已保存: $output_file"
# 添加Logo
add_logo_to_image "$output_file"
# 保存提示词
save_prompt_info "$output_file" "$prompt" "gemini-3-pro-image-preview"
else
echo "❌ Nanobanana 图片生成失败"
fi
}
# 根据活动内容生成所有海报
generate_posters_from_content() {
local event_content="$1"
local event_name="$2"
echo "======================================"
echo "🎉 开始生成活动海报"
echo "======================================"
echo ""
# 步骤1: AI生成提示词
local prompts=$(generate_ai_prompts "$event_content")
local doubao_prompt=$(echo "$prompts" | grep "DOUBAO_PROMPT=" | sed 's/DOUBAO_PROMPT=//')
local nano_prompt=$(echo "$prompts" | grep "NANO_PROMPT=" | sed 's/NANO_PROMPT=//')
# 步骤2: 生成豆包图片
generate_doubao_images "$doubao_prompt" "$event_name"
echo ""
# 步骤3: 生成Nanobanana图片
generate_nanobanana_image "$nano_prompt" "$event_name"
echo ""
echo "======================================"
echo "✅ 全部海报生成完成!"
echo "======================================"
echo ""
echo "📁 所有图片保存位置: $ASSETS_DIR"
echo ""
echo "请选择您喜欢的海报版本:"
echo " 1 - 豆包版1"
echo " 2 - 豆包版2"
echo " 3 - 豆包版3"
echo " 4 - 创意版"
}
# 根据参数调用对应函数
case "$1" in
ai)
generate_ai_prompts "$2"
;;
doubao)
generate_doubao_images "$2" "$3"
;;
nanobanana)
generate_nanobanana_image "$2" "$3"
;;
all)
generate_posters_from_content "$2" "$3"
;;
*)
echo "======================================"
echo "🖼️ 活动海报生成工具"
echo "======================================"
echo "用法: $0 all <活动文案> <活动名称>"
echo ""
echo "示例: "
echo ' $0 all "活动名称:春节游园会..." "春节游园会"'
;;
esac

View File

@@ -0,0 +1,128 @@
#!/bin/bash
# 活动海报提示词生成器 - 使用豆包大模型生成
# 获取脚本所在目录的绝对路径
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SKILL_DIR="$(dirname "$SCRIPT_DIR")"
ASSETS_DIR="$SKILL_DIR/assets"
# 加载环境变量
if [ -f "$SCRIPT_DIR/.env" ]; then
source "$SCRIPT_DIR/.env"
elif [ -f "$SKILL_DIR/.env" ]; then
source "$SKILL_DIR/.env"
fi
# 默认值
DOUBAO_API_KEY="${DOUBAO_API_KEY:-db1f8b60-0ffc-473c-98da-40daa3a95df8}"
# 使用豆包大模型生成海报提示词
generate_prompt_with_ai() {
local event_content="$1"
echo "🤖 正在使用豆包大模型生成海报提示词..."
# 构建prompt让AI根据活动内容生成适合的图片提示词
local system_prompt="你是一个专业的活动海报设计提示词专家。根据用户提供的活动文案内容生成适合用于AI绘画生成海报的中文提示词。要求1. 生成的提示词要准确反映活动的主题、氛围和特点 2. 提示词应该是有画面结构,内容文字,用逗号分隔 3. 提示词要包含:活动场景、人物、物品、氛围、风格、构图和海报文字等关键词 4. 适合用于AI图像生成豆包/Nanobanana等模型并且文字部分用双引号包起来 5. 建议风格电影大片感、视觉冲击力、oc渲染光线追踪、动态模糊、景深、质感真实。请直接输出提示词不要其他解释。"
# 将活动内容进行URL编码
local user_prompt_encoded=$(python3 -c "import urllib.parse; print(urllib.parse.quote('''请根据以下活动文案内容生成适合生成活动海报的AI绘画提示词。$event_content。请生成1. 适合豆包API写实风格的提示词 2. 适合Nanobanana API创意风格的提示词。格式豆包提示词[提示词] 创意提示词:[提示词]'''))")
# 使用简化的请求
local json_data="{\"model\":\"doubao-seed-2-0-pro-260215\",\"messages\":[{\"role\":\"system\",\"content\":\"$system_prompt\"},{\"role\":\"user\",\"content\":\"$user_prompt_encoded\"}],\"max_tokens\":1000}"
# 调用豆包API
response=$(curl -s -X POST "https://ark.cn-beijing.volces.com/api/v3/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $DOUBAO_API_KEY" \
--data-binary "$json_data")
# 保存原始响应用于调试
echo "$response" > /tmp/ai_prompt_response.json
# 解析响应
python3 << 'PYEOF'
import json
import re
try:
with open('/tmp/ai_prompt_response.json', 'r') as f:
data = json.load(f)
if 'error' in data:
print('ERROR: ' + data['error'].get('message', 'Unknown error'))
# 使用默认提示词
print('DOUBAO_PROMPT=Chinese New Year celebration, red lanterns, traditional festival, festive atmosphere, Chinese style')
print('NANO_PROMPT=Chinese New Year, modern design, flat style, vibrant colors, Memphis style')
else:
content = data['choices'][0]['message']['content']
# 提取豆包提示词
doubao_match = re.search(r'豆包提示词[:]\s*([^\n]+)', content)
if doubao_match:
doubao_prompt = doubao_match.group(1).strip()
else:
parts = content.split('创意提示词')
if len(parts) > 0:
doubao_prompt = parts[0].replace('豆包提示词', '').replace('[提示词]', '').strip()
else:
doubao_prompt = content.strip()
# 提取创意提示词
nano_match = re.search(r'创意提示词[:]\s*([^\n]+)', content)
if nano_match:
nano_prompt = nano_match.group(1).strip()
else:
parts = content.split('豆包提示词')
if len(parts) > 1:
nano_prompt = parts[1].replace('创意提示词', '').replace('[提示词]', '').strip()
else:
nano_prompt = ''
print('DOUBAO_PROMPT=' + doubao_prompt)
print('NANO_PROMPT=' + nano_prompt)
except Exception as e:
print('ERROR: ' + str(e))
print('DOUBAO_PROMPT=Chinese New Year celebration, red lanterns, traditional festival, festive atmosphere, Chinese style')
print('NANO_PROMPT=Chinese New Year, modern design, flat style, vibrant colors, Memphis style')
PYEOF
}
# 生成豆包提示词的3个变体
generate_doubao_variations() {
local base_prompt="$1"
# 变体1强调氛围夜景
local var1="$base_prompt, cinematic lighting, night scene, lanterns glowing, festive atmosphere, dramatic"
# 变体2强调人物活动
local var2="$base_prompt, happy crowd, people celebrating, lively atmosphere, traditional costumes, dynamic composition"
# 变体3强调元素特写
local var3="$base_prompt, close-up view, detailed, main subject focus, premium quality, 8k"
echo "$var1"
echo "$var2"
echo "$var3"
}
# 根据参数调用对应函数
case "$1" in
ai)
generate_prompt_with_ai "$2"
;;
variations)
generate_doubao_variations "$2"
;;
*)
echo "======================================"
echo "🤖 AI海报提示词生成器"
echo "======================================"
echo ""
echo "用法: $0 ai <活动文案内容>"
echo ""
echo "示例: "
echo ' $0 ai "活动名称:春节游园会"'
;;
esac

View File

@@ -0,0 +1,231 @@
#!/bin/bash
# 活动上传脚本 - 活动发布 skill
# 支持:上传图片 -> 发布活动
# 获取脚本所在目录的绝对路径
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SKILL_DIR="$(dirname "$SCRIPT_DIR")"
ASSETS_DIR="$SKILL_DIR/assets"
# 加载环境变量
if [ -f "$SCRIPT_DIR/.env" ]; then
source "$SCRIPT_DIR/.env"
elif [ -f "$SKILL_DIR/.env" ]; then
source "$SKILL_DIR/.env"
fi
# 默认配置
UPLOAD_API_URL="${UPLOAD_API_URL:-https://data.tangledup-ai.com/upload?folder=images%2Factivity_banner}"
ACTIVITY_API_URL="${ACTIVITY_API_URL:-https://market.quant-speed.com/api/community/admin-publish/publish_activity/}"
APIKEY="${APIKEY:-123quant-speed}"
PHONE_NUMBER="${PHONE_NUMBER:-18585164448}"
CSRF_TOKEN="${CSRF_TOKEN:-SLbtIrU87YwAvDxE8PfmdG84RqQPp6HeRSEFDvnQEf9fgsElipoRKNJO5oCgabcJ}"
# 上传图片到OSS
upload_image() {
local image_file="$1"
echo "======================================"
echo "📤 步骤1: 上传图片到OSS"
echo "======================================"
echo ""
if [ ! -f "$image_file" ]; then
echo "❌ 图片文件不存在: $image_file"
return 1
fi
echo ">>> 正在上传: $image_file"
# 上传图片
response=$(curl -s -X POST "$UPLOAD_API_URL" \
-H "accept: application/json" \
-H "Content-Type: multipart/form-data" \
-F "file=@$image_file")
# 解析响应
echo "$response" | python3 -c "
import sys, json
try:
data = json.load(sys.stdin)
if data.get('success'):
print('✅ 图片上传成功!')
print(' File URL:', data.get('file_url'))
print(' Object Key:', data.get('object_key'))
else:
print('❌ 图片上传失败:', data.get('message'))
except:
print('❌ 解析响应失败')
print(response)
"
# 提取URL
local file_url=$(echo "$response" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('file_url', ''))" 2>/dev/null)
if [ -n "$file_url" ]; then
echo ""
echo "UPLOAD_URL=$file_url"
return 0
else
return 1
fi
}
# 发布活动 - 使用文件作为description
publish_activity() {
local banner_url="$1"
local title="$2"
local description_file="$3"
local start_time="$4"
local end_time="$5"
local location="$6"
local max_participants="${7:-100}"
echo "======================================"
echo "📝 步骤2: 发布活动"
echo "======================================"
echo ""
echo ">>> 活动标题: $title"
echo ">>> 活动时间: $start_time - $end_time"
echo ">>> 活动地点: $location"
echo ">>> 海报URL: $banner_url"
# 读取description文件内容
local description=""
if [ -f "$description_file" ]; then
description=$(cat "$description_file")
echo ">>> 活动描述文件: $description_file (已读取)"
else
description="$description_file"
fi
# 转义description中的特殊字符处理JSON
description=$(echo "$description" | python3 -c "import sys,json; print(json.dumps(sys.stdin.read()))" | sed 's/^"//' | sed 's/"$//')
echo ""
# 构建活动数据
local activity_json="{
\"signup_form_config\": \"\",
\"description\": \"$description\",
\"title\": \"$title\",
\"banner\": null,
\"banner_url\": \"$banner_url\",
\"start_time\": \"$start_time\",
\"end_time\": \"$end_time\",
\"location\": \"$location\",
\"max_participants\": $max_participants,
\"is_paid\": false,
\"price\": \"0\",
\"is_active\": true,
\"is_visible\": true,
\"auto_confirm\": true,
\"ask_name\": true,
\"ask_phone\": true,
\"ask_wechat\": true,
\"ask_company\": true
}"
# 发布活动
response=$(curl -s -X POST "$ACTIVITY_API_URL?apikey=$APIKEY&phone_number=$PHONE_NUMBER" \
-H "accept: */*" \
-H "Content-Type: application/json" \
-H "X-CSRFTOKEN: $csrf_token" \
-d "$activity_json")
echo "$response" | python3 -c "
import sys, json
try:
data = json.load(sys.stdin)
if data.get('id'):
print('✅ 活动发布成功!')
print(' 活动ID:', data.get('id'))
print(' 活动标题:', data.get('title'))
print(' 创建时间:', data.get('created_at'))
else:
print('❌ 活动发布失败')
print(response)
except:
print('❌ 解析响应失败')
print(response)
"
# 提取活动ID
local activity_id=$(echo "$response" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('id', ''))" 2>/dev/null)
if [ -n "$activity_id" ]; then
echo ""
echo "ACTIVITY_ID=$activity_id"
return 0
else
return 1
fi
}
# 完整流程:上传图片并发布活动
upload_and_publish() {
local image_file="$1"
local title="$2"
local description_file="$3"
local start_time="$4"
local end_time="$5"
local location="$6"
local max_participants="${7:-100}"
echo "======================================"
echo "🎉 开始发布活动"
echo "======================================"
echo ""
# 步骤1: 上传图片
local upload_result=$(upload_image "$image_file")
local banner_url=$(echo "$upload_result" | grep "UPLOAD_URL=" | sed 's/UPLOAD_URL=//')
if [ -z "$banner_url" ]; then
echo "❌ 图片上传失败,无法继续发布活动"
return 1
fi
echo ""
# 步骤2: 发布活动传递description文件路径
publish_activity "$banner_url" "$title" "$description_file" "$start_time" "$end_time" "$location" "$max_participants"
echo ""
echo "======================================"
echo "✅ 活动发布完成!"
echo "======================================"
}
# 根据参数调用对应函数
case "$1" in
upload)
upload_image "$2"
;;
publish)
publish_activity "$2" "$3" "$4" "$5" "$6" "$7" "$8"
;;
all)
upload_and_publish "$2" "$3" "$4" "$5" "$6" "$7"
;;
*)
echo "======================================"
echo "📤 活动发布工具"
echo "======================================"
echo ""
echo "用法: $0 <upload|publish|all> [参数]"
echo ""
echo "命令:"
echo " upload <图片文件> - 仅上传图片"
echo " all <图片文件> <标题> <描述文件> <开始时间> <结束时间> <地点> [最大人数]"
echo " - 上传图片并发布活动"
echo ""
echo "时间格式: 2026-03-04T05:30:03Z"
echo ""
echo "示例: "
echo ' $0 upload /path/to/image.jpg'
echo ' $0 all ./assets/image.jpg "春节游园会" "./assets/活动文案.md" "2026-03-15T10:00:00Z" "2026-03-15T16:00:00Z" "市中心广场"'
;;
esac