Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/accessiiing_ai-article-publisher.json
T

1 line
6.0 KiB
JSON

{"repo": "accessiiing/ai-article-publisher", "files": {"backend/app/core/config.py": {"7c02afec4eeeb5be5cc6c412d144ac04fc03d160": {"t": 1785594987.6790812, "n": 1536, "h": "1e7107c662b8f6b7", "c": "from pathlib import Path\nfrom functools import lru_cache\nfrom typing import Literal\nfrom pydantic_settings import BaseSettings, SettingsConfigDict\n\n_ENV_FILE = Path(__file__).resolve().parents[2] / \".env\"\n\n\nclass Settings(BaseSettings):\n model_config = SettingsConfigDict(env_file=str(_ENV_FILE), env_file_encoding=\"utf-8\")\n\n # App\n APP_NAME: str = \"AI Media Publisher\"\n API_V1_STR: str = \"/api/v1\"\n DEBUG: bool = False\n\n # Database\n POSTGRES_SERVER: str = \"localhost\"\n POSTGRES_PORT: int = 5432\n POSTGRES_USER: str\n POSTGRES_PASSWORD: str\n POSTGRES_DB: str\n\n @property\n def DATABASE_URL(self) -> str:\n return (\n f\"postgresql+asyncpg://{self.POSTGRES_USER}:{self.POSTGRES_PASSWORD}\"\n f\"@{self.POSTGRES_SERVER}:{self.POSTGRES_PORT}/{self.POSTGRES_DB}\"\n )\n\n # Security\n SECRET_KEY: str\n ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 * 24 * 7 # 7 days\n ALGORITHM: str = \"HS256\"\n\n # LLM — 可配置切换供应商\n LLM_PROVIDER: Literal[\"openai\", \"anthropic\"] = \"openai\"\n OPENAI_API_KEY: str = \"\"\n OPENAI_MODEL: str = \"gpt-4o\"\n OPENAI_API_BASE: str = \"https://api.openai.com/v1\"\n ANTHROPIC_API_KEY: str = \"\"\n ANTHROPIC_MODEL: str = \"claude-sonnet-4-5\"\n\n # Platform publish tokens(初版从 .env 读取,无需 UI 配置)\n GITHUB_TOKEN: str = \"\"\n GITHUB_GIST_PUBLIC: bool = False\n CSDN_API_KEY: str = \"\"\n XHS_COOKIES: str = \"\" # JSON 字符串,格式: {\"key\": \"value\", ...}\n\n\n@lru_cache\ndef get_settings() -> Settings:\n return Settings()\n\n\nsettings = get_settings()\n"}}, "backend/app/publishers/csdn.py": {"7c02afec4eeeb5be5cc6c412d144ac04fc03d160": {"t": 1785594990.1367629, "n": 1190, "h": "a4a97a0bb8d288c9", "c": "\"\"\"CSDN 发布模块 — 通过 CSDN 官方博客 API 发布文章\"\"\"\nimport httpx\nfrom app.core.config import settings\n\n_API_BASE = \"https://bizapi.csdn.net/blog-console-api/v3\"\n\n\nasync def publish_article(title: str, body: str, is_markdown: bool = True) -> str:\n \"\"\"\n 发布文章到 CSDN,返回文章 URL。\n 需在 .env 中配置 CSDN_API_KEY(从 CSDN 开发者后台申请)。\n \"\"\"\n if not settings.CSDN_API_KEY:\n raise ValueError(\"未配置 CSDN_API_KEY,请在 .env 中设置\")\n\n payload = {\n \"title\": title,\n \"markdowncontent\": body if is_markdown else \"\",\n \"content\": body,\n \"type\": \"original\",\n \"status\": 0, # 0 = 立即发布,1 = 草稿\n \"categories\": \"\",\n \"tags\": \"\",\n \"read_type\": \"public\",\n }\n\n async with httpx.AsyncClient(timeout=30) as client:\n resp = await client.post(\n f\"{_API_BASE}/mdeditor/saveArticle\",\n json=payload,\n headers={\n \"x-ca-key\": settings.CSDN_API_KEY,\n \"Content-Type\": \"application/json\",\n },\n )\n resp.raise_for_status()\n data = resp.json()\n article_id = data.get(\"data\", {}).get(\"id\", \"\")\n return f\"https://blog.csdn.net/article/details/{article_id}\"\n"}}, "backend/.env.example": {"7c02afec4eeeb5be5cc6c412d144ac04fc03d160": {"t": 1785594990.2166836, "n": 1028, "h": "87ce4619cc119a53", "c": "# ── App ──────────────────────────────────────────────────────────────\nAPP_NAME=\"AI Media Publisher\"\nDEBUG=false\n\n# ── Database (PostgreSQL) ────────────────────────────────────────────\nPOSTGRES_SERVER=localhost\nPOSTGRES_PORT=5432\nPOSTGRES_USER=postgres\nPOSTGRES_PASSWORD=your_password_here\nPOSTGRES_DB=media_publisher\n\n# ── Security ─────────────────────────────────────────────────────────\n# 生成方式: python -c \"import secrets; print(secrets.token_hex(32))\"\nSECRET_KEY=your_secret_key_here\n\n# ── LLM Provider ─────────────────────────────────────────────────────\n# 可选值: openai | anthropic\nLLM_PROVIDER=openai\n\nOPENAI_API_KEY=sk-...\nOPENAI_MODEL=gpt-4o\n\nANTHROPIC_API_KEY=sk-ant-...\nANTHROPIC_MODEL=claude-sonnet-4-5\n\n# ── Platform Publish Tokens ──────────────────────────────────────────\n# GitHub: 需要 gist 权限的 Personal Access Token\nGITHUB_TOKEN=ghp_...\nGITHUB_GIST_PUBLIC=false\n\n# CSDN: 从 https://mp.csdn.net 开发者后台申请\nCSDN_API_KEY=\n\n# 小红书: Cookie JSON 字符串,从浏览器开发者工具获取\n# 格式: {\"web_session\": \"xxx\", \"a1\": \"xxx\", ...}\nXHS_COOKIES=\n"}}, "backend/app/api/v1/endpoints/platform_settings.py": {"7c02afec4eeeb5be5cc6c412d144ac04fc03d160": {"t": 1785594991.89451, "n": 623, "h": "d9dbf93c398d008a", "c": "from fastapi import APIRouter, Depends\nfrom app.api.deps import get_current_user\nfrom app.core.config import settings\nfrom app.models.user import User\nfrom app.schemas.auth import PlatformSettingsRead\n\nrouter = APIRouter()\n\n\n@router.get(\"\", response_model=PlatformSettingsRead)\nasync def get_platform_settings(\n current_user: User = Depends(get_current_user),\n) -> PlatformSettingsRead:\n \"\"\"查看各平台是否已配置(只返回布尔值,不暴露密钥)\"\"\"\n return PlatformSettingsRead(\n github_configured=bool(settings.GITHUB_TOKEN),\n csdn_configured=bool(settings.CSDN_API_KEY),\n xhs_configured=bool(settings.XHS_COOKIES),\n )\n"}}}}