luojunhui 1 هفته پیش
والد
کامیت
e3db22e222
1فایلهای تغییر یافته به همراه48 افزوده شده و 0 حذف شده
  1. 48 0
      src/handlers/account_article_fetch.py

+ 48 - 0
src/handlers/account_article_fetch.py

@@ -0,0 +1,48 @@
+"""账号文章抓取 XXL-JOB Handler —— accounts(gh_id) → 文章列表 API → articles 表
+
+XXL-JOB Admin 配置:
+    执行器: long-articles-agentic-src
+    处理器: accountArticleFetch
+    超时:   建议 ≥1800s(深翻翻页多,单个账号可能需要几十页)
+"""
+
+import logging
+from typing import TYPE_CHECKING
+
+from src.infra.xxl_jobs import xxl_job
+from src.domains.demand_search_account import AccountArticleFetch, DemandSearchAccountConst
+
+if TYPE_CHECKING:
+    from src.infra.database import DatabaseManager
+
+logger = logging.getLogger(__name__)
+
+_db_ref: "DatabaseManager | None" = None
+
+
+def set_db(db: "DatabaseManager") -> None:
+    global _db_ref
+    _db_ref = db
+
+
+@xxl_job("accountArticleFetch")
+async def account_article_fetch(param: str) -> dict:
+    limit = DemandSearchAccountConst.ARTICLE_DEAL_LIMIT
+    logger.info("accountArticleFetch started, limit=%d", limit)
+
+    try:
+        mysql = _db_ref.mysql_manager("long_articles")
+        fetcher = AccountArticleFetch(mysql)
+        result = await fetcher.deal(limit=limit)
+    except Exception:
+        logger.exception("账号文章抓取失败")
+        return {"code": 500, "msg": "账号文章抓取异常"}
+
+    logger.info(
+        "accountArticleFetch done: accounts=%d, articles_written=%d, errors=%d",
+        result["accounts"], result["articles_written"], result["errors"],
+    )
+    return {
+        "code": 200,
+        "msg": f"accounts={result['accounts']}, written={result['articles_written']}, errors={result['errors']}",
+    }