Commit ef14fb44 authored by 郭阔's avatar 郭阔

reuters 每小时保温访问:keepalive.sh + launchd 任务(面板列表排除)

- bin/keepalive.sh <site>:解析站点端口/profile,采集进行中自动跳过,
  状态写 logs/<site>.keepalive.json
- LaunchAgent com.newsharvester.keepalive-reuters(StartInterval 3600,装于本机);
  面板调度列表(platform_layer.list_schedules / nh_schedule_list)排除 keepalive*,
  不显示为数据源
- 背景:DataDome 按风险评分拦 reuters(出口为数据中心 IP),保温访问维持
  cookie 活性降低凌晨采集撞墙概率
parent ae5bd0a9
#!/bin/bash
# keepalive.sh <site> - 站点保温访问(launchd 每小时触发)
# 用站点共享实例访问一次首页,维持反爬 cookie 活性;正在采集时自动跳过(采集本身就是访问)。
# 用法: bin/keepalive.sh reuters
set -uo pipefail
HERE="$(cd "$(dirname "$0")" && pwd)"
# shellcheck source=platform.sh
source "$HERE/platform.sh"
SITE="${1:-}"
[ -n "$SITE" ] || { echo "用法: $0 <site>(如 reuters)"; exit 1; }
# platform.sh 仅在 call 派发里初始化路径上下文,这里自行补齐
WORK_DIR="${WORK_DIR:-$(nh_default_work_dir)}"
LOG_DIR="${LOG_DIR:-$WORK_DIR/logs}"
mkdir -p "$LOG_DIR" 2>/dev/null || true
PORT="$(nh_cdp_port "$SITE")"
PROFILE="$HOME/.news-harvester/profiles/${SITE}"
mkdir -p "$PROFILE" 2>/dev/null || true
SKILL_DIR="$(nh_skill_dir 2>/dev/null)" || { echo "❌ 找不到 news-harvester 技能目录"; exit 1; }
[ -f "$SKILL_DIR/scripts/keepalive.js" ] || { echo "❌ 技能缺少 scripts/keepalive.js"; exit 1; }
# 同端口有采集任务在跑:这次保温无意义(采集正在大量访问),直接跳过
if ls "$WORK_DIR/runlocks"/port-"${PORT}".*.lock >/dev/null 2>&1; then
echo "$(date '+%F %T') skip: ${SITE} 正在采集,无需保温"
exit 0
fi
export CDP_PORT_OVERRIDE="$PORT"
export CDP_PROFILE_OVERRIDE="$PROFILE"
export NH_LOCK_DIR="$WORK_DIR/runlocks"
export NH_KEEPALIVE_STATUS="${LOG_DIR:-$WORK_DIR/logs}/${SITE}.keepalive.json"
node "$SKILL_DIR/scripts/keepalive.js"
...@@ -279,7 +279,7 @@ nh_schedule_list() { ...@@ -279,7 +279,7 @@ nh_schedule_list() {
base="$(basename "$f")" base="$(basename "$f")"
base="${base%.plist.disabled}"; base="${base%.plist}" base="${base%.plist.disabled}"; base="${base%.plist}"
base="${base#com.newsharvester.}" base="${base#com.newsharvester.}"
[ "$base" = "web" ] || [ "$base" = "digest" ] || echo "$base" case "$base" in web|digest) ;; keepalive*) ;; *) echo "$base" ;; esac
done done
else else
for f in "$dir"/news-harvester@*.timer "$dir"/news-harvester@*.timer.disabled; do for f in "$dir"/news-harvester@*.timer "$dir"/news-harvester@*.timer.disabled; do
......
...@@ -113,7 +113,7 @@ def list_schedules(): ...@@ -113,7 +113,7 @@ def list_schedules():
if not (name.startswith("news-harvester@") and name.endswith(".timer")): if not (name.startswith("news-harvester@") and name.endswith(".timer")):
continue continue
name = name[len("news-harvester@"):-len(".timer")] name = name[len("news-harvester@"):-len(".timer")]
if name in ("digest", "web") or not name: if name in ("digest", "web") or name.startswith("keepalive") or not name:
continue continue
found[name] = state found[name] = state
return dict(sorted(found.items())) return dict(sorted(found.items()))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment