TravelContentCreator/scripts/distribution/distribute_example.sh

235 lines
7.7 KiB
Bash
Raw Normal View History

2025-05-13 09:34:59 +08:00
#!/bin/bash
2025-05-13 19:01:27 +08:00
# 内容分发系统数据库版启动脚本(完全从数据库获取数据)
2025-05-13 09:34:59 +08:00
2025-05-13 19:01:27 +08:00
# 设置默认时间戳变量
2025-05-13 09:34:59 +08:00
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
# 设置路径变量
BASE_DIR="/root/autodl-tmp/TravelContentCreator"
LOG_DIR="$BASE_DIR/log"
RESULT_DIR="$BASE_DIR/output/$TIMESTAMP"
OUTPUT_DIR="$RESULT_DIR/distribution_results"
2025-05-13 19:01:27 +08:00
DB_PATH="$BASE_DIR/distribution.db"
# 设置邮件相关变量
2025-05-13 09:34:59 +08:00
EMAIL_FROM="zwysendemail@163.com"
EMAIL_PASSWORD="NMhVGFmCJkGEy3B5"
SUBJECT="文旅小红书带货笔记内容0515"
ZIP_FILENAME="文旅小红书带货笔记内容0515"
2025-05-13 19:01:27 +08:00
# 设置分发配置
ARTICLE_PER_USER=1
2025-05-14 10:05:25 +08:00
MAX_USERS=-1 # 最多发送给多少用户,不限制则设置为-1
TEST_MODE=false # 测试模式,不实际发送邮件
2025-05-14 10:05:25 +08:00
# 测试邮箱配置(新增)
TEST_EMAIL_MODE=true # 是否启用测试邮箱模式
2025-05-14 10:05:25 +08:00
TEST_EMAIL="jinye_huang@foxmail.com" # 测试邮箱地址,所有邮件都会发送到这里
2025-05-13 19:01:27 +08:00
JUDGE_ONLY=true # 只分发审核通过的内容
UNDISTRIBUTED_ONLY=true # 只分发未分发的内容
# 内容筛选配置
TARGET_PRODUCT="" # 为空则不筛选特定产品
TARGET_OBJECT="极爽冲浪馆" # 为空则不筛选特定景点
2025-05-13 19:01:27 +08:00
# 用户筛选配置
TARGET_USER_ID="" # 为空则不筛选特定用户ID
TARGET_USER_EMAIL="" # 为空则不筛选特定用户邮箱
2025-05-13 09:34:59 +08:00
# 创建必要的目录
mkdir -p "$LOG_DIR"
mkdir -p "$OUTPUT_DIR"
# 将日志同时输出到控制台和日志文件
2025-05-13 19:01:27 +08:00
LOG_FILE="$LOG_DIR/distribution_db_$TIMESTAMP.log"
2025-05-13 09:34:59 +08:00
exec > >(tee -a "$LOG_FILE") 2>&1
2025-05-13 19:01:27 +08:00
echo "==================================================="
echo "内容分发系统启动 (数据库全依赖版) - $(date)"
echo "==================================================="
2025-05-13 09:34:59 +08:00
echo "日志保存在: $LOG_FILE"
echo "结果保存在: $RESULT_DIR"
echo "注意: 本次更新不再创建ZIP压缩包所有文件将直接作为邮件附件发送"
echo " 同时,文章内容将添加到邮件正文中"
2025-05-13 09:34:59 +08:00
2025-05-13 19:01:27 +08:00
# 检查数据库是否存在
if [ ! -f "$DB_PATH" ]; then
echo "数据库文件不存在: $DB_PATH"
echo "请先初始化数据库或检查路径是否正确"
exit 1
fi
# 检查内容表是否有记录
CONTENT_COUNT=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM contents;")
if [ "$CONTENT_COUNT" -eq 0 ]; then
echo "警告: 内容表中没有记录,请先导入内容"
exit 1
fi
# 检查用户表是否有记录
USER_COUNT=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM users;")
if [ "$USER_COUNT" -eq 0 ]; then
echo "警告: 用户表中没有记录,请先导入用户"
exit 1
fi
2025-05-14 10:05:25 +08:00
# 检查测试邮箱配置
if [ "$TEST_EMAIL_MODE" = true ]; then
if [ -z "$TEST_EMAIL" ]; then
echo "警告: 测试邮箱模式已启用,但未设置测试邮箱地址"
echo "请在脚本中设置 TEST_EMAIL 变量"
exit 1
else
echo "测试邮箱模式已启用,所有邮件将发送到: $TEST_EMAIL"
fi
fi
2025-05-13 19:01:27 +08:00
# 数据库状态统计
echo "数据库状态统计:"
sqlite3 "$DB_PATH" <<EOF
.mode column
.headers on
.width 50 10
SELECT '总内容数:' as 统计项, COUNT(*) as 数量 FROM contents;
SELECT '已审核通过内容数:' as 统计项, COUNT(*) as 数量 FROM contents WHERE judge_status = 1;
SELECT '已分发内容数:' as 统计项, COUNT(*) as 数量 FROM contents WHERE is_distributed = 1;
SELECT '未分发已审核内容数:' as 统计项, COUNT(*) as 数量 FROM contents WHERE judge_status = 1 AND is_distributed = 0;
SELECT '总用户数:' as 统计项, COUNT(*) as 数量 FROM users;
SELECT '=== 按产品统计 ===' as '';
.width 50 10 10 10
SELECT
product AS 产品名称,
COUNT(*) AS 总数量,
SUM(CASE WHEN judge_status = 1 THEN 1 ELSE 0 END) AS 已审核数,
SUM(CASE WHEN is_distributed = 1 THEN 1 ELSE 0 END) AS 已分发数
FROM contents
GROUP BY product;
EOF
# 构建命令行参数
CMD_ARGS="--output-dir \"$OUTPUT_DIR\" --email-from \"$EMAIL_FROM\" --email-password \"$EMAIL_PASSWORD\" --subject \"$SUBJECT\" --db-path \"$DB_PATH\""
# 添加内容筛选参数
if [ -n "$TARGET_PRODUCT" ]; then
CMD_ARGS="$CMD_ARGS --product \"$TARGET_PRODUCT\""
echo "筛选目标产品: $TARGET_PRODUCT"
fi
if [ -n "$TARGET_OBJECT" ]; then
CMD_ARGS="$CMD_ARGS --object \"$TARGET_OBJECT\""
echo "筛选目标景点: $TARGET_OBJECT"
fi
# 添加用户筛选参数
if [ -n "$TARGET_USER_ID" ]; then
CMD_ARGS="$CMD_ARGS --user-id $TARGET_USER_ID"
echo "筛选目标用户ID: $TARGET_USER_ID"
fi
if [ -n "$TARGET_USER_EMAIL" ]; then
CMD_ARGS="$CMD_ARGS --user-email \"$TARGET_USER_EMAIL\""
echo "筛选目标用户邮箱: $TARGET_USER_EMAIL"
fi
if [ "$MAX_USERS" -gt 0 ]; then
CMD_ARGS="$CMD_ARGS --max-users $MAX_USERS"
echo "限制最大用户数: $MAX_USERS"
fi
# 添加其他参数
if [ "$JUDGE_ONLY" = true ]; then
CMD_ARGS="$CMD_ARGS --judge-only-success"
fi
if [ "$UNDISTRIBUTED_ONLY" = true ]; then
CMD_ARGS="$CMD_ARGS --undistributed-only"
fi
2025-05-14 10:05:25 +08:00
# 测试模式设置
2025-05-13 19:01:27 +08:00
if [ "$TEST_MODE" = true ]; then
CMD_ARGS="$CMD_ARGS --test-mode"
echo "注意: 当前为测试模式,不会实际发送邮件"
fi
2025-05-14 10:05:25 +08:00
# 测试邮箱模式设置(新增)
if [ "$TEST_EMAIL_MODE" = true ]; then
CMD_ARGS="$CMD_ARGS --test-email \"$TEST_EMAIL\""
echo "测试邮箱模式: 所有邮件将发送到 $TEST_EMAIL"
fi
2025-05-13 19:01:27 +08:00
# 设置每用户文章数量
CMD_ARGS="$CMD_ARGS --article-per-user $ARTICLE_PER_USER"
# 设置ZIP文件名
if [ -n "$ZIP_FILENAME" ]; then
CMD_ARGS="$CMD_ARGS --zip-filename \"$ZIP_FILENAME\""
fi
# 执行分发命令
echo "执行内容分发命令..."
echo "参数: $CMD_ARGS"
echo "---------------------------------------------------"
# 使用eval执行命令确保参数被正确解析
eval "python \"$BASE_DIR/scripts/distribution/distribute_content.py\" $CMD_ARGS"
# 检查命令执行结果
if [ $? -eq 0 ]; then
echo "---------------------------------------------------"
echo "分发命令执行成功!"
# 分发后更新数据库统计
echo "分发后数据库统计:"
sqlite3 "$DB_PATH" <<EOF
.mode column
.headers on
.width 50 10
SELECT '总内容数:' as 统计项, COUNT(*) as 数量 FROM contents;
SELECT '已审核通过内容数:' as 统计项, COUNT(*) as 数量 FROM contents WHERE judge_status = 1;
SELECT '已分发内容数:' as 统计项, COUNT(*) as 数量 FROM contents WHERE is_distributed = 1;
SELECT '未分发已审核内容数:' as 统计项, COUNT(*) as 数量 FROM contents WHERE judge_status = 1 AND is_distributed = 0;
SELECT '=== 分发记录统计 ===' as '';
.width 40 10
SELECT COUNT(*) AS '总分发记录数' FROM distributions;
SELECT COUNT(DISTINCT content_id) AS '已分发内容数' FROM distributions;
SELECT COUNT(DISTINCT user_id) AS '已接收用户数' FROM distributions;
SELECT '=== 最近分发批次 ===' as '';
.width 40 20 10
SELECT
batch_id,
substr(distribution_date, 1, 16) as 时间,
COUNT(*) as 记录数
FROM distributions
GROUP BY batch_id
ORDER BY distribution_date DESC
LIMIT 5;
EOF
2025-05-14 10:05:25 +08:00
# 测试模式提示
2025-05-13 19:01:27 +08:00
if [ "$TEST_MODE" = true ]; then
echo "---------------------------------------------------"
echo "测试模式已完成,若要实际发送邮件,请设置 TEST_MODE=false"
echo "然后重新运行此脚本"
fi
2025-05-14 10:05:25 +08:00
# 测试邮箱模式提示
if [ "$TEST_EMAIL_MODE" = true ]; then
echo "---------------------------------------------------"
echo "测试邮箱模式已完成,所有邮件已发送到: $TEST_EMAIL"
echo "若要发送到真实用户邮箱,请设置 TEST_EMAIL_MODE=false"
fi
2025-05-13 19:01:27 +08:00
else
echo "---------------------------------------------------"
echo "错误: 分发命令执行失败!请检查日志文件和错误信息"
fi
echo "==================================================="
echo "内容分发系统执行完毕 - $(date)"
echo "==================================================="