# cure 監視スクリプト Discord 通知 Cloudflare 403 問題

## 問題

cure サーバーの Python スクリプト(cross_monitor.py / recovery_advisor.py)が
Discord Webhook に `urllib.request` で POST すると HTTP 403 (Cloudflare error code: 1010) で失敗する。

`curl` では同じ URL に 204 で成功する。

## 原因

Cloudflare が `Python-urllib/3.x` の User-Agent をボットとして判定しブロック。
`curl` のデフォルト User-Agent は通過する。

## 解決策

`urllib.request` を使わず、`subprocess.run(["curl", ...])` に置き換える。

```python
def send_discord(msg: str) -> None:
payload = json.dumps({"content": msg})
subprocess.run(
["curl", "-sf", "-X", "POST", DISCORD_WEBHOOK,
"-H", "Content-Type: application/json",
"-d", payload],
capture_output=True, timeout=15,
)
```

## 適用済みファイル

- `/home/ubuntu/workspace/tools/ops/cross_monitor.py`
- `/home/ubuntu/workspace/tools/ops/recovery_advisor.py`
- `/home/ubuntu/workspace/tools/ops/infra/weekly_report.sh` (bash → python3 JSON encode + curl)

## 注意

User-Agent を偽装して通過させる方法もあるが、curl を使う方が保守性が高い。