opensource
This commit is contained in:
6
cron-docker/scripts/work/book.toml
Normal file
6
cron-docker/scripts/work/book.toml
Normal file
@@ -0,0 +1,6 @@
|
||||
[book]
|
||||
authors = []
|
||||
language = "zh"
|
||||
src = "CloudFlare-AI-Insight-Daily"
|
||||
title = "By 何夕2077"
|
||||
create-missing = true
|
||||
136
cron-docker/scripts/work/gen.sh
Normal file
136
cron-docker/scripts/work/gen.sh
Normal file
@@ -0,0 +1,136 @@
|
||||
#!/bin/sh
|
||||
# 这是一个兼容 POSIX sh 的脚本,用于从日刊 Markdown 文件生成一个摘要文件。
|
||||
|
||||
# 检查是否提供了目录参数
|
||||
if [ -z "$1" ]; then
|
||||
echo "用法: $0 <存放markdown文件的目录路径>"
|
||||
echo "例如: $0 path/to/your/daily_notes"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TARGET_DIR="$1" # 例如 path/to/your/daily_notes
|
||||
|
||||
# 1. 确定 TARGET_DIR 的父目录 和 TARGET_DIR 的基本名称
|
||||
# dirname 和 basename 是 POSIX 标准工具
|
||||
PARENT_OF_TARGET_DIR=$(dirname "$TARGET_DIR")
|
||||
TARGET_DIR_BASENAME=$(basename "$TARGET_DIR")
|
||||
|
||||
# 如果父目录是 '.', 则实际路径前缀为空,否则为 "父目录/"
|
||||
# 这用于构建输出文件的完整路径,同时确保相对路径的简洁性
|
||||
if [ "$PARENT_OF_TARGET_DIR" = "." ]; then
|
||||
OUTPUT_PATH_PREFIX=""
|
||||
else
|
||||
OUTPUT_PATH_PREFIX="${PARENT_OF_TARGET_DIR}/"
|
||||
# 确保父目录存在,如果不存在则创建
|
||||
# mkdir -p 虽然不是最基础的 POSIX 标准,但在几乎所有现代系统中都可用
|
||||
mkdir -p "$PARENT_OF_TARGET_DIR"
|
||||
fi
|
||||
|
||||
OUTPUT_FILE="${OUTPUT_PATH_PREFIX}SUMMARY.md"
|
||||
|
||||
# 确保目标目录存在
|
||||
if [ ! -d "$TARGET_DIR" ]; then
|
||||
echo "错误: 目录 '$TARGET_DIR' 不存在。"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 查找所有 YYYY-MM-DD.md 格式的文件路径,并按名称反向排序(最新日期在前)
|
||||
# 使用 find 和 sort,这是非常标准和可移植的方法。
|
||||
# 将结果存储在一个换行符分隔的字符串变量中。
|
||||
files_paths=$(find "$TARGET_DIR" -maxdepth 1 -type f -name "????-??-??.md" | sort -r)
|
||||
|
||||
# 检查是否找到了任何文件
|
||||
if [ -z "$files_paths" ]; then
|
||||
echo "在目录 '$TARGET_DIR' 中没有找到 'YYYY-MM-DD.md' 格式的文件。"
|
||||
echo "# Summary" > "$OUTPUT_FILE"
|
||||
echo "" >> "$OUTPUT_FILE"
|
||||
echo "<!-- 未找到日刊文件 -->" >> "$OUTPUT_FILE"
|
||||
echo "$OUTPUT_FILE 已在 '$PARENT_OF_TARGET_DIR' (或当前目录) 中生成。"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# --- 复制最新文件到 TARGET_DIR 的父目录 ---
|
||||
# 从已排序的列表中获取最新的文件(第一行)
|
||||
latest_file_path=$(echo "$files_paths" | head -n 1)
|
||||
latest_file_basename=$(basename "$latest_file_path")
|
||||
|
||||
if [ -n "$latest_file_basename" ]; then
|
||||
source_file_path="$latest_file_path"
|
||||
destination_file_path="${OUTPUT_PATH_PREFIX}${latest_file_basename}"
|
||||
|
||||
copy_needed="true"
|
||||
# 检查源文件和目标文件是否是同一个。realpath 不是 POSIX 标准,但脚本会检查它是否存在。
|
||||
if command -v realpath >/dev/null 2>&1; then
|
||||
abs_source_file_path=$(realpath "$source_file_path")
|
||||
if [ -f "$destination_file_path" ]; then
|
||||
abs_destination_file_path=$(realpath "$destination_file_path")
|
||||
# 使用 POSIX 标准的 `=` 进行字符串比较
|
||||
if [ "$abs_source_file_path" = "$abs_destination_file_path" ]; then
|
||||
echo "最新的文件 '${source_file_path}' 已在目标位置 '${destination_file_path}',无需复制。"
|
||||
copy_needed="false"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
echo "警告: 'realpath' 命令未找到。如果源文件和目标位置相同,可能会尝试重复复制。"
|
||||
if [ "$source_file_path" = "$destination_file_path" ]; then
|
||||
echo "最新的文件 '${source_file_path}' 已在目标位置 '${destination_file_path}' (基于路径比较),无需复制。"
|
||||
copy_needed="false"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$copy_needed" = "true" ]; then
|
||||
echo "正在复制 '${source_file_path}' 到 '${destination_file_path}'..."
|
||||
if cp "$source_file_path" "$destination_file_path"; then
|
||||
echo "最新文件复制成功。"
|
||||
else
|
||||
echo "警告: 将最新文件复制到 '${destination_file_path}' 失败。请检查权限和路径。"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
echo "未找到最新文件,无法执行复制操作。"
|
||||
fi
|
||||
# --- 复制结束 ---
|
||||
|
||||
|
||||
# 开始写入 SUMMARY.md
|
||||
echo "# Summary" > "$OUTPUT_FILE"
|
||||
|
||||
# 写入 "Today" 链接 (指向复制到父目录的文件)
|
||||
if [ -n "$latest_file_basename" ]; then
|
||||
echo "" >> "$OUTPUT_FILE"
|
||||
echo "[Today]($latest_file_basename)" >> "$OUTPUT_FILE"
|
||||
else
|
||||
echo "<!-- 未找到最新文件 -->" >> "$OUTPUT_FILE"
|
||||
fi
|
||||
|
||||
current_month_header=""
|
||||
|
||||
# 使用 while read 循环逐行处理文件路径列表,这是处理多行文本的标准 sh 做法
|
||||
echo "$files_paths" | while read -r file_path_from_list; do
|
||||
# 在循环内为每一行获取文件名
|
||||
filename_basename=$(basename "$file_path_from_list")
|
||||
|
||||
# 使用 cut 命令进行子字符串提取,以兼容 sh (${var:offset:length} 是 bash 专有语法)
|
||||
year_month=$(echo "$filename_basename" | cut -c1-7) # "YYYY-MM"
|
||||
month_day_part=$(echo "$filename_basename" | cut -c6-10) # "MM-DD"
|
||||
|
||||
if [ "$year_month" != "$current_month_header" ]; then
|
||||
echo "" >> "$OUTPUT_FILE"
|
||||
echo "# $year_month" >> "$OUTPUT_FILE"
|
||||
current_month_header="$year_month"
|
||||
fi
|
||||
|
||||
link_text="${month_day_part}-日刊"
|
||||
# 链接路径是相对于 SUMMARY.md 的,指向原始目录中的文件
|
||||
link_path="${TARGET_DIR_BASENAME}/${filename_basename}"
|
||||
|
||||
echo "- [$link_text]($link_path)" >> "$OUTPUT_FILE"
|
||||
done
|
||||
|
||||
echo "" # 在文件末尾添加一个空行
|
||||
echo "SUMMARY.md 文件已在 '${OUTPUT_FILE}' 生成。"
|
||||
if [ "$PARENT_OF_TARGET_DIR" = "." ]; then
|
||||
echo " (即当前工作目录的 SUMMARY.md)"
|
||||
else
|
||||
echo " (即目录 '${PARENT_OF_TARGET_DIR}' 下的 SUMMARY.md)"
|
||||
fi
|
||||
227
cron-docker/scripts/work/github.sh
Normal file
227
cron-docker/scripts/work/github.sh
Normal file
@@ -0,0 +1,227 @@
|
||||
#!/bin/sh
|
||||
|
||||
# --- 配置 ---
|
||||
# 从环境变量读取,或者直接在此处设置
|
||||
# 强烈建议使用环境变量以保证安全
|
||||
GITHUB_TOKEN=${GITHUB_TOKEN} # 替换 YOUR_GITHUB_PAT 或设置环境变量
|
||||
OWNER=${OWNER} # 你的 GitHub 用户名或组织名
|
||||
REPO=${REPO_NAME} # 你的仓库名称
|
||||
BRANCH="main" # 目标分支 (可能是 main, master 等)
|
||||
|
||||
set -e # 如果任何命令失败,脚本将退出
|
||||
set -o pipefail # 如果管道中的任何命令失败,则整个管道失败
|
||||
|
||||
# API基础URL
|
||||
API_URL="https://api.github.com/repos/${OWNER}/${REPO}/contents"
|
||||
|
||||
# --- 帮助信息 ---
|
||||
usage() {
|
||||
echo "用法: $0 <action> [options]"
|
||||
echo ""
|
||||
echo "Actions:"
|
||||
echo " delete <file_path_in_repo> <commit_message>"
|
||||
echo " 删除仓库中的指定文件。"
|
||||
echo " Example: $0 delete 'path/to/remote/file.txt' 'Delete old file'"
|
||||
echo ""
|
||||
echo " upload <local_file_path> <file_path_in_repo> <commit_message>"
|
||||
echo " 上传/更新本地文件到仓库中的指定路径。"
|
||||
echo " Example: $0 upload './local/new_file.txt' 'path/to/remote/new_file.txt' 'Add new feature file'"
|
||||
echo ""
|
||||
echo "请确保 GITHUB_TOKEN 环境变量已设置。"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# --- 必要检查 ---
|
||||
if [ -z "$GITHUB_TOKEN" ]; then
|
||||
echo "错误: GITHUB_TOKEN 环境变量未设置。"
|
||||
usage
|
||||
fi
|
||||
|
||||
if ! command -v curl &> /dev/null; then
|
||||
echo "错误: curl 未安装。"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v jq &> /dev/null; then
|
||||
echo "错误: jq 未安装。"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v mktemp &> /dev/null; then
|
||||
echo "错误: mktemp 未安装。"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# --- 辅助函数:获取文件SHA (如果文件存在) ---
|
||||
get_file_sha() {
|
||||
local file_path_in_repo="$1"
|
||||
local response
|
||||
response=$(curl -s -H "Authorization: token ${GITHUB_TOKEN}" \
|
||||
-H "Accept: application/vnd.github.v3+json" \
|
||||
"${API_URL}/${file_path_in_repo}?ref=${BRANCH}")
|
||||
|
||||
if echo "$response" | jq -e '.sha' > /dev/null; then
|
||||
echo "$response" | jq -r '.sha'
|
||||
else
|
||||
# 文件不存在或获取SHA失败
|
||||
echo ""
|
||||
fi
|
||||
}
|
||||
|
||||
# --- 功能函数:删除文件 ---
|
||||
delete_github_file() {
|
||||
local file_path_in_repo="$1"
|
||||
local commit_message="$2"
|
||||
local tmp_payload_file # 声明临时文件变量
|
||||
|
||||
echo "正在尝试删除仓库中的文件: ${file_path_in_repo} ..."
|
||||
|
||||
local file_sha
|
||||
file_sha=$(get_file_sha "${file_path_in_repo}")
|
||||
|
||||
if [ -z "$file_sha" ]; then
|
||||
echo "错误: 文件 '${file_path_in_repo}' 在分支 '${BRANCH}' 上未找到,或无法获取其SHA。"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "获取到文件SHA: ${file_sha}"
|
||||
|
||||
# 创建临时文件来存储JSON payload
|
||||
tmp_payload_file=$(mktemp)
|
||||
# 确保脚本退出时删除临时文件
|
||||
trap 'rm -f "$tmp_payload_file"' EXIT HUP INT QUIT TERM
|
||||
|
||||
printf '{"message": "%s", "sha": "%s", "branch": "%s"}' \
|
||||
"$commit_message" \
|
||||
"$file_sha" \
|
||||
"$BRANCH" > "$tmp_payload_file"
|
||||
|
||||
echo "发送删除请求 (payload from: $tmp_payload_file)..."
|
||||
response_code=$(curl -s -o /dev/null -w "%{http_code}" \
|
||||
-X DELETE \
|
||||
-H "Authorization: token ${GITHUB_TOKEN}" \
|
||||
-H "Accept: application/vnd.github.v3+json" \
|
||||
-H "Content-Type: application/json" \
|
||||
--data-binary @"$tmp_payload_file" \
|
||||
"${API_URL}/${file_path_in_repo}")
|
||||
|
||||
# 清理临时文件和trap
|
||||
rm -f "$tmp_payload_file"
|
||||
trap - EXIT HUP INT QUIT TERM # 清除trap
|
||||
|
||||
if [ "$response_code" -eq 200 ] || [ "$response_code" -eq 204 ]; then
|
||||
echo "文件 '${file_path_in_repo}' 删除成功。HTTP状态: ${response_code}"
|
||||
else
|
||||
echo "错误: 删除文件 '${file_path_in_repo}' 失败。HTTP状态: ${response_code}"
|
||||
# printf '{"message": "%s", "sha": "%s", "branch": "%s"}' "$commit_message" "$file_sha" "$BRANCH" > payload.json
|
||||
# curl -i -X DELETE \
|
||||
# -H "Authorization: token ${GITHUB_TOKEN}" \
|
||||
# -H "Accept: application/vnd.github.v3+json" \
|
||||
# -H "Content-Type: application/json" \
|
||||
# --data-binary @payload.json \
|
||||
# "${API_URL}/${file_path_in_repo}"
|
||||
# rm payload.json
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# --- 功能函数:上传/更新文件 ---
|
||||
upload_github_file() {
|
||||
local local_file_path="$1"
|
||||
local file_path_in_repo="$2"
|
||||
local commit_message="$3"
|
||||
local tmp_payload_file # 声明临时文件变量
|
||||
|
||||
if [ ! -f "$local_file_path" ]; then
|
||||
echo "错误: 本地文件 '${local_file_path}' 未找到。"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "正在准备上传/更新文件: ${local_file_path} 到仓库路径: ${file_path_in_repo} ..."
|
||||
|
||||
local content_base64
|
||||
if [[ "$(uname)" == "Darwin" ]]; then # macOS
|
||||
content_base64=$(base64 < "$local_file_path")
|
||||
else # Assume GNU/Linux
|
||||
content_base64=$(base64 -w 0 < "$local_file_path")
|
||||
fi
|
||||
|
||||
local current_sha
|
||||
current_sha=$(get_file_sha "${file_path_in_repo}")
|
||||
|
||||
local json_payload_template='{"message": "%s", "content": "%s", "branch": "%s"%s}'
|
||||
local sha_part=""
|
||||
|
||||
if [ -n "$current_sha" ]; then
|
||||
echo "文件 '${file_path_in_repo}' 已存在,SHA: ${current_sha}。将进行更新。"
|
||||
sha_part=$(printf ', "sha": "%s"' "$current_sha")
|
||||
else
|
||||
echo "文件 '${file_path_in_repo}' 不存在。将创建新文件。"
|
||||
fi
|
||||
|
||||
# 创建临时文件来存储JSON payload
|
||||
tmp_payload_file=$(mktemp)
|
||||
# 确保脚本退出时删除临时文件
|
||||
trap 'rm -f "$tmp_payload_file"' EXIT HUP INT QUIT TERM
|
||||
|
||||
printf "$json_payload_template" \
|
||||
"$commit_message" \
|
||||
"$content_base64" \
|
||||
"$BRANCH" \
|
||||
"$sha_part" > "$tmp_payload_file"
|
||||
|
||||
echo "发送上传/更新请求 (payload from: $tmp_payload_file)..."
|
||||
response_code=$(curl -s -o /dev/null -w "%{http_code}" \
|
||||
-X PUT \
|
||||
-H "Authorization: token ${GITHUB_TOKEN}" \
|
||||
-H "Accept: application/vnd.github.v3+json" \
|
||||
-H "Content-Type: application/json" \
|
||||
--data-binary @"$tmp_payload_file" \
|
||||
"${API_URL}/${file_path_in_repo}")
|
||||
|
||||
# 清理临时文件和trap
|
||||
rm -f "$tmp_payload_file"
|
||||
trap - EXIT HUP INT QUIT TERM # 清除trap
|
||||
|
||||
if [ "$response_code" -eq 200 ] || [ "$response_code" -eq 201 ]; then # 200 for update, 201 for create
|
||||
echo "文件 '${file_path_in_repo}' 上传/更新成功。HTTP状态: ${response_code}"
|
||||
else
|
||||
echo "错误: 上传/更新文件 '${file_path_in_repo}' 失败。HTTP状态: ${response_code}"
|
||||
# printf "$json_payload_template" "$commit_message" "$content_base64" "$BRANCH" "$sha_part" > payload.json
|
||||
# curl -i -X PUT \
|
||||
# -H "Authorization: token ${GITHUB_TOKEN}" \
|
||||
# -H "Accept: application/vnd.github.v3+json" \
|
||||
# -H "Content-Type: application/json" \
|
||||
# --data-binary @payload.json \
|
||||
# "${API_URL}/${file_path_in_repo}"
|
||||
# rm payload.json
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# --- 主逻辑 ---
|
||||
ACTION="${1:-}"
|
||||
|
||||
case "$ACTION" in
|
||||
delete)
|
||||
if [ "$#" -ne 3 ]; then
|
||||
echo "错误: delete 操作需要 <file_path_in_repo> 和 <commit_message> 参数。"
|
||||
usage
|
||||
fi
|
||||
delete_github_file "$2" "$3"
|
||||
;;
|
||||
upload)
|
||||
if [ "$#" -ne 4 ]; then
|
||||
echo "错误: upload 操作需要 <local_file_path>, <file_path_in_repo> 和 <commit_message> 参数。"
|
||||
usage
|
||||
fi
|
||||
upload_github_file "$2" "$3" "$4"
|
||||
;;
|
||||
*)
|
||||
echo "错误: 未知操作或缺少操作参数。"
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
||||
58
cron-docker/scripts/work/replace.sh
Normal file
58
cron-docker/scripts/work/replace.sh
Normal file
@@ -0,0 +1,58 @@
|
||||
#!/bin/sh
|
||||
|
||||
# 检查是否提供了目录参数
|
||||
if [ -z "$1" ]; then
|
||||
echo "用法: $0 <目标目录>"
|
||||
echo "例如: $0 /path/to/your/directory"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
IMG_PROXY_URL=${IMG_PROXY_URL}
|
||||
TARGET_DIR="$1"
|
||||
|
||||
# 检查目录是否存在
|
||||
if [ ! -d "$TARGET_DIR" ]; then
|
||||
echo "错误: 目录 '$TARGET_DIR' 不存在。"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "将在目录 '$TARGET_DIR' 下的文件中执行以下替换:"
|
||||
echo "1. 'upload.chinaz.com' -> 'pic.chinaz.com'"
|
||||
echo "2. 'https://pic.chinaz.com' -> '$IMG_PROXY_URL/?pp=https://pic.chinaz.com'"
|
||||
|
||||
# 定义替换规则
|
||||
# 注意:
|
||||
# - 第一个替换中的 '.' 需要转义,因为它在正则表达式中是特殊字符。
|
||||
# - 第二个替换中的 '/' 在sed的s命令中是分隔符,所以我们需要使用其他分隔符,
|
||||
# 例如 '#',或者对规则中的 '/' 进行转义。使用其他分隔符更清晰。
|
||||
# - 替换的顺序很重要。先将 upload.chinaz.com 替换为 pic.chinaz.com,
|
||||
# 这样新生成的 pic.chinaz.com 才能被第二条规则匹配并加上代理。
|
||||
|
||||
RULE1_OLD="upload\.chinaz\.com" # 转义 '.'
|
||||
RULE1_NEW="pic.chinaz.com"
|
||||
|
||||
RULE2_OLD_SED_SAFE="https://pic\.chinaz\.com" # 使用 '#' 作为分隔符,所以不需要转义 '/',但 '.' 仍需转义
|
||||
RULE2_NEW_SED_SAFE="$IMG_PROXY_URL/?pp=https://pic.chinaz.com" # URL中的'?'在替换部分不需要特殊处理
|
||||
|
||||
# 查找目录下的所有普通文件(排除目录和符号链接等)并执行替换
|
||||
# 使用 -print0 和 xargs -0 来安全处理包含空格或特殊字符的文件名
|
||||
# 或者使用 find ... -exec sed ... {} +
|
||||
# 这里为了清晰,使用 find 和 while read 循环,同样能安全处理特殊文件名
|
||||
|
||||
find "$TARGET_DIR" -type f -print0 | while IFS= read -r -d $'\0' file; do
|
||||
echo "正在处理文件: $file"
|
||||
|
||||
# 执行第一个替换
|
||||
sed -i "s/$RULE1_OLD/$RULE1_NEW/g" "$file"
|
||||
|
||||
# 执行第二个替换 (使用 # 作为分隔符)
|
||||
sed -i "s#$RULE2_OLD_SED_SAFE#$RULE2_NEW_SED_SAFE#g" "$file"
|
||||
|
||||
# 如果想在一个sed命令中完成,可以这样:
|
||||
# sed -i -e "s/$RULE1_OLD/$RULE1_NEW/g" -e "s#$RULE2_OLD_SED_SAFE#$RULE2_NEW_SED_SAFE#g" "$file"
|
||||
# 这样可以减少文件的读写次数,对于大文件或大量文件效率稍高。
|
||||
# 为了代码可读性,分开写了。
|
||||
|
||||
done
|
||||
|
||||
echo "替换完成。"
|
||||
Reference in New Issue
Block a user