From a80f33aeaf7d626baa133a1eebf498f1ab87f690 Mon Sep 17 00:00:00 2001 From: karuo Date: Sun, 15 Mar 2026 19:47:32 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=84=20=E5=8D=A1=E8=8B=A5AI=20=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=202026-03-15=2019:47=20|=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=EF=BC=9A=E6=B0=B4=E6=BA=AA=E6=95=B4=E7=90=86=E5=BD=92=E6=A1=A3?= =?UTF-8?q?=E3=80=81=E5=8D=A1=E6=9C=A8=E3=80=81=E7=81=AB=E7=82=AC=E3=80=81?= =?UTF-8?q?=E6=80=BB=E7=B4=A2=E5=BC=95=E4=B8=8E=E5=85=A5=E5=8F=A3=E3=80=81?= =?UTF-8?q?=E8=BF=90=E8=90=A5=E4=B8=AD=E6=9E=A2=E5=B7=A5=E4=BD=9C=E5=8F=B0?= =?UTF-8?q?=20|=20=E6=8E=92=E9=99=A4=20>20MB:=2011=20=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../待沉淀/2026-03-15_全站埋点统计标准_Soul项目沉淀.md | 74 ++++ .../{全网API自动注册 => 全网AI自动注册}/SKILL.md | 8 +- .../providers/__init__.py | 0 .../providers/base_provider.py | 0 .../providers/cursor_provider.py | 0 .../providers/gemini_provider.py | 0 .../providers/generic_browser_provider.py | 0 .../providers/openai_provider.py | 0 .../脚本/auto_register.py | 0 .../脚本/config.example.yaml | 0 .../全网AI自动注册/脚本/gemini_key_creator.py | 320 ++++++++++++++++++ .../全网AI自动注册/脚本/google_device_auth.py | 157 +++++++++ .../脚本/key_manager_api.py | 0 .../全网AI自动注册/脚本/register_gemini_keys.py | 271 +++++++++++++++ .../脚本/requirements.txt | 0 .../全网AI自动注册/脚本/tokens/debug_step_1.png | Bin 0 -> 33828 bytes .../全网AI自动注册/脚本/tokens/debug_step_2.png | Bin 0 -> 33828 bytes .../全网AI自动注册/脚本/tokens/debug_step_3.png | Bin 0 -> 33831 bytes .../tokens/gemini_gemini_project_1_at_google.com_1773573688.json | 7 + .../tokens/gemini_gemini_project_1_at_google.com_1773573760.json | 7 + .../tokens/gemini_gemini_project_2_at_google.com_1773573702.json | 7 + .../tokens/gemini_gemini_project_2_at_google.com_1773573774.json | 7 + .../tokens/gemini_gemini_project_3_at_google.com_1773573717.json | 7 + .../tokens/gemini_gemini_project_3_at_google.com_1773573789.json | 7 + 04_卡火(火)/火炬_全栈消息/全栈开发/SKILL.md | 74 +++- SKILL_REGISTRY.md | 2 +- 运营中枢/工作台/gitea_push_log.md | 1 + 运营中枢/工作台/代码管理.md | 1 + 28 files changed, 943 insertions(+), 7 deletions(-) create mode 100644 02_卡人(水)/水溪_整理归档/经验库/待沉淀/2026-03-15_全站埋点统计标准_Soul项目沉淀.md rename 03_卡木(木)/木根_逆向分析/{全网API自动注册 => 全网AI自动注册}/SKILL.md (93%) rename 03_卡木(木)/木根_逆向分析/{全网API自动注册 => 全网AI自动注册}/providers/__init__.py (100%) rename 03_卡木(木)/木根_逆向分析/{全网API自动注册 => 全网AI自动注册}/providers/base_provider.py (100%) rename 03_卡木(木)/木根_逆向分析/{全网API自动注册 => 全网AI自动注册}/providers/cursor_provider.py (100%) rename 03_卡木(木)/木根_逆向分析/{全网API自动注册 => 全网AI自动注册}/providers/gemini_provider.py (100%) rename 03_卡木(木)/木根_逆向分析/{全网API自动注册 => 全网AI自动注册}/providers/generic_browser_provider.py (100%) rename 03_卡木(木)/木根_逆向分析/{全网API自动注册 => 全网AI自动注册}/providers/openai_provider.py (100%) rename 03_卡木(木)/木根_逆向分析/{全网API自动注册 => 全网AI自动注册}/脚本/auto_register.py (100%) rename 03_卡木(木)/木根_逆向分析/{全网API自动注册 => 全网AI自动注册}/脚本/config.example.yaml (100%) create mode 100644 03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/gemini_key_creator.py create mode 100644 03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/google_device_auth.py rename 03_卡木(木)/木根_逆向分析/{全网API自动注册 => 全网AI自动注册}/脚本/key_manager_api.py (100%) create mode 100644 03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/register_gemini_keys.py rename 03_卡木(木)/木根_逆向分析/{全网API自动注册 => 全网AI自动注册}/脚本/requirements.txt (100%) create mode 100644 03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/tokens/debug_step_1.png create mode 100644 03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/tokens/debug_step_2.png create mode 100644 03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/tokens/debug_step_3.png create mode 100644 03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/tokens/gemini_gemini_project_1_at_google.com_1773573688.json create mode 100644 03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/tokens/gemini_gemini_project_1_at_google.com_1773573760.json create mode 100644 03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/tokens/gemini_gemini_project_2_at_google.com_1773573702.json create mode 100644 03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/tokens/gemini_gemini_project_2_at_google.com_1773573774.json create mode 100644 03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/tokens/gemini_gemini_project_3_at_google.com_1773573717.json create mode 100644 03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/tokens/gemini_gemini_project_3_at_google.com_1773573789.json diff --git a/02_卡人(水)/水溪_整理归档/经验库/待沉淀/2026-03-15_全站埋点统计标准_Soul项目沉淀.md b/02_卡人(水)/水溪_整理归档/经验库/待沉淀/2026-03-15_全站埋点统计标准_Soul项目沉淀.md new file mode 100644 index 00000000..6ae9f5a5 --- /dev/null +++ b/02_卡人(水)/水溪_整理归档/经验库/待沉淀/2026-03-15_全站埋点统计标准_Soul项目沉淀.md @@ -0,0 +1,74 @@ +# 全站埋点统计标准(Soul 创业实验项目沉淀) + +> 日期:2026-03-15 +> 来源:Soul 创业实验项目 · 数据统计迭代 +> 已写入:全栈开发 SKILL v2.5 § 1.10 + +--- + +## 背景 + +Soul 创业实验项目在管理后台需要「分类标签点击统计」面板,但发现小程序端没有埋点数据上报。从零实施全站埋点,覆盖 9 个小程序页面、后端聚合 API、管理后台可视化面板,前后共 3 小时完成。 + +**教训**:功能上线后再补埋点,已丢失大量初期用户行为数据。**以后功能和埋点必须同时上线。** + +--- + +## 标准三层架构 + +``` +前端(小程序/Web) 后端 API 管理后台 +trackClick(module, → POST /api/{平台}/track → GET /api/admin/track/stats + action, target, extra) 存入 user_tracks 表 按 module/action/时间段聚合 +``` + +### 1. 前端:trackClick 工具 + +每个平台(小程序、Web、App)封装一个 `trackClick(module, action, target, extra?)` 函数: + +- **module**:所属模块(home / chapters / read / my / vip / wallet / match / referral / search) +- **action**:标准动词(btn_click / page_view / tab_click / nav_click / share) +- **target**:具体按钮/链接名(如「购买VIP」「充值」「阅读第3章」) +- **extra**:可选扩展字段 + +静默上报,不弹窗不阻塞用户操作。 + +### 2. 后端:track API + user_tracks 表 + +| 字段 | 类型 | 说明 | +|:---|:---|:---| +| id | string/UUID | 主键 | +| user_id | string | 用户 ID | +| action | string | 动作类型 | +| target | string | 具体目标 | +| extra_data | JSONB | 扩展信息,含 module、page | +| created_at | timestamp | 自动时间戳 | + +注意 `extra_data` 要正确 Marshal 为 JSON 存入 JSONB 字段(Go 端踩过坑:忘记 marshal body.ExtraData 导致 null)。 + +### 3. 管理后台:聚合面板 + +- 后端 `GET /api/admin/track/stats?period=today|week|month|all` 按 action+target+extra_data 聚合并分组 +- 前端面板按 module 分组展示,支持时间段切换,30 秒自动刷新 + +--- + +## 埋点接入检查清单 + +每开发一个新功能/新页面,按此清单打勾: + +- [ ] 页面所有可点击按钮/标签都已调用 trackClick +- [ ] module 参数使用统一命名 +- [ ] action 参数使用标准动词 +- [ ] target 参数能区分具体按钮 +- [ ] 后端 track API 已注册路由且能正确存储 extra_data +- [ ] 管理后台能展示该模块数据 + +--- + +## 实际代码参考 + +- **小程序 trackClick**:`miniprogram/utils/trackClick.js` +- **后端 track handler**:`soul-api/internal/handler/admin_track.go`(聚合统计)、`soul-api/internal/handler/user.go`(UserTrackPost 存储) +- **管理后台面板**:`soul-admin/src/pages/dashboard/DashboardPage.tsx`(分类标签点击统计 Card) +- **数据模型**:`soul-api/internal/model/user_track.go` diff --git a/03_卡木(木)/木根_逆向分析/全网API自动注册/SKILL.md b/03_卡木(木)/木根_逆向分析/全网AI自动注册/SKILL.md similarity index 93% rename from 03_卡木(木)/木根_逆向分析/全网API自动注册/SKILL.md rename to 03_卡木(木)/木根_逆向分析/全网AI自动注册/SKILL.md index 70c171ac..8525856d 100644 --- a/03_卡木(木)/木根_逆向分析/全网API自动注册/SKILL.md +++ b/03_卡木(木)/木根_逆向分析/全网AI自动注册/SKILL.md @@ -1,14 +1,14 @@ --- -name: 全网API自动注册 -description: 自动注册全网各类 AI/开发 API 免费账号,提取 API Key/Token 并统一管理 -triggers: API注册、自动注册、批量注册、API Key、注册账号、免费API、API池、key池、自动开号 +name: 全网AI自动注册 +description: 自动注册全网各类 AI API 免费账号,提取 API Key/Token 并统一管理 +triggers: AI注册、自动注册、批量注册、API Key、注册账号、免费API、API池、key池、自动开号、Gemini注册 owner: 木根 group: 木(卡木) version: "1.0" updated: "2026-03-15" --- -# 全网API自动注册 +# 全网AI自动注册 ## 能做什么(Capabilities) diff --git a/03_卡木(木)/木根_逆向分析/全网API自动注册/providers/__init__.py b/03_卡木(木)/木根_逆向分析/全网AI自动注册/providers/__init__.py similarity index 100% rename from 03_卡木(木)/木根_逆向分析/全网API自动注册/providers/__init__.py rename to 03_卡木(木)/木根_逆向分析/全网AI自动注册/providers/__init__.py diff --git a/03_卡木(木)/木根_逆向分析/全网API自动注册/providers/base_provider.py b/03_卡木(木)/木根_逆向分析/全网AI自动注册/providers/base_provider.py similarity index 100% rename from 03_卡木(木)/木根_逆向分析/全网API自动注册/providers/base_provider.py rename to 03_卡木(木)/木根_逆向分析/全网AI自动注册/providers/base_provider.py diff --git a/03_卡木(木)/木根_逆向分析/全网API自动注册/providers/cursor_provider.py b/03_卡木(木)/木根_逆向分析/全网AI自动注册/providers/cursor_provider.py similarity index 100% rename from 03_卡木(木)/木根_逆向分析/全网API自动注册/providers/cursor_provider.py rename to 03_卡木(木)/木根_逆向分析/全网AI自动注册/providers/cursor_provider.py diff --git a/03_卡木(木)/木根_逆向分析/全网API自动注册/providers/gemini_provider.py b/03_卡木(木)/木根_逆向分析/全网AI自动注册/providers/gemini_provider.py similarity index 100% rename from 03_卡木(木)/木根_逆向分析/全网API自动注册/providers/gemini_provider.py rename to 03_卡木(木)/木根_逆向分析/全网AI自动注册/providers/gemini_provider.py diff --git a/03_卡木(木)/木根_逆向分析/全网API自动注册/providers/generic_browser_provider.py b/03_卡木(木)/木根_逆向分析/全网AI自动注册/providers/generic_browser_provider.py similarity index 100% rename from 03_卡木(木)/木根_逆向分析/全网API自动注册/providers/generic_browser_provider.py rename to 03_卡木(木)/木根_逆向分析/全网AI自动注册/providers/generic_browser_provider.py diff --git a/03_卡木(木)/木根_逆向分析/全网API自动注册/providers/openai_provider.py b/03_卡木(木)/木根_逆向分析/全网AI自动注册/providers/openai_provider.py similarity index 100% rename from 03_卡木(木)/木根_逆向分析/全网API自动注册/providers/openai_provider.py rename to 03_卡木(木)/木根_逆向分析/全网AI自动注册/providers/openai_provider.py diff --git a/03_卡木(木)/木根_逆向分析/全网API自动注册/脚本/auto_register.py b/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/auto_register.py similarity index 100% rename from 03_卡木(木)/木根_逆向分析/全网API自动注册/脚本/auto_register.py rename to 03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/auto_register.py diff --git a/03_卡木(木)/木根_逆向分析/全网API自动注册/脚本/config.example.yaml b/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/config.example.yaml similarity index 100% rename from 03_卡木(木)/木根_逆向分析/全网API自动注册/脚本/config.example.yaml rename to 03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/config.example.yaml diff --git a/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/gemini_key_creator.py b/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/gemini_key_creator.py new file mode 100644 index 00000000..faeb4bb9 --- /dev/null +++ b/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/gemini_key_creator.py @@ -0,0 +1,320 @@ +#!/usr/bin/env python3 +""" +Gemini API Key 创建器(纯命令行 + 系统浏览器 OAuth 授权) +不需要打开额外浏览器,系统浏览器走 Clash 代理完成 Google 登录授权。 +自动创建指定数量的 GCP 项目并生成 Gemini API Key。 + +用法: python3 gemini_key_creator.py --count 3 +""" + +import argparse +import http.server +import json +import os +import random +import string +import sys +import threading +import time +import urllib.parse +import webbrowser +from pathlib import Path + +import httpx + +PROXY = "http://127.0.0.1:7897" + +# Google OAuth2 客户端(使用 Google Cloud SDK 的公开 client) +CLIENT_ID = "764086051850-6qr4p6gpi6hn506pt8ejuq83di341hur.apps.googleusercontent.com" +CLIENT_SECRET = "d-FL95Q19q7MQmFpd7hHD0Ty" +REDIRECT_PORT = 18457 +REDIRECT_URI = f"http://localhost:{REDIRECT_PORT}" +SCOPES = [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/generative-language", +] + +TOKEN_URL = "https://oauth2.googleapis.com/token" +PROJECTS_URL = "https://cloudresourcemanager.googleapis.com/v1/projects" +SERVICES_URL = "https://serviceusage.googleapis.com/v1/projects/{project_id}/services/generativelanguage.googleapis.com:enable" +APIKEYS_URL = "https://apikeys.googleapis.com/v2/projects/{project_id}/locations/global/keys" + +DB_PATH = Path(__file__).parent / "accounts.db" +JSON_DIR = Path(__file__).parent / "tokens" + +auth_code_result = {"code": None} + + +class OAuthCallbackHandler(http.server.BaseHTTPRequestHandler): + def do_GET(self): + parsed = urllib.parse.urlparse(self.path) + qs = urllib.parse.parse_qs(parsed.query) + code = qs.get("code", [None])[0] + if code: + auth_code_result["code"] = code + self.send_response(200) + self.send_header("Content-Type", "text/html; charset=utf-8") + self.end_headers() + self.wfile.write(b"

✔ Google OAuth OK

You can close this tab now.

") + else: + error = qs.get("error", ["unknown"])[0] + self.send_response(400) + self.send_header("Content-Type", "text/html") + self.end_headers() + self.wfile.write(f"

Error: {error}

".encode()) + + def log_message(self, format, *args): + pass + + +def get_oauth_token(): + """OAuth 授权码流程:系统浏览器授权 → 获取 access_token""" + server = http.server.HTTPServer(("localhost", REDIRECT_PORT), OAuthCallbackHandler) + server.timeout = 300 + thread = threading.Thread(target=server.handle_request, daemon=True) + thread.start() + + auth_params = urllib.parse.urlencode({ + "client_id": CLIENT_ID, + "redirect_uri": REDIRECT_URI, + "response_type": "code", + "scope": " ".join(SCOPES), + "access_type": "offline", + "prompt": "consent", + }) + auth_url = f"https://accounts.google.com/o/oauth2/v2/auth?{auth_params}" + + print(f"\n🔐 正在打开系统浏览器进行 Google 授权...") + print(f" (系统浏览器走 Clash 代理,无需额外操作)\n") + webbrowser.open(auth_url) + + print("⏳ 等待授权回调...") + thread.join(timeout=300) + server.server_close() + + code = auth_code_result["code"] + if not code: + print("❌ 授权超时或失败") + sys.exit(1) + + print("✅ 授权码获取成功,兑换 Token...") + with httpx.Client(proxy=PROXY, timeout=20) as client: + resp = client.post(TOKEN_URL, data={ + "code": code, + "client_id": CLIENT_ID, + "client_secret": CLIENT_SECRET, + "redirect_uri": REDIRECT_URI, + "grant_type": "authorization_code", + }) + if resp.status_code != 200: + print(f"❌ Token 兑换失败: {resp.status_code} {resp.text[:200]}") + sys.exit(1) + tokens = resp.json() + print(f"✅ Access Token 获取成功!") + return tokens["access_token"] + + +def create_project(token, project_id): + """创建 GCP 项目""" + with httpx.Client(proxy=PROXY, timeout=30) as client: + resp = client.post( + PROJECTS_URL, + headers={"Authorization": f"Bearer {token}"}, + json={"projectId": project_id, "name": project_id}, + ) + if resp.status_code in (200, 409): + if resp.status_code == 409: + print(f" 项目 {project_id} 已存在,继续使用") + return True + print(f" 创建项目失败: {resp.status_code} {resp.text[:200]}") + return False + + +def enable_gemini_api(token, project_id): + """启用 Generative Language API""" + url = SERVICES_URL.format(project_id=project_id) + with httpx.Client(proxy=PROXY, timeout=30) as client: + resp = client.post( + url, + headers={"Authorization": f"Bearer {token}"}, + ) + if resp.status_code in (200, 409): + return True + print(f" 启用 API 失败: {resp.status_code} {resp.text[:200]}") + return False + + +def wait_for_operation(token, operation_name, max_wait=60): + """等待长期运行操作完成""" + url = f"https://serviceusage.googleapis.com/v1/{operation_name}" + with httpx.Client(proxy=PROXY, timeout=15) as client: + for _ in range(max_wait // 3): + resp = client.get(url, headers={"Authorization": f"Bearer {token}"}) + if resp.status_code == 200: + data = resp.json() + if data.get("done"): + return True + time.sleep(3) + return True + + +def create_api_key(token, project_id, display_name): + """创建 API Key 并限制为 Generative Language API""" + url = APIKEYS_URL.format(project_id=project_id) + with httpx.Client(proxy=PROXY, timeout=30) as client: + resp = client.post( + url, + headers={"Authorization": f"Bearer {token}"}, + json={ + "displayName": display_name, + "restrictions": { + "apiTargets": [{"service": "generativelanguage.googleapis.com"}] + }, + }, + ) + if resp.status_code == 200: + data = resp.json() + operation = data.get("name", "") + if "operations/" in operation: + time.sleep(3) + op_resp = client.get( + f"https://apikeys.googleapis.com/v2/{operation}", + headers={"Authorization": f"Bearer {token}"}, + ) + if op_resp.status_code == 200: + op_data = op_resp.json() + if op_data.get("done"): + key_data = op_data.get("response", {}) + return key_data.get("keyString", "") + time.sleep(5) + op_resp2 = client.get( + f"https://apikeys.googleapis.com/v2/{operation}", + headers={"Authorization": f"Bearer {token}"}, + ) + if op_resp2.status_code == 200: + return op_resp2.json().get("response", {}).get("keyString", "") + return data.get("keyString", "") + print(f" 创建 Key 失败: {resp.status_code} {resp.text[:300]}") + return None + + +def list_existing_keys(token, project_id): + """列出已有的 API Keys""" + url = APIKEYS_URL.format(project_id=project_id) + with httpx.Client(proxy=PROXY, timeout=15) as client: + resp = client.get(url, headers={"Authorization": f"Bearer {token}"}) + if resp.status_code == 200: + return resp.json().get("keys", []) + return [] + + +def save_key_to_db(api_key, project_id, idx): + """保存到 SQLite""" + import sqlite3 + JSON_DIR.mkdir(parents=True, exist_ok=True) + + with sqlite3.connect(str(DB_PATH)) as conn: + conn.execute(""" + CREATE TABLE IF NOT EXISTS accounts ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + provider TEXT NOT NULL, + email TEXT NOT NULL, + password TEXT DEFAULT '', + api_key TEXT DEFAULT '', + access_token TEXT DEFAULT '', + refresh_token TEXT DEFAULT '', + account_id TEXT DEFAULT '', + name TEXT DEFAULT '', + extra TEXT DEFAULT '{}', + registered_at TEXT NOT NULL, + status TEXT DEFAULT 'active', + UNIQUE(provider, email) + ) + """) + from datetime import datetime, timezone + now = datetime.now(timezone.utc).isoformat() + conn.execute(""" + INSERT OR REPLACE INTO accounts + (provider, email, api_key, name, extra, registered_at, status) + VALUES (?, ?, ?, ?, ?, ?, 'active') + """, ("gemini", f"gemini_project_{idx}@google.com", api_key, + project_id, json.dumps({"project": project_id}), now)) + conn.commit() + + json_file = JSON_DIR / f"gemini_{project_id}.json" + json_file.write_text(json.dumps({ + "provider": "gemini", + "project": project_id, + "api_key": api_key, + }, indent=2)) + print(f" 💾 已保存: DB + {json_file.name}") + + +def main(): + global PROXY + parser = argparse.ArgumentParser(description="Gemini API Key 创建器") + parser.add_argument("--count", "-n", type=int, default=3, help="创建 Key 数量") + parser.add_argument("--proxy", default=PROXY, help="代理地址") + args = parser.parse_args() + + PROXY = args.proxy + + print("=" * 60) + print(f"🔑 Gemini API Key 创建器") + print(f" 目标: 创建 {args.count} 个 Gemini API Key") + print(f" 代理: {PROXY}") + print("=" * 60) + + token = get_oauth_token() + + keys_created = [] + for i in range(1, args.count + 1): + suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=6)) + project_id = f"gemini-auto-{suffix}" + display_name = f"gemini-key-{i}" + + print(f"\n--- 创建第 {i}/{args.count} 个 Key ---") + + print(f" [1/3] 创建项目: {project_id}") + if not create_project(token, project_id): + print(f" ⚠️ 跳过此 Key") + continue + + print(f" [2/3] 启用 Generative Language API") + time.sleep(2) + enable_gemini_api(token, project_id) + time.sleep(5) + + print(f" [3/3] 创建 API Key: {display_name}") + api_key = create_api_key(token, project_id, display_name) + + if api_key: + print(f" ✅ Key {i}: {api_key}") + keys_created.append({"key": api_key, "project": project_id}) + save_key_to_db(api_key, project_id, i) + else: + print(f" ❌ Key 创建失败,尝试列出已有 Key...") + existing = list_existing_keys(token, project_id) + for k in existing: + ks = k.get("keyString") + if ks: + print(f" ✅ 找到已有 Key: {ks}") + keys_created.append({"key": ks, "project": project_id}) + save_key_to_db(ks, project_id, i) + break + + print(f"\n{'='*60}") + print(f"🎉 完成! 创建了 {len(keys_created)}/{args.count} 个 Gemini API Key") + for idx, kd in enumerate(keys_created, 1): + print(f" Key {idx}: {kd['key']}") + print(f" Project: {kd['project']}") + if keys_created: + print(f"\n测试命令:") + k = keys_created[0]["key"] + print(f' curl -x {PROXY} "https://generativelanguage.googleapis.com/v1beta/models?key={k}"') + print(f"\n存储: {DB_PATH} + {JSON_DIR}/") + print(f"{'='*60}") + + +if __name__ == "__main__": + main() diff --git a/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/google_device_auth.py b/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/google_device_auth.py new file mode 100644 index 00000000..012d7f4c --- /dev/null +++ b/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/google_device_auth.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python3 +"""Google Device Flow 授权 + 创建 3 个 Gemini API Key""" + +import httpx, time, json, sys, random, string, sqlite3 +from pathlib import Path +from datetime import datetime, timezone + +PROXY = "http://127.0.0.1:7897" +CLIENT_ID = "764086051850-6qr4p6gpi6hn506pt8ejuq83di341hur.apps.googleusercontent.com" +CLIENT_SECRET = "d-FL95Q19q7MQmFpd7hHD0Ty" +SCOPES = "https://www.googleapis.com/auth/cloud-platform" +DB_PATH = Path(__file__).parent / "accounts.db" +JSON_DIR = Path(__file__).parent / "tokens" +COUNT = int(sys.argv[1]) if len(sys.argv) > 1 else 3 + + +def save_key(api_key, project_id, idx): + JSON_DIR.mkdir(parents=True, exist_ok=True) + with sqlite3.connect(str(DB_PATH)) as conn: + conn.execute("""CREATE TABLE IF NOT EXISTS accounts ( + id INTEGER PRIMARY KEY AUTOINCREMENT, provider TEXT NOT NULL, + email TEXT NOT NULL, password TEXT DEFAULT '', api_key TEXT DEFAULT '', + access_token TEXT DEFAULT '', refresh_token TEXT DEFAULT '', + account_id TEXT DEFAULT '', name TEXT DEFAULT '', extra TEXT DEFAULT '{}', + registered_at TEXT NOT NULL, status TEXT DEFAULT 'active', + UNIQUE(provider, email))""") + now = datetime.now(timezone.utc).isoformat() + conn.execute("INSERT OR REPLACE INTO accounts (provider,email,api_key,name,extra,registered_at,status) VALUES (?,?,?,?,?,?,'active')", + ("gemini", f"gemini_{project_id}@gcp", api_key, project_id, json.dumps({"project": project_id}), now)) + conn.commit() + (JSON_DIR / f"gemini_{project_id}.json").write_text(json.dumps({"provider":"gemini","project":project_id,"api_key":api_key}, indent=2)) + + +def main(): + sep = "=" * 50 + print(sep) + print("Gemini API Key Creator (Device Flow)") + print(f"Target: {COUNT} keys | Proxy: {PROXY}") + print(sep) + + # Step 1: Device Flow + print("\n[Step 1] Google Device Flow...") + with httpx.Client(proxy=PROXY, timeout=15) as c: + r = c.post("https://oauth2.googleapis.com/device/code", data={"client_id": CLIENT_ID, "scope": SCOPES}) + print(f"Status: {r.status_code}") + if r.status_code != 200: + print(f"Failed: {r.text[:300]}") + return + + d = r.json() + user_code = d["user_code"] + verify_url = d["verification_url"] + device_code = d["device_code"] + interval = d.get("interval", 5) + + print(f"\n{sep}") + print(f"Open in ANY browser/phone: {verify_url}") + print(f"Enter code: {user_code}") + print(f"{sep}\n") + print("Waiting for authorization...") + + import webbrowser + webbrowser.open(verify_url) + + token = None + for i in range(120): + time.sleep(interval) + tr = c.post("https://oauth2.googleapis.com/token", data={ + "client_id": CLIENT_ID, "client_secret": CLIENT_SECRET, + "device_code": device_code, "grant_type": "urn:ietf:params:oauth:grant-type:device_code"}) + td = tr.json() + if "access_token" in td: + token = td["access_token"] + print(f"\nAuthorized! Token: {token[:25]}...") + break + err = td.get("error") + if err == "authorization_pending": + if i % 12 == 0 and i > 0: + print(f" Still waiting... ({i*interval}s)") + elif err == "slow_down": + time.sleep(5) + else: + print(f"Error: {td}") + return + + if not token: + print("Timeout!") + return + + # Step 2: Create projects and keys + print(f"\n[Step 2] Creating {COUNT} Gemini API Keys...") + keys = [] + with httpx.Client(proxy=PROXY, timeout=30) as c: + headers = {"Authorization": f"Bearer {token}"} + for i in range(1, COUNT + 1): + sfx = "".join(random.choices(string.ascii_lowercase + string.digits, k=6)) + pid = f"gemini-auto-{sfx}" + print(f"\n Key {i}/{COUNT}: project={pid}") + + # Create project + pr = c.post("https://cloudresourcemanager.googleapis.com/v1/projects", + headers=headers, json={"projectId": pid, "name": pid}) + print(f" Create project: {pr.status_code}") + if pr.status_code not in (200, 409): + print(f" Failed: {pr.text[:200]}") + continue + + time.sleep(3) + + # Enable API + er = c.post(f"https://serviceusage.googleapis.com/v1/projects/{pid}/services/generativelanguage.googleapis.com:enable", + headers=headers) + print(f" Enable API: {er.status_code}") + time.sleep(5) + + # Create API key + kr = c.post(f"https://apikeys.googleapis.com/v2/projects/{pid}/locations/global/keys", + headers=headers, json={"displayName": f"gemini-key-{i}", + "restrictions": {"apiTargets": [{"service": "generativelanguage.googleapis.com"}]}}) + print(f" Create key: {kr.status_code}") + + if kr.status_code == 200: + kd = kr.json() + op_name = kd.get("name", "") + if "operations/" in op_name: + for _ in range(10): + time.sleep(3) + or2 = c.get(f"https://apikeys.googleapis.com/v2/{op_name}", headers=headers) + if or2.status_code == 200: + od = or2.json() + if od.get("done"): + ks = od.get("response", {}).get("keyString", "") + if ks: + print(f" KEY: {ks}") + keys.append({"key": ks, "project": pid}) + save_key(ks, pid, i) + break + else: + ks = kd.get("keyString", "") + if ks: + print(f" KEY: {ks}") + keys.append({"key": ks, "project": pid}) + save_key(ks, pid, i) + else: + print(f" Failed: {kr.text[:300]}") + + print(f"\n{sep}") + print(f"Done! {len(keys)}/{COUNT} keys created") + for idx, k in enumerate(keys, 1): + print(f" {idx}. {k['key']} (project: {k['project']})") + if keys: + print(f"\nTest: curl -x {PROXY} 'https://generativelanguage.googleapis.com/v1beta/models?key={keys[0]['key']}'") + print(sep) + + +if __name__ == "__main__": + main() diff --git a/03_卡木(木)/木根_逆向分析/全网API自动注册/脚本/key_manager_api.py b/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/key_manager_api.py similarity index 100% rename from 03_卡木(木)/木根_逆向分析/全网API自动注册/脚本/key_manager_api.py rename to 03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/key_manager_api.py diff --git a/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/register_gemini_keys.py b/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/register_gemini_keys.py new file mode 100644 index 00000000..6af0c9dd --- /dev/null +++ b/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/register_gemini_keys.py @@ -0,0 +1,271 @@ +#!/usr/bin/env python3 +""" +Gemini API Key 自动注册脚本 +1. 通过 Clash 代理打开 Google AI Studio(非无头模式,你手动登录 Google) +2. 登录完成后脚本自动创建指定数量的 API Key +3. Key 存入本地 SQLite + JSON + +用法: python3 register_gemini_keys.py --count 3 +""" + +import argparse +import json +import os +import re +import sys +import time +from pathlib import Path +from datetime import datetime, timezone + +PROXY_SERVER = "http://127.0.0.1:7897" +AI_STUDIO_URL = "https://aistudio.google.com/app/apikey" +DB_PATH = Path(__file__).parent / "accounts.db" +JSON_DIR = Path(__file__).parent / "tokens" + + +def save_key(provider, email, api_key, project_name=""): + """保存到 SQLite + JSON""" + import sqlite3 + JSON_DIR.mkdir(parents=True, exist_ok=True) + + with sqlite3.connect(str(DB_PATH)) as conn: + conn.execute(""" + CREATE TABLE IF NOT EXISTS accounts ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + provider TEXT NOT NULL, + email TEXT NOT NULL, + password TEXT DEFAULT '', + api_key TEXT DEFAULT '', + access_token TEXT DEFAULT '', + refresh_token TEXT DEFAULT '', + account_id TEXT DEFAULT '', + name TEXT DEFAULT '', + extra TEXT DEFAULT '{}', + registered_at TEXT NOT NULL, + status TEXT DEFAULT 'active', + UNIQUE(provider, email) + ) + """) + now = datetime.now(timezone.utc).isoformat() + conn.execute(""" + INSERT OR REPLACE INTO accounts + (provider, email, api_key, name, extra, registered_at, status) + VALUES (?, ?, ?, ?, ?, ?, 'active') + """, (provider, email, api_key, project_name, json.dumps({"project": project_name}), now)) + conn.commit() + + safe_email = email.replace("@", "_at_") + json_file = JSON_DIR / f"gemini_{safe_email}_{int(time.time())}.json" + json_file.write_text(json.dumps({ + "provider": "gemini", + "email": email, + "api_key": api_key, + "project": project_name, + "registered_at": datetime.now(timezone.utc).isoformat(), + }, indent=2, ensure_ascii=False)) + print(f" [保存] {json_file.name}") + + +def main(): + parser = argparse.ArgumentParser(description="Gemini API Key 自动注册") + parser.add_argument("--count", "-n", type=int, default=3, help="要创建的 Key 数量") + parser.add_argument("--proxy", default=PROXY_SERVER, help="代理地址") + args = parser.parse_args() + + from playwright.sync_api import sync_playwright + + print(f"🚀 启动浏览器(代理: {args.proxy})") + print(f"📋 目标: 创建 {args.count} 个 Gemini API Key\n") + + pw = sync_playwright().start() + browser = pw.chromium.launch( + headless=False, + proxy={"server": args.proxy}, + args=["--window-size=1280,900"], + ) + context = browser.new_context( + viewport={"width": 1280, "height": 900}, + locale="en-US", + ) + page = context.new_page() + + print("📂 打开 Google AI Studio...") + page.goto(AI_STUDIO_URL, timeout=30000) + time.sleep(2) + + if "accounts.google.com" in page.url: + print("\n" + "=" * 60) + print("⚠️ 请在弹出的浏览器窗口中登录你的 Google 账号") + print(" 登录完成后脚本会自动继续...") + print("=" * 60 + "\n") + + for i in range(300): + time.sleep(2) + current = page.url + # 必须是真正到达 aistudio,而非 accounts.google.com 里的 continue 参数 + if current.startswith("https://aistudio.google.com"): + print("✅ 登录成功!已进入 AI Studio") + break + if i % 15 == 0 and i > 0: + print(f" 等待登录中... ({i*2}秒)") + else: + print("❌ 登录超时(10分钟),请重试") + browser.close() + pw.stop() + return + + time.sleep(3) + print(f"\n当前页面: {page.url}") + + if "/apikey" not in page.url: + page.goto(AI_STUDIO_URL, timeout=20000) + time.sleep(3) + + keys_created = [] + + for i in range(args.count): + print(f"\n--- 创建第 {i+1}/{args.count} 个 Key ---") + + try: + page.wait_for_load_state("networkidle", timeout=10000) + except Exception: + pass + + create_btn = None + for selector in [ + "button:has-text('Create API key')", + "button:has-text('Create API Key')", + "button:has-text('创建 API 密钥')", + "[aria-label='Create API key']", + "button:has-text('Get API key')", + "button:has-text('获取 API 密钥')", + ]: + try: + btn = page.locator(selector).first + if btn.is_visible(timeout=3000): + create_btn = btn + break + except Exception: + continue + + if not create_btn: + print(" ⚠️ 未找到 Create API Key 按钮,尝试截图诊断...") + page.screenshot(path=str(JSON_DIR / f"debug_step_{i+1}.png")) + snapshot = page.content() + if "Create" in snapshot or "创建" in snapshot: + print(" 页面包含创建按钮文字,尝试通用点击...") + try: + page.locator("button").filter(has_text=re.compile(r"Create|创建|Get|获取")).first.click() + except Exception as e: + print(f" 点击失败: {e}") + continue + else: + print(f" 页面 URL: {page.url}") + continue + else: + create_btn.click() + + time.sleep(2) + + new_project_btn = None + for selector in [ + "button:has-text('Create API key in new project')", + "button:has-text('在新项目中创建 API 密钥')", + "text='Create API key in new project'", + "button:has-text('new project')", + ]: + try: + btn = page.locator(selector).first + if btn.is_visible(timeout=3000): + new_project_btn = btn + break + except Exception: + continue + + if new_project_btn: + new_project_btn.click() + print(" 点击了 'Create in new project'") + else: + existing_btns = page.locator("button:has-text('Create')").all() + for btn in existing_btns: + try: + if btn.is_visible(): + btn.click() + break + except Exception: + continue + + time.sleep(5) + + api_key = None + for attempt in range(10): + page_text = page.content() + matches = re.findall(r'AIzaSy[A-Za-z0-9_-]{33}', page_text) + if matches: + api_key = matches[0] + break + + try: + code_el = page.locator("code, .api-key, [data-testid*='key'], pre").first + if code_el.is_visible(timeout=1000): + text = code_el.inner_text() + m = re.search(r'AIzaSy[A-Za-z0-9_-]{33}', text) + if m: + api_key = m.group(0) + break + except Exception: + pass + + copy_btns = page.locator("button:has-text('Copy')").all() + if not copy_btns: + copy_btns = page.locator("button:has-text('复制')").all() + for btn in copy_btns: + try: + if btn.is_visible(): + btn.click() + time.sleep(0.5) + break + except Exception: + pass + + time.sleep(1) + if attempt % 3 == 2: + print(f" 等待 Key 生成... (尝试 {attempt+1})") + + if api_key: + print(f" ✅ Key {i+1}: {api_key[:20]}...") + keys_created.append(api_key) + save_key("gemini", f"gemini_project_{i+1}@google.com", api_key, f"project_{i+1}") + else: + print(f" ❌ 未能提取到 API Key,请检查浏览器窗口") + page.screenshot(path=str(JSON_DIR / f"failed_key_{i+1}.png")) + + close_btns = page.locator("button:has-text('Done'), button:has-text('Close'), button:has-text('完成'), button:has-text('关闭')").all() + for btn in close_btns: + try: + if btn.is_visible(): + btn.click() + break + except Exception: + pass + time.sleep(2) + + if "/apikey" not in page.url: + page.goto(AI_STUDIO_URL, timeout=15000) + time.sleep(3) + + print(f"\n{'='*60}") + print(f"🎉 完成! 成功创建 {len(keys_created)}/{args.count} 个 Gemini API Key") + for idx, key in enumerate(keys_created, 1): + print(f" Key {idx}: {key}") + print(f"\n存储位置: {DB_PATH}") + print(f"JSON 目录: {JSON_DIR}") + print(f"{'='*60}") + + input("\n按 Enter 关闭浏览器...") + browser.close() + pw.stop() + + +if __name__ == "__main__": + main() diff --git a/03_卡木(木)/木根_逆向分析/全网API自动注册/脚本/requirements.txt b/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/requirements.txt similarity index 100% rename from 03_卡木(木)/木根_逆向分析/全网API自动注册/脚本/requirements.txt rename to 03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/requirements.txt diff --git a/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/tokens/debug_step_1.png b/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/tokens/debug_step_1.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f0f2a14d1262bd7ef801af5fced77b40fed6ef GIT binary patch literal 33828 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 literal 0 HcmV?d00001 diff --git a/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/tokens/debug_step_2.png b/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/tokens/debug_step_2.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f0f2a14d1262bd7ef801af5fced77b40fed6ef GIT binary patch literal 33828 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 literal 0 HcmV?d00001 diff --git a/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/tokens/debug_step_3.png b/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/tokens/debug_step_3.png new file mode 100644 index 0000000000000000000000000000000000000000..d82a5727b708f78c9003ce9da09f2951313119c1 GIT binary patch literal 33831 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 {}) +} +``` + +Web 端同理,封装为 `trackClick(module, action, target)` 函数,通过 fetch 静默上报。 + +#### 埋点接入检查清单 + +每开发一个页面/功能,按此清单逐项确认: + +- [ ] 页面所有**可点击按钮/标签**都已调用 `trackClick` +- [ ] `module` 参数使用统一命名(home / chapters / read / my / vip / wallet / match / referral / search / settings) +- [ ] `action` 参数使用标准动词(`btn_click` / `page_view` / `tab_click` / `nav_click` / `share`) +- [ ] `target` 参数能区分具体按钮(如 `购买VIP`、`充值`、`阅读第3章`) +- [ ] 后端 track API 已注册路由并能正确存储 `extra_data` +- [ ] 管理后台「分类标签点击统计」面板能展示该模块的数据 + +#### 管理后台展示标准 + +管理后台数据概览页须包含「分类标签点击统计」面板: +- 支持时间段筛选(今日 / 本周 / 本月 / 全部) +- 按 module 分组展示,每个模块显示 top N 点击项 +- 自动 30 秒刷新 + +#### 经验来源 + +Soul 创业实验项目(2026-03-15)首次实施全站埋点,覆盖小程序 9 个页面 + 管理后台统计面板 + 后端聚合 API。详见 `运营中枢/参考资料/项目经验库_知己与类似项目.md`。 + --- ## 二、项目经验库(知己类,必读) @@ -190,6 +259,7 @@ scripts/ | **前端开发/前端标准_神射手与毛狐狸** | 布局/颜色/毛玻璃/组件/特效统一标准,所有项目前端开发参考 | | **神射手 开发文档 4、前端** | 神射手项目内前端规范、核心组件代码、截图索引 | | **Superpowers与全栈开发对比与优化建议** | `运营中枢/参考资料/Superpowers与全栈开发对比与优化建议.md` — 计划粒度、TDD、两阶段评审、分支收尾等优化方向 | +| **埋点统计标准(Soul项目沉淀)** | 全站埋点三层架构:前端 trackClick → 后端 track API → 管理后台聚合面板;2026-03-15 Soul 创业实验项目首次实施,见本 Skill 1.10 节 | --- diff --git a/SKILL_REGISTRY.md b/SKILL_REGISTRY.md index 625dbca5..5ce82bf9 100644 --- a/SKILL_REGISTRY.md +++ b/SKILL_REGISTRY.md @@ -110,7 +110,7 @@ | M01g | 快手发布 | 木叶 | **快手发布、发布到快手、快手登录、快手上传、kuaishou发布** | `03_卡木(木)/木叶_视频内容/快手发布/SKILL.md` | 逆向 cp.kuaishou.com API 视频发布 | | M01h | 多平台分发 | 木叶 | **多平台分发、一键分发、全平台发布、批量分发、视频分发** | `03_卡木(木)/木叶_视频内容/多平台分发/SKILL.md` | 一键分发到5平台(抖音/B站/视频号/小红书/快手),Cookie统一管理 | | M02 | 网站逆向分析 | 木根 | 逆向分析、模拟登录 | `03_卡木(木)/木根_逆向分析/网站逆向分析/SKILL.md` | 网站 API 分析、SDK 生成 | -| M02a | **全网API自动注册** | 木根 | **API注册、自动注册、批量注册、API Key、注册账号、免费API、API池、key池、自动开号** | `03_卡木(木)/木根_逆向分析/全网API自动注册/SKILL.md` | OpenAI/Cursor/Gemini/Groq 等全网 API 自动注册+Key 池管理 | +| M02a | **全网AI自动注册** | 木根 | **AI注册、自动注册、批量注册、API Key、注册账号、免费API、API池、key池、自动开号、Gemini注册** | `03_卡木(木)/木根_逆向分析/全网AI自动注册/SKILL.md` | OpenAI/Cursor/Gemini/Groq 等全网 AI API 自动注册+Key 池管理 | | M03 | 项目生成 | 木果 | 生成项目、五行模板 | `03_卡木(木)/木果_项目模板/项目生成/SKILL.md` | 按五行模板生成新项目 | | M04 | 开发模板 | 木果 | 创建项目、初始化模板 | `03_卡木(木)/木果_项目模板/开发模板/SKILL.md` | 前后端项目模板库 | | M05 | 个人档案生成器 | 木果 | 个人档案、档案生成 | `03_卡木(木)/木果_项目模板/个人档案生成器/SKILL.md` | 自动生成个人介绍档案 | diff --git a/运营中枢/工作台/gitea_push_log.md b/运营中枢/工作台/gitea_push_log.md index 76b65b61..cb346965 100644 --- a/运营中枢/工作台/gitea_push_log.md +++ b/运营中枢/工作台/gitea_push_log.md @@ -360,3 +360,4 @@ | 2026-03-15 12:31:12 | 🔄 卡若AI 同步 2026-03-15 12:31 | 更新:金仓、运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-15 15:48:32 | 🔄 卡若AI 同步 2026-03-15 15:48 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-15 16:00:52 | 🔄 卡若AI 同步 2026-03-15 16:00 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | +| 2026-03-15 19:00:56 | 🔄 卡若AI 同步 2026-03-15 19:00 | 更新:卡木、总索引与入口、运营中枢工作台 | 排除 >20MB: 11 个 | diff --git a/运营中枢/工作台/代码管理.md b/运营中枢/工作台/代码管理.md index 4b2a1b8b..3b81923e 100644 --- a/运营中枢/工作台/代码管理.md +++ b/运营中枢/工作台/代码管理.md @@ -363,3 +363,4 @@ | 2026-03-15 12:31:12 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-15 12:31 | 更新:金仓、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-15 15:48:32 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-15 15:48 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-15 16:00:52 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-15 16:00 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | +| 2026-03-15 19:00:56 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-15 19:00 | 更新:卡木、总索引与入口、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |