|
|
@@ -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']}",
|
|
|
+ }
|