260 lines
8.6 KiB
Bash
Executable File
260 lines
8.6 KiB
Bash
Executable File
#!/bin/bash
|
||
# 内容分发系统数据库版启动脚本(完全从数据库获取数据)
|
||
|
||
# 设置默认时间戳变量
|
||
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"
|
||
DB_PATH="$BASE_DIR/distribution.db"
|
||
|
||
# 设置邮件相关变量
|
||
EMAIL_FROM="zwysendemail@163.com"
|
||
EMAIL_PASSWORD="NMhVGFmCJkGEy3B5"
|
||
# EMAIL_FROM="zowoyomedia@163.com"
|
||
# EMAIL_PASSWORD="SDj5fK6Tk9YevmsD"
|
||
SUBJECT="文旅小红书带货笔记内容0519"
|
||
ZIP_FILENAME="文旅小红书带货笔记内容0519"
|
||
|
||
# 设置分发配置
|
||
ARTICLE_PER_USER=1
|
||
MAX_USERS=-1 # 最多发送给多少用户,不限制则设置为-1
|
||
TEST_MODE=false # 测试模式,不实际发送邮件
|
||
|
||
# 测试邮箱配置(新增)
|
||
TEST_EMAIL_MODE=false # 是否启用测试邮箱模式
|
||
TEST_EMAIL="jinye_huang@foxmail.com" # 测试邮箱地址,所有邮件都会发送到这里
|
||
|
||
JUDGE_ONLY=true # 只分发审核通过的内容
|
||
UNDISTRIBUTED_ONLY=true # 只分发未分发的内容
|
||
|
||
# 内容筛选配置
|
||
TARGET_PRODUCT="" # 为空则不筛选特定产品
|
||
TARGET_OBJECT="北洛秘境盛季酒店" # 为空则不筛选特定景点
|
||
|
||
# 用户筛选配置
|
||
TARGET_USER_ID="" # 为空则不筛选特定用户ID
|
||
TARGET_USER_EMAIL="" # 为空则不筛选特定用户邮箱
|
||
|
||
# 强制性附件配置
|
||
FORCE_ATTACHMENTS="/root/autodl-tmp/TravelContentCreator/hotel_img/标题参考格式-精选.txt"
|
||
|
||
# 创建必要的目录
|
||
mkdir -p "$LOG_DIR"
|
||
mkdir -p "$OUTPUT_DIR"
|
||
|
||
# 将日志同时输出到控制台和日志文件
|
||
LOG_FILE="$LOG_DIR/distribution_db_$TIMESTAMP.log"
|
||
exec > >(tee -a "$LOG_FILE") 2>&1
|
||
|
||
echo "==================================================="
|
||
echo "内容分发系统启动 (数据库全依赖版) - $(date)"
|
||
echo "==================================================="
|
||
echo "日志保存在: $LOG_FILE"
|
||
echo "结果保存在: $RESULT_DIR"
|
||
echo "注意: 本次更新不再创建ZIP压缩包,所有文件将直接作为邮件附件发送"
|
||
echo " 同时,文章内容将添加到邮件正文中"
|
||
|
||
# 检查数据库是否存在
|
||
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
|
||
|
||
# 检查测试邮箱配置
|
||
if [ "$TEST_EMAIL_MODE" = true ]; then
|
||
if [ -z "$TEST_EMAIL" ]; then
|
||
echo "警告: 测试邮箱模式已启用,但未设置测试邮箱地址"
|
||
echo "请在脚本中设置 TEST_EMAIL 变量"
|
||
exit 1
|
||
else
|
||
echo "测试邮箱模式已启用,所有邮件将发送到: $TEST_EMAIL"
|
||
fi
|
||
fi
|
||
|
||
# 检查强制性附件配置
|
||
if [ -n "$FORCE_ATTACHMENTS" ]; then
|
||
echo "已配置强制性附件: $FORCE_ATTACHMENTS"
|
||
# 验证文件是否存在
|
||
IFS=',' read -ra ATTACHMENT_ARRAY <<< "$FORCE_ATTACHMENTS"
|
||
for attachment in "${ATTACHMENT_ARRAY[@]}"; do
|
||
if [ ! -e "$attachment" ]; then
|
||
echo "警告: 强制性附件文件或目录不存在: $attachment"
|
||
else
|
||
echo "已确认强制性附件存在: $attachment"
|
||
fi
|
||
done
|
||
fi
|
||
|
||
# 数据库状态统计
|
||
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
|
||
|
||
# 测试模式设置
|
||
if [ "$TEST_MODE" = true ]; then
|
||
CMD_ARGS="$CMD_ARGS --test-mode"
|
||
echo "注意: 当前为测试模式,不会实际发送邮件"
|
||
fi
|
||
|
||
# 测试邮箱模式设置(新增)
|
||
if [ "$TEST_EMAIL_MODE" = true ]; then
|
||
CMD_ARGS="$CMD_ARGS --test-email \"$TEST_EMAIL\""
|
||
echo "测试邮箱模式: 所有邮件将发送到 $TEST_EMAIL"
|
||
fi
|
||
|
||
# 强制性附件设置
|
||
if [ -n "$FORCE_ATTACHMENTS" ]; then
|
||
CMD_ARGS="$CMD_ARGS --force-attachments \"$FORCE_ATTACHMENTS\""
|
||
echo "已添加强制性附件到命令参数中"
|
||
fi
|
||
|
||
# 设置每用户文章数量
|
||
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
|
||
|
||
# 测试模式提示
|
||
if [ "$TEST_MODE" = true ]; then
|
||
echo "---------------------------------------------------"
|
||
echo "测试模式已完成,若要实际发送邮件,请设置 TEST_MODE=false"
|
||
echo "然后重新运行此脚本"
|
||
fi
|
||
|
||
# 测试邮箱模式提示
|
||
if [ "$TEST_EMAIL_MODE" = true ]; then
|
||
echo "---------------------------------------------------"
|
||
echo "测试邮箱模式已完成,所有邮件已发送到: $TEST_EMAIL"
|
||
echo "若要发送到真实用户邮箱,请设置 TEST_EMAIL_MODE=false"
|
||
fi
|
||
else
|
||
echo "---------------------------------------------------"
|
||
echo "错误: 分发命令执行失败!请检查日志文件和错误信息"
|
||
fi
|
||
|
||
echo "==================================================="
|
||
echo "内容分发系统执行完毕 - $(date)"
|
||
echo "===================================================" |