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"
|
2025-05-16 17:19:04 +08:00
|
|
|
|
# EMAIL_FROM="zowoyomedia@163.com"
|
|
|
|
|
|
# EMAIL_PASSWORD="SDj5fK6Tk9YevmsD"
|
|
|
|
|
|
SUBJECT="文旅小红书带货笔记内容0516"
|
|
|
|
|
|
ZIP_FILENAME="文旅小红书带货笔记内容0516"
|
2025-05-13 19:01:27 +08:00
|
|
|
|
|
|
|
|
|
|
# 设置分发配置
|
|
|
|
|
|
ARTICLE_PER_USER=1
|
2025-05-14 10:05:25 +08:00
|
|
|
|
MAX_USERS=-1 # 最多发送给多少用户,不限制则设置为-1
|
2025-05-15 11:13:28 +08:00
|
|
|
|
TEST_MODE=false # 测试模式,不实际发送邮件
|
2025-05-14 10:05:25 +08:00
|
|
|
|
|
|
|
|
|
|
# 测试邮箱配置(新增)
|
2025-05-15 11:13:28 +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 # 只分发未分发的内容
|
|
|
|
|
|
|
|
|
|
|
|
# 内容筛选配置
|
2025-05-15 11:13:28 +08:00
|
|
|
|
TARGET_PRODUCT="" # 为空则不筛选特定产品
|
2025-05-16 17:19:04 +08:00
|
|
|
|
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
|
|
|
|
|
2025-05-16 17:19:04 +08:00
|
|
|
|
# 强制性附件配置
|
|
|
|
|
|
FORCE_ATTACHMENTS="/root/autodl-tmp/TravelContentCreator/hotel_img/标题参考格式-精选.txt"
|
|
|
|
|
|
|
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"
|
2025-05-15 11:13:28 +08:00
|
|
|
|
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-16 17:19:04 +08:00
|
|
|
|
# 检查强制性附件配置
|
|
|
|
|
|
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
|
|
|
|
|
|
|
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-16 17:19:04 +08:00
|
|
|
|
# 强制性附件设置
|
|
|
|
|
|
if [ -n "$FORCE_ATTACHMENTS" ]; then
|
|
|
|
|
|
CMD_ARGS="$CMD_ARGS --force-attachments \"$FORCE_ATTACHMENTS\""
|
|
|
|
|
|
echo "已添加强制性附件到命令参数中"
|
|
|
|
|
|
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 "==================================================="
|