Improve AI daily report operations and dedupe observability

This commit is contained in:
Ubuntu
2026-06-10 21:55:29 +08:00
parent b46cef2c7b
commit 2159ee733b
23 changed files with 761 additions and 57 deletions

View File

@@ -5,6 +5,7 @@ import socket
import time
from dataclasses import dataclass
from urllib.error import HTTPError, URLError
from urllib.parse import urlencode
import urllib.request
from typing import Any
@@ -115,17 +116,49 @@ class BlogApiClient:
def create_post(self, payload: dict[str, Any]) -> dict[str, Any]:
return self._request("POST", "/api/service/posts", payload)
def get_post_by_slug(self, slug: str) -> dict[str, Any] | None:
def _normalize_post_response(self, value: Any, slug: str) -> dict[str, Any] | None:
if isinstance(value, dict):
if isinstance(value.get("post"), dict):
value = value["post"]
elif isinstance(value.get("data"), dict):
value = value["data"]
elif isinstance(value.get("items"), list):
for item in value["items"]:
if isinstance(item, dict) and item.get("slug") == slug:
return item
return None
if value.get("slug") == slug or value.get("id") or value.get("content") or value.get("markdown"):
return value
if isinstance(value, list):
for item in value:
if isinstance(item, dict) and item.get("slug") == slug:
return item
return None
def _request_optional(self, method: str, path: str, payload: dict[str, Any] | None = None) -> dict[str, Any] | list[Any] | None:
try:
return self._request("GET", f"/api/service/posts/{slug}")
return self._request(method, path, payload)
except HTTPError as exc:
if exc.code == 404:
if exc.code in {403, 404}:
return None
raise
except FetchTextError as exc:
if exc.error_type == "http_404":
if exc.error_type in {"http_403", "http_404"}:
return None
raise
def get_post_by_slug(self, slug: str) -> dict[str, Any] | None:
paths = [
f"/api/service/posts/{slug}",
f"/api/service/posts?{urlencode({'slug': slug})}",
f"/api/service/posts/slug/{slug}",
]
for path in paths:
value = self._request_optional("GET", path)
post = self._normalize_post_response(value, slug)
if post is not None:
return post
return None
def publish_post(self, slug: str) -> None:
self._request("POST", f"/api/service/posts/{slug}/publish")