做营销链接巡检最头疼的不是写脚本,而是脚本写完之后还得手动去盯。有没有什么办法让这个过程完全自动化,不用人盯着、结果自动汇总、出了问题第一时间知道?本文来聊聊怎么用 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辅助作者原创,未经许可,转载请保留原文链接。

发表评论