TravelContentCreator/scripts/distribution/distribute_example.sh

260 lines
8.7 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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="文旅小红书带货笔记内容0520"
ZIP_FILENAME="文旅小红书带货笔记内容0520"
# 设置分发配置
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, /root/autodl-tmp/TravelContentCreator/hotel_img/poster/极爽冲浪-门票.jpg"
# 创建必要的目录
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 "==================================================="