refactor: separate TaurusX performance page
This commit is contained in:
+35
-32
@@ -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']}"
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user