66 lines
2.4 KiB
Bash
Executable File
66 lines
2.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# 微信安全批量验收:仅对白名单测试联系人执行,默认 dry-run。
|
||
set -euo pipefail
|
||
|
||
DEVICE="${SDK_DEVICE_ID:-xgfe65eimrrofyws}"
|
||
BASE="${SDK_BASE_URL:-http://127.0.0.1:8899}"
|
||
TO_IDS_RAW="${WORKPHONE_TEST_TO_IDS:-}"
|
||
CONTENT="${WORKPHONE_TEST_CONTENT:-[工作手机白名单批量验收] $(date +%Y%m%d-%H%M%S)}"
|
||
INTERVAL="${WORKPHONE_BATCH_INTERVAL:-65}"
|
||
DRY_RUN="${WORKPHONE_DRY_RUN:-1}"
|
||
MAX_COUNT="${WORKPHONE_MAX_COUNT:-20}"
|
||
|
||
if [[ -z "${TO_IDS_RAW}" ]]; then
|
||
echo "缺少 WORKPHONE_TEST_TO_IDS。示例:"
|
||
echo " WORKPHONE_TEST_TO_IDS='filehelper,wxid_test_1' WORKPHONE_DRY_RUN=1 bash sdk/scripts/run_wechat_safe_batch_acceptance.sh"
|
||
exit 2
|
||
fi
|
||
|
||
IFS=',' read -r -a TO_IDS <<< "${TO_IDS_RAW}"
|
||
if (( ${#TO_IDS[@]} > MAX_COUNT )); then
|
||
echo "白名单数量 ${#TO_IDS[@]} 超过上限 ${MAX_COUNT},拒绝执行。"
|
||
exit 3
|
||
fi
|
||
|
||
TS="$(date +%Y%m%d-%H%M%S)"
|
||
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
|
||
EVID_DIR="${ROOT}/开发文档/8、部署/05-测试验收/$(date +%Y%m%d)_微信安全批量验收"
|
||
mkdir -p "${EVID_DIR}"
|
||
REPORT="${EVID_DIR}/safe_batch_${TS}.jsonl"
|
||
|
||
probe="$(curl -sS --max-time 40 "${BASE}/api/v3/hook/probe/${DEVICE}")"
|
||
supports="$(echo "${probe}" | jq -r '.supports_hook // false' 2>/dev/null || echo false)"
|
||
if [[ "${supports}" != "true" ]]; then
|
||
echo "Hook 未就绪,拒绝批量验收。"
|
||
echo "${probe}" > "${EVID_DIR}/probe_${TS}.json"
|
||
exit 4
|
||
fi
|
||
|
||
echo "设备=${DEVICE} count=${#TO_IDS[@]} interval=${INTERVAL}s dry_run=${DRY_RUN}"
|
||
for to_id in "${TO_IDS[@]}"; do
|
||
to_id="$(echo "${to_id}" | xargs)"
|
||
[[ -z "${to_id}" ]] && continue
|
||
if [[ "${DRY_RUN}" == "1" ]]; then
|
||
row="$(jq -cn \
|
||
--arg to_id "$to_id" \
|
||
--arg content "$CONTENT" \
|
||
--argjson timestamp "$(date +%s)" \
|
||
'{dry_run:true,to_id:$to_id,content:$content,timestamp:$timestamp}')"
|
||
echo "$row" | tee -a "$REPORT"
|
||
continue
|
||
fi
|
||
|
||
resp="$(curl -sS --max-time 120 -X POST "${BASE}/api/v3/message/send" \
|
||
-H 'Content-Type: application/json' \
|
||
-d "{\"device_id\":\"${DEVICE}\",\"platform\":\"wechat\",\"to_id\":\"${to_id}\",\"content\":\"${CONTENT}\",\"msg_type\":\"text\",\"channel\":\"hook\"}")"
|
||
row="$(jq -cn \
|
||
--arg to_id "$to_id" \
|
||
--arg raw "$resp" \
|
||
--argjson timestamp "$(date +%s)" \
|
||
'{dry_run:false,to_id:$to_id,response:(try ($raw|fromjson) catch {raw:$raw}),timestamp:$timestamp}')"
|
||
echo "$row" | tee -a "$REPORT"
|
||
sleep "${INTERVAL}"
|
||
done
|
||
|
||
echo "报告: ${REPORT}"
|