运营一个博客,要做的事情很多:写文章、发布、检查收录、监控流量、定期备份……如果全靠手动,时间都被琐事占满了。

本文分享5个我常用的自动化脚本,帮你把重复劳动交给机器,把时间留给创作。

一、为什么需要自动化?

手动运营的痛点:

  • 发布文章要登录后台、上传图片、设置标签
  • 检查收录要一个个网站去查
  • 备份容易忘记
  • 数据统计要手动记录

自动化带来的价值:

  • 节省时间(每天至少30分钟)
  • 减少出错(机器比人可靠)
  • 数据积累(自动记录历史数据)
  • 规模化(一个脚本管理多个站点)

二、脚本1:自动构建发布

功能: 一键构建并部署Hugo博客

#!/bin/bash
# 文件名: deploy.sh
# 用法: ./deploy.sh

BLOG_DIR="/var/www/blog"
LOG_FILE="/var/log/blog-deploy.log"

echo "========== $(date '+%Y-%m-%d %H:%M:%S') ==========" >> "$LOG_FILE"

cd "$BLOG_DIR"

# 拉取最新内容(如果有远程仓库)
git pull origin main 2>/dev/null

# 构建站点
hugo --gc --minify >> "$LOG_FILE" 2>&1

if [ $? -eq 0 ]; then
    echo "✅ 构建成功" | tee -a "$LOG_FILE"
    # 重载Nginx
    systemctl reload nginx
    # 可选:同步到CDN
    # rsync -avz public/ user@cdn:/var/www/blog/
else
    echo "❌ 构建失败,查看日志: $LOG_FILE" | tee -a "$LOG_FILE"
fi

使用方法:

chmod +x deploy.sh
./deploy.sh

进阶用法: 配合Git Hook实现推送自动部署


三、脚本2:新文章模板生成器

功能: 快速创建符合SEO规范的文章模板

#!/bin/bash
# 文件名: new_post.sh
# 用法: ./new_post.sh "文章标题" "分类" "标签1,标签2"

BLOG_DIR="/var/www/blog"
TITLE="$1"
CATEGORY="$2"
TAGS="$3"

if [ -z "$TITLE" ]; then
    echo "用法: $0 \"文章标题\" \"分类\" \"标签1,标签2\""
    exit 1
fi

# 生成文件名(简化处理)
SLUG=$(echo "$TITLE" | sed 's/ /-/g' | tr '[:upper:]' '[:lower:]')
DATE=$(date '+%Y-%m-%dT%H:%M:%S+08:00')
TODAY=$(date '+%Y-%m-%d')

# 创建文章
cat > "$BLOG_DIR/content/posts/${TODAY}-${SLUG}.md" << EOF
---
title: "$TITLE"
date: $DATE
draft: true
tags: [$(echo "$TAGS" | sed 's/,/, /g')]
categories: ["$CATEGORY"]
description: ""
---

## 引言

<!-- 在这里写引言,50-100字,包含关键词 -->

## 正文

<!-- 正文内容 -->

## 总结

<!-- 总结部分 -->

---

**相关阅读:**
- [相关文章1](/posts/xxx)
- [相关文章2](/posts/xxx)
EOF

echo "✅ 文章已创建: content/posts/${TODAY}-${SLUG}.md"
echo "📝 请编辑文章内容,完成后将 draft: true 改为 draft: false"

使用方法:

chmod +x new_post.sh
./new_post.sh "我的新文章" "科技观察" "AI,工具"

四、脚本3:收录监控

功能: 检查搜索引擎收录情况

#!/bin/bash
# 文件名: check_index.sh
# 用法: ./check_index.sh yourdomain.com

DOMAIN="$1"

if [ -z "$DOMAIN" ]; then
    echo "用法: $0 yourdomain.com"
    exit 1
fi

echo "========== 收录检查 $(date '+%Y-%m-%d %H:%M') =========="
echo ""

# Google收录
echo "🔍 Google收录:"
GOOGLE_COUNT=$(curl -s "https://www.google.com/search?q=site:$DOMAIN" \
    -H "User-Agent: Mozilla/5.0" | grep -oP '约 \K[\d,]+|resultStats">\K[\d,]+' \
    | head -1 | tr -d ',')

if [ -n "$GOOGLE_COUNT" ]; then
    echo "   $GOOGLE_COUNT 页"
else
    echo "   未收录或查询失败"
fi

# 百度收录
echo ""
echo "🔍 百度收录:"
BAIDU_COUNT=$(curl -s "https://www.baidu.com/s?wd=site:$DOMAIN" \
    -H "User-Agent: Mozilla/5.0" | grep -oP '找到相关结果数约(\K[\d,]+)' \
    | head -1 | tr -d ',')

if [ -n "$BAIDU_COUNT" ]; then
    echo "   $BAIDU_COUNT 页"
else
    echo "   未收录或查询失败"
fi

# 必应收录
echo ""
echo "🔍 必应收录:"
BING_COUNT=$(curl -s "https://www.bing.com/search?q=site:$DOMAIN" \
    -H "User-Agent: Mozilla/5.0" | grep -oP '<span class="sb_count"[^>]*>\K[\d,]+' \
    | head -1 | tr -d ',')

if [ -n "$BING_COUNT" ]; then
    echo "   $BING_COUNT 页"
else
    echo "   未收录或查询失败"
fi

echo ""
echo "================================"

定时执行: 每周一自动检查并发送报告


五、脚本4:自动备份

功能: 定期备份网站内容和数据库

#!/bin/bash
# 文件名: backup.sh
# 用法: ./backup.sh

BLOG_DIR="/var/www/blog"
BACKUP_DIR="/var/backup/blog"
DATE=$(date '+%Y%m%d')
KEEP_DAYS=30

mkdir -p "$BACKUP_DIR"

# 备份内容
echo "📦 正在备份..."
tar -czf "$BACKUP_DIR/blog_content_$DATE.tar.gz" \
    -C "$BLOG_DIR" content/ static/ hugo.yaml layouts/

# 备份数据库(如果有)
# mysqldump -u user -p database > "$BACKUP_DIR/db_$DATE.sql"

# 清理旧备份
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +$KEEP_DAYS -delete

# 计算备份大小
SIZE=$(du -h "$BACKUP_DIR/blog_content_$DATE.tar.gz" | cut -f1)

echo "✅ 备份完成: $BACKUP_DIR/blog_content_$DATE.tar.gz ($SIZE)"
echo "📁 保留最近 $KEEP_DAYS 天的备份"

# 可选:上传到云存储
# rclone copy "$BACKUP_DIR/blog_content_$DATE.tar.gz" remote:backup/

定时执行: 每天凌晨3点自动备份

# 添加到crontab
0 3 * * * /var/www/blog/scripts/backup.sh >> /var/log/blog-backup.log 2>&1

六、脚本5:流量统计报告

功能: 生成简单的流量统计报告

#!/bin/bash
# 文件名: traffic_report.sh
# 用法: ./traffic_report.sh

LOG_FILE="/var/log/nginx/blog.access.log"
REPORT_FILE="/var/www/blog/reports/traffic_$(date '+%Y%m%d').txt"

mkdir -p "$(dirname "$REPORT_FILE")"

echo "========== 流量报告 $(date '+%Y-%m-%d') ==========" > "$REPORT_FILE"
echo "" >> "$REPORT_FILE"

# 今日访问量
TODAY_HITS=$(grep "$(date '+%d/%b/%Y')" "$LOG_FILE" | wc -l)
TODAY_IPS=$(grep "$(date '+%d/%b/%Y')" "$LOG_FILE" | awk '{print $1}' | sort -u | wc -l)

echo "📊 今日统计" >> "$REPORT_FILE"
echo "   访问量: $TODAY_HITS" >> "$REPORT_FILE"
echo "   独立IP: $TODAY_IPS" >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"

# 热门页面
echo "📄 热门页面 (Top 10)" >> "$REPORT_FILE"
grep "$(date '+%d/%b/%Y')" "$LOG_FILE" | \
    awk '{print $7}' | \
    sort | uniq -c | sort -rn | head -10 >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"

# 访问来源
echo "🔗 访问来源 (Top 5)" >> "$REPORT_FILE"
grep "$(date '+%d/%b/%Y')" "$LOG_FILE" | \
    awk -F'"' '{print $4}' | \
    grep -v "^-$" | \
    grep -v "^https\?://[^/]*yourdomain.com" | \
    sort | uniq -c | sort -rn | head -5 >> "$REPORT_FILE"

echo "" >> "$REPORT_FILE"
echo "完整日志: $LOG_FILE" >> "$REPORT_FILE"

cat "$REPORT_FILE"

七、定时任务配置

将以上脚本配置为定时任务:

# 编辑crontab
crontab -e

# 添加以下内容
# 每天凌晨3点备份
0 3 * * * /var/www/blog/scripts/backup.sh >> /var/log/blog-backup.log 2>&1

# 每周一检查收录
0 9 * * 1 /var/www/blog/scripts/check_index.sh yourdomain.com

# 每天生成流量报告
0 8 * * * /var/www/blog/scripts/traffic_report.sh

八、进阶建议

1. 使用GitHub Actions

如果你的博客托管在GitHub,可以用Actions实现CI/CD:

# .github/workflows/deploy.yml
name: Deploy Blog

on:
  push:
    branches: [main]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: true

      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v2

      - name: Build
        run: hugo --gc --minify

      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./public

2. 接入监控告警

  • 使用Uptime Robot监控网站可用性
  • 配置邮件/钉钉告警
  • 异常时自动通知

3. 数据可视化

  • 使用Grafana展示流量数据
  • 对比不同时期的数据变化

写在最后

自动化的目的是把重复劳动交给机器,让创作者专注内容。

以上5个脚本只是起点,你可以根据自己的需求扩展更多功能。关键是:识别重复任务 → 编写脚本 → 配置定时执行

记住:工具服务于人,不要为了自动化而自动化。


你有哪些自动化运营的心得?欢迎分享。