0

Shell脚本UTM参数自动巡检方案:让营销链接追踪状态完全自动化不用人盯

2026.06.15 | youres | 3次围观

做营销链接巡检最头疼的不是写脚本,而是脚本写完之后还得手动去盯。有没有什么办法让这个过程完全自动化,不用人盯着、结果自动汇总、出了问题第一时间知道?本文来聊聊怎么用 Shell 脚本搭一套 UTM 参数自动巡检方案。

为什么要做 UTM 参数自动巡检

UTM 参数是营销链接里埋的追踪信息,用来告诉 Google Analytics 这条流量从哪来、走了什么渠道。短链重定向、多级跳转、HTTPS 强制跳转……这些场景很容易把 UTM 参数弄丢。一旦参数丢失,流量来源全变成 direct,投放效果无法评估,钱打了水漂都不知道。

巡检一次不够,链接会变、CDN 配置会调、后台重定向规则会改。所以巡检必须定时跑、自动跑,跑完还要有记录、有告警。这才是一套完整的自动巡检方案。

整体架构

自动巡检方案分三层:

  • 检测层:curl + url_effective,逐条验证 UTM 参数是否保留
  • 调度层:crontab 定时触发,解放人工
  • 通知层:检测到参数丢失时自动推送告警(钉钉/企业微信/邮件)

检测脚本:核心逻辑

先写一个检测单条链接的函数:

#!/bin/bash

check_utm() {
    local url="$1"
    local expected_utm="$2"
    
    # 用 curl -L 跟随重定向,用 -w 输出最终 URL
    local final_url
    final_url=$(curl -L -s -o /dev/null -w "%{url_effective}" "$url")
    
    # 检查最终 URL 中是否包含原始 UTM 参数
    if echo "$final_url" | grep -q "$expected_utm"; then
        echo "OK|${final_url}"
    else
        echo "FAIL|${url} -> ${final_url} (丢失UTM)"
    fi
}

核心原理很简单:用 curl -L 跟随完整重定向链,再用 -w "%{url_effective}" 拿到最终落地的 URL,拿到 URL 里如果包含预期保留的 UTM 参数即为通过。

批量检测脚本

单条检测没有意义,实战中要批量跑。把要巡检的链接写成列表文件,每行一条:

#!/bin/bash

URL_LIST="/data/utm_urls.txt"
LOG_DIR="/data/logs/utm_check"
ALERT_LOG="${LOG_DIR}/alert_$(date +%Y%m%d_%H%M%S).log"

mkdir -p "$LOG_DIR"

check_batch() {
    local fail_count=0
    while IFS= read -r line; do
        # 跳过空行和注释
        [[ -z "$line" || "$line" =~ ^# ]] && continue
        
        # 格式: URL|预期保留的UTM参数
        url=$(echo "$line" | cut -d"|" -f1)
        utm_param=$(echo "$line" | cut -d"|" -f2)
        
        result=$(check_utm "$url" "$utm_param")
        status=$(echo "$result" | cut -d"|" -f1)
        
        if [[ "$status" == "FAIL" ]]; then
            ((fail_count++))
            echo "$result" >> "$ALERT_LOG"
            echo "[FAIL] $result"
        else
            echo "[OK] $url"
        fi
    done < "$URL_LIST"
    
    return $fail_count
}

check_batch
exit $?

URL_LIST 文件格式示例:

https://your-domain.com/landing?utm_source=baidu&utm_medium=cpc&utm_campaign=spring|utm_source=baidu
https://your-domain.com/promo?utm_source=wechat&utm_content=homepage|utm_source=wechat
https://your-domain.com/affiliate?utm_source=affiliate&utm_campaign=partner|utm_source=affiliate

定时任务配置

脚本写好了,接下来让系统自动跑。编辑 crontab:

# 每天早上9点跑一次巡检,结果写入日志
0 9 * * * /bin/bash /data/scripts/utm_check.sh >> /data/logs/utm_check/cron_$(date +\%Y\%m\%d).log 2>&1

# 如果有参数丢失,立即触发告警
0 9 * * * /bin/bash /data/scripts/utm_check.sh || /bin/bash /data/scripts/utm_alert.sh

第一次配置建议先手动跑几次,确认日志格式正常、告警能收到,再上 crontab。

告警通知接入

巡检出问题不能没人管。把钉钉告警接进来:

send_dingtalk() {
    local token="你的钉钉机器人token"
    local content="【UTM巡检告警】检测到 $(wc -l < "$1") 条链接 UTM 参数丢失,请及时检查重定向配置。"
    
    curl -s -X POST "https://oapi.dingtalk.com/robot/send?access_token=${token}" \
        -H "Content-Type: application/json" \
        -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"${content}\"}}" > /dev/null
}

# 检测到失败时调用
[[ -s "$ALERT_LOG" ]] && send_dingtalk "$ALERT_LOG"

告警内容会推送到钉钉群,附带具体哪些链接出了问题,方便直接定位。

结果持久化与趋势分析

光告警不够,还要有历史记录。把每次巡检结果存下来:

REPORT_CSV="/data/logs/utm_check/report_$(date +%Y%m).csv"

# 追加月度报告(CSV格式)
echo "$(date +%Y-%m-%d %H:%M:%S),`total`,`fail`,`pass`" >> "$REPORT_CSV"

月度 CSV 拉出来用 awk 跑个简单统计,就能看到 UTM 参数丢失率是上升了还是下降了,帮助判断配置改动是否生效。

常见问题

curl -L 跟随了重定向但 url_effective 为空

常见原因是被重定向到了非 HTTP/HTTPS 协议(如 ftp://、mailto:),或者跳转到了文件下载链接。可以用 curl -L -w "%{url_effective}" -o /dev/null -s 单独验证这条链接的最终 URL。

列表文件里 URL 含有特殊字符

URL 里如果有 #& 这类字符,用 while read 读取时要加引号:while IFS= read -r line; do ... done < "$URL_LIST"。不用引号的话特殊字符会被截断。

crontab 环境变量导致脚本跑不通

crontab 执行时 PATH 只有基本路径,curl 如果不在默认路径里会报 command not found。脚本开头加上:export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:`$PATH,或者用 curl 的绝对路径 /usr/bin/curl

小结

UTM 参数自动巡检方案三步走:检测脚本跑通、crontab 定时调度、告警通知接入。跑顺了之后,每天的巡检完全不用人管,出问题第一时间收到通知,营销链接的追踪质量才真正有保障。

相关脚本还可以结合之前聊过的 Shell脚本批量检查UTM参数保留curl批量重定向检测crontab定时任务 一起用,检测层和调度层互相配合,巡检覆盖面更全。

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论