refactor: separate TaurusX performance page

This commit is contained in:
王源
2026-10-15 17:37:42 +08:00
parent 6e8238e5cf
commit 01b4e3ddae
5 changed files with 2235 additions and 4123 deletions
+35 -32
View File
@@ -7,6 +7,7 @@ import argparse
import hashlib
import json
import os
import re
import tempfile
import time
import urllib.parse
@@ -17,6 +18,7 @@ from typing import Any
API_URL = "https://scaler.taurusx.com/openapi/performance_data"
TIMEZONE = "+8"
PACKAGE_SUFFIX_TAGS = {"audience", "test", "retargeting", "rtg"}
def build_token(secret_key: str, timestamp: str) -> str:
@@ -60,48 +62,46 @@ def request_performance(
return rows
def match_pkg(campaign_name: str, packages: list[str]) -> str:
lowered = campaign_name.casefold()
for package in packages:
if package.casefold() in lowered:
return package
return ""
def extract_pkg(campaign_name: str, country: str) -> str:
"""Extract an Android package or iOS app ID from the TaurusX campaign name."""
candidates = re.findall(
r"(?:[A-Za-z][A-Za-z0-9]*\.)+[A-Za-z0-9_]+|id\d{6,}",
campaign_name,
flags=re.IGNORECASE,
)
if not candidates:
return ""
package = max(candidates, key=len)
parts = package.split("_")
while len(parts) > 1 and (
parts[-1].upper() == country.upper()
or parts[-1].casefold() in PACKAGE_SUFFIX_TAGS
or parts[-1].isdigit()
):
parts.pop()
return "_".join(parts)
def build_dataset(
api_rows: list[dict[str, Any]],
report_payload: dict[str, Any],
start_date: date,
end_date: date,
) -> dict[str, Any]:
coverage_records = report_payload.get("records") or []
packages = sorted({str(row["pkg"]) for row in coverage_records}, key=len, reverse=True)
coverage_by_key = {
(str(row["pkg"]).casefold(), str(row["country"]).upper()): row
for row in coverage_records
}
records: list[dict[str, Any]] = []
for api_row in api_rows:
campaign_name = str(api_row.get("campaign_name") or "").strip()
pkg = match_pkg(campaign_name, packages)
country = str(api_row.get("country") or "").strip().upper()
coverage = coverage_by_key.get((pkg.casefold(), country)) if pkg and country else None
records.append(
{
"date": str(api_row.get("date") or ""),
"campaign_id": str(api_row.get("campaign_id") or ""),
"campaign_name": campaign_name,
"pkg": pkg,
"pkg": extract_pkg(campaign_name, country),
"country": country,
"impressions": int(float(api_row.get("impressions") or 0)),
"clicks": int(float(api_row.get("clicks") or 0)),
"conversions": int(float(api_row.get("conversions") or 0)),
"cost": round(float(api_row.get("cost") or 0), 4),
"order_match": coverage is not None,
"adpingids": list(coverage.get("adpingids") or []) if coverage else [],
"order_statuses": list(coverage.get("order_statuses") or []) if coverage else [],
"listed_in_taurusx_orders": bool(coverage and coverage.get("target_present")),
}
)
@@ -118,8 +118,7 @@ def build_dataset(
"campaigns": len({row["campaign_id"] for row in records}),
"pkg_country_count": len({(row["pkg"].casefold(), row["country"]) for row in records if row["pkg"]}),
"countries": len({row["country"] for row in records if row["country"]}),
"matched_order_rows": sum(row["order_match"] for row in records),
"unmatched_order_rows": sum(not row["order_match"] for row in records),
"unparsed_pkg_rows": sum(not row["pkg"] for row in records),
"impressions": sum(row["impressions"] for row in records),
"clicks": sum(row["clicks"] for row in records),
"conversions": sum(row["conversions"] for row in records),
@@ -139,7 +138,12 @@ def atomic_write_json(path: Path, payload: dict[str, Any]) -> None:
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--data-file", type=Path, default=Path(__file__).with_name("data.json"))
parser.add_argument(
"--output",
type=Path,
default=Path(__file__).with_name("taurusx_data.json"),
help="Standalone TaurusX dataset output (default: taurusx_data.json next to this script)",
)
parser.add_argument("--days", type=int, default=7, choices=range(1, 8), metavar="1-7")
parser.add_argument("--end-date", type=date.fromisoformat, help="Last report date; defaults to yesterday in UTC+8")
args = parser.parse_args()
@@ -148,20 +152,19 @@ def main() -> None:
secret_key = os.environ.get("TAURUSX_SECRET_KEY", "").strip()
if not access_key or not secret_key:
raise SystemExit("TAURUSX_ACCESS_KEY and TAURUSX_SECRET_KEY environment variables are required")
if not args.data_file.is_file():
raise SystemExit(f"Report data file not found: {args.data_file}")
if not args.output.parent.is_dir():
raise SystemExit(f"Output directory not found: {args.output.parent}")
utc8_today = datetime.now(timezone(timedelta(hours=8))).date()
end_date = args.end_date or (utc8_today - timedelta(days=1))
start_date = end_date - timedelta(days=args.days - 1)
report_payload = json.loads(args.data_file.read_text(encoding="utf-8"))
api_rows = request_performance(access_key, secret_key, start_date, end_date)
report_payload["taurusx_perf"] = build_dataset(api_rows, report_payload, start_date, end_date)
atomic_write_json(args.data_file, report_payload)
meta = report_payload["taurusx_perf"]["meta"]
dataset = build_dataset(api_rows, start_date, end_date)
atomic_write_json(args.output, dataset)
meta = dataset["meta"]
print(
f"Updated {args.data_file}: {meta['rows']} TaurusX rows, "
f"{meta['matched_order_rows']} matched orders, {meta['start_date']}..{meta['end_date']}"
f"Updated {args.output}: {meta['rows']} TaurusX rows, "
f"{meta['campaigns']} campaigns, {meta['start_date']}..{meta['end_date']}"
)