[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-83887":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":18,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":25,"readmeContent":26,"aiSummary":10,"trendingCount":15,"starSnapshotCount":15,"syncStatus":27,"lastSyncTime":28,"discoverSource":29},83887,"InterviewRadar","KunChen1110\u002FInterviewRadar","KunChen1110"," 基于小红书、牛客等平台真实面经,从你的简历自动生成项目锚定的个性化中文面试备考包","",null,"Python",148,12,73,0,4,75,46,3.34,"MIT License",false,"main",true,[],"2026-06-12 02:04:36","\u003Cdiv align=\"center\">\n\n\u003Cimg src=\"assets\u002Flogo.png\" alt=\"InterviewRadar\" width=\"200\"\u002F>\n\n# InterviewRadar · 面试雷达\n\n**基于真实面经,从你的简历自动生成项目锚定的个性化中文面试备考包**\n\n[![tests](https:\u002F\u002Fgithub.com\u002FKunChen1110\u002FInterviewRadar\u002Factions\u002Fworkflows\u002Ftests.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002FKunChen1110\u002FInterviewRadar\u002Factions\u002Fworkflows\u002Ftests.yml)\n[![License: MIT](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-yellow.svg)](LICENSE)\n[![Python](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPython-3.11+-blue.svg)](#)\n[![Claude\u002FCodex](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FAgent-Claude%20Code%20%2F%20Codex-purple.svg)](#)\n\n\u003C\u002Fdiv>\n\n---\n\n## 它解决什么问题\n\n市面上的\"面试题库\"几乎都是静态的,而面试官手里的题是动态的、时效的、个性化的。\n\n- 你刷的 1000 道八股题里,**真正会被问到的可能不到 10%**——因为面试官是按你简历来问的,不是按题库目录\n- 牛客 \u002F 小红书的真实面经满天飞,但**没人帮你从里面挖出\"跟你简历相关、且最近半年高频\"的那一小撮**\n- LLM 直接生成的面试题听起来像那么回事,但**没法溯源**——你不知道这道题真有人被问过吗\n\nInterviewRadar 是一个可给 Claude Code 或 Codex 使用的面试准备工作流,把\"你给的\"变成\"它给你的\":\n\n| 你给的 | 它做的 | 它给你的 |\n|---|---|---|\n| • 简历(PDF \u002F 图片 \u002F 扫描件)\u003Cbr>• 一句**模糊**岗位方向\u003Cbr>&nbsp;&nbsp;&nbsp;&nbsp;(例:\"AI 应用开发\"\"市场实习\") | • 多源抓取真实面经\u003Cbr>&nbsp;&nbsp;&nbsp;&nbsp;(牛客 + GitHub + 公开博客)\u003Cbr>• 近两年时效**硬过滤**\u003Cbr>• 频次 × 时效加权排序\u003Cbr>• 把每道高频题尝试**挂到你简历里的项目**上\u003Cbr>• LLM 推理 + Python 脚本各司其职\u003Cbr>&nbsp;&nbsp;&nbsp;&nbsp;(领域无关,不依赖预设词表) | • 一份中文 Markdown **备考包**\u003Cbr>• **可追溯**的、锚定到你项目的\u003Cbr>&nbsp;&nbsp;&nbsp;&nbsp;**连环追问链**,而不是凭空编\u003Cbr>• **任意领域**都能跑——不止 AI 岗 |\n\n## 看一眼输出\n\n> 给一份\"3 个项目、目标 Agent 应用开发岗\"的简历,跑出来长这样(节选):\n\n```markdown\n## 2. 简历 ↔ 岗位 Gap 分析\n\n| 维度 | 现状 | 评级 |\n|---|---|---|\n| Agent Orchestration | P1 已实现多阶段状态机 | ✅ 强 |\n| MCP 协议 | 简历未提 | ❌ 弱 |\n| Function Calling 工程细节 | 没专门讲 | ⚠️ 中 |\n...\n\n## 4. 个性化项目追问链(锚到你的简历)\n\n### 链 4.1 — 高频题 #3 → P1 多阶段状态机\n\n> Q1: \"你 P1 项目里设计了 Understanding → Diagnose → ... 这套状态机,\n>      具体是怎么拆解出这六个阶段的?\"\n> Q2: \"这套流程对应 ReAct \u002F Plan-and-Execute \u002F Reflexion 里的哪种范式?\"\n> Q3: \"哪个阶段最容易出问题?你是怎么调的?\"\n```\n\n完整样例:见 [`examples\u002Fsample_prep_package.md`](examples\u002Fsample_prep_package.md)\n\n## 快速开始\n\n### Claude Code 使用\n\n**前置**:已安装 [Claude Code](https:\u002F\u002Fclaude.ai\u002Fcode)。\n\n```bash\n# A. 一行安装(需 npm,-g = 全局)\nnpx -y skills add https:\u002F\u002Fgithub.com\u002FKunChen1110\u002FInterviewRadar -a claude-code -g\n\n# 或 B. 手动 clone\ngit clone https:\u002F\u002Fgithub.com\u002FKunChen1110\u002FInterviewRadar.git ~\u002F.claude\u002Fskills\u002Finterview-radar\n\n# 装 Python 依赖\ncd ~\u002F.claude\u002Fskills\u002Finterview-radar\npython3 -m venv .venv\n.venv\u002Fbin\u002Fpython -m pip install -U pip\n.venv\u002Fbin\u002Fpython -m pip install -r requirements.txt\n```\n\n在 Claude Code 里调用:\n\n```\n用 interview-radar 跑一下:\n简历 \u002Fpath\u002Fto\u002Fyour-resume.pdf\n方向:AI 应用开发岗\n```\n\n### Codex 使用\n\nCodex 不需要走 Claude Skill 安装器。把仓库 clone 到本地,进入项目目录,安装 Python 依赖即可:\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FKunChen1110\u002FInterviewRadar.git\ncd InterviewRadar\npython3 -m venv .venv\n.venv\u002Fbin\u002Fpython -m pip install -U pip\n.venv\u002Fbin\u002Fpython -m pip install -r requirements.txt\n```\n\n在 Codex 里直接说:\n\n```text\n按这个项目的 SKILL.md 跑 InterviewRadar:\n简历 \u002Fpath\u002Fto\u002Fyour-resume.pdf\n方向:AI 应用开发岗\n```\n\nCodex 会读取仓库里的 `SKILL.md`,调用 `scripts\u002F` 下的确定性脚本,并把结果写到 `corpus_cache\u002Fprep_package.md`。如果你已经在这个仓库工作区里,不需要额外安装 skill,直接让 Codex 按 `SKILL.md` 执行即可。\n\nAgent 会自动:\n1. 读简历(支持文字 PDF + 图片 + 扫描件)\n2. 用 WebSearch 发现牛客 \u002F 公开正文页 URL\n3. 按域名分桶,调对应 connector 抓取\n4. 时效过滤(默认 730 天)+ 频次×时效排序\n5. 项目锚定生成追问链\n6. 输出中文备考包到 `corpus_cache\u002Fprep_package.md`\n\n### 默认数据源(零配置)\n\n| 源 | 拿到什么 |\n|---|---|\n| 牛客(NowCoder) | 真实面经帖,带 createTime |\n| GitHub | 主流面经仓库的 markdown 题库 |\n| 知乎 \u002F CSDN \u002F 博客类 | 通过 agent 的网页读取能力拉正文页 |\n\n主流程已覆盖中文圈 90%+ 高频面经源,跑起来不需要任何额外配置。\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>(进阶,可选)接入小红书源\u003C\u002Fb>\u003C\u002Fsummary>\n\n小红书面经笔记很多,但平台反爬严,**不能直接抓**——需要一次性配置 MediaCrawler。配完之后 agent 会通过本项目 connector 自动调用,**不用每次手动跑**。\n\n```bash\n# 一、安装 MediaCrawler(默认路径 ~\u002F.mediacrawler)\nif [ ! -d \"$HOME\u002F.mediacrawler\" ]; then\n  git clone https:\u002F\u002Fgithub.com\u002FNanmiCoder\u002FMediaCrawler.git ~\u002F.mediacrawler\nfi\ncd ~\u002F.mediacrawler\n\npython3.11 -m venv venv || python3 -m venv venv\nvenv\u002Fbin\u002Fpython -m pip install -U pip\nvenv\u002Fbin\u002Fpython -m pip install -r requirements.txt\nvenv\u002Fbin\u002Fpython -m playwright install chromium\n\n# 二、复制小红书 web_session 到配置文件\n# 打开 ~\u002F.mediacrawler\u002Fconfig\u002Fbase_config.py,改这几行:\n# LOGIN_TYPE = \"cookie\"\n# COOKIES = \"web_session=\u003C你从浏览器复制的 web_session 值>\"\n# ENABLE_CDP_MODE = False\n# ENABLE_GET_COMMENTS = False\n\n# 三、验证\nvenv\u002Fbin\u002Fpython main.py --platform xhs --lt cookie --type search --keywords \"AI应用开发 面经\" --save_data_option json --get_comment no\n```\n\n成功后会生成 `~\u002F.mediacrawler\u002Fdata\u002Fxhs\u002Fjson\u002Fsearch_contents_*.json`。如果你看到 `zsh: command not found: pip`,不要装全局 pip,用上面的 `venv\u002Fbin\u002Fpython -m pip ...`。\n\n小红书有两种读取深度:\n\n| 模式 | 读取内容 | 适合场景 |\n|---|---|---|\n| fast | 标题、正文 caption、标签、发布时间 | 快速召回、确认登录和关键词是否跑通 |\n| deep | fast 内容 + 按顺序下载图片并 OCR | 正式生成备考包。小红书很多面经正文只放一部分,完整题目在图片里,这种必须用 deep |\n\n所以报告里会标注本次小红书源用的是 `fast` 还是 `deep`。如果只跑了 fast,结论只能代表文字区可见内容,不能当作完整小红书面经覆盖。\n\n完事。Claude Code 或 Codex 接下来要小红书数据时会自动 shell out 调 MediaCrawler。登录过期前不用再管。\n\n详见 [`docs\u002Fsetup\u002Fmediacrawler.md`](docs\u002Fsetup\u002Fmediacrawler.md)。MediaCrawler 仅供个人非商用。\n\n\u003C\u002Fdetails>\n\n## 它怎么工作\n\n\u003Cdiv align=\"center\">\n  \u003Cimg src=\"assets\u002Fworkflow.png\" alt=\"InterviewRadar workflow\" width=\"900\"\u002F>\n\u003C\u002Fdiv>\n\n\u003Cdetails>\n\u003Csummary>等价的 Mermaid 流程图(技术细节)\u003C\u002Fsummary>\n\n```mermaid\nflowchart TD\n    R[\"简历 PDF \u002F 图片\"] --> A\n    D[\"模糊岗位方向\"] --> A\n    A[\"Agent (Claude Code \u002F Codex)\"] --> S1[\"Step 1\u003Cbr\u002F>简历理解\u003Cbr\u002F>pypdf + 视觉回退\"]\n    S1 --> S2[\"Step 2\u003Cbr\u002F>种子查询\u003Cbr\u002F>agent 当场推,不依赖预设词表\"]\n    S2 --> S3a[\"Step 3a\u003Cbr\u002F>WebSearch 发现 URL\u003Cbr\u002F>按域名分桶\"]\n    S3a --> S3b[\"Step 3b: dispatch connector\"]\n    S3b --> C1[\"NowCoder\u003Cbr\u002F>(官方 discuss)\"]\n    S3b --> C2[\"Xiaohongshu\u003Cbr\u002F>(via MediaCrawler)\"]\n    S3b --> C3[\"GitHub raw\u003Cbr\u002F>(with hints filter)\"]\n    S3b --> C4[\"WebFetch\u003Cbr\u002F>(知乎 \u002F CSDN \u002F ...)\"]\n    C1 --> S45[\"Step 4-5\u003Cbr\u002F>内容相关性 + 题目抽取\u003Cbr\u002F>文本 \u002F OCR \u002F 视觉\"]\n    C2 --> S45\n    C3 --> S45\n    C4 --> S45\n    S45 --> S6[\"Step 6\u003Cbr\u002F>时效过滤 730d 硬截断\u003Cbr\u002F>频次 × 时效排序\"]\n    S6 --> S7[\"Step 7\u003Cbr\u002F>项目锚定推理\u003Cbr\u002F>高频题 ↔ 简历项目\"]\n    S7 --> OUT[\"prep_package.md (中文)\"]\n\n    classDef in fill:#fff3cd,stroke:#856404\n    classDef stage fill:#d1ecf1,stroke:#0c5460\n    classDef src fill:#d4edda,stroke:#155724\n    classDef out fill:#f8d7da,stroke:#721c24\n    class R,D in\n    class S1,S2,S3a,S3b,S45,S6,S7 stage\n    class C1,C2,C3,C4 src\n    class OUT out\n```\n\n\u003C\u002Fdetails>\n\n**分工原则**:\n- agent(Claude Code \u002F Codex)做**推理判断**:领域知识、种子词生成、URL 分桶、项目锚定\n- Python 脚本做**确定性脏活**:HTML 解析、时效过滤、去重排序、降级处理\n- 两者通过磁盘 JSON 解耦,可独立调试\n\n## 它的差异化\n\n| | 静态题库(JavaGuide \u002F Xiaolincoding \u002F GitHub repo) | LLM 直接出题 | **InterviewRadar** |\n|---|---|---|---|\n| 时效 | ❌ 经常陈旧 | ⚠️ 不可控 | ✅ 730d 硬过滤 |\n| 个性化 | ❌ 不看你简历 | ⚠️ 听起来像但不溯源 | ✅ 项目锚定 + `is_grounded` 标记 |\n| 可追溯 | ✅ 但散落 | ❌ 编的就是编的 | ✅ 每条题 \u002F 追问都带源链接 |\n| 跨领域 | ❌ 一仓一岗 | ✅ | ✅(不依赖预设词表) |\n| 多源 | ❌ 单一 | ❌ 不爬 | ✅ 牛客 \u002F GitHub \u002F 通用正文页(小红书可选) |\n\n## 项目结构\n\n```\nInterviewRadar\u002F\n├── SKILL.md                     ← Claude Code \u002F Codex 的入口工作流\n├── scripts\u002F\n│   ├── resume_extract.py        简历理解(文本\u002F视觉回退)\n│   ├── connectors\u002F              source connectors:\n│   │   ├── nowcoder.py            ├─ 牛客 (选择器漂移守卫 + anti-bot 半空守卫)\n│   │   ├── xiaohongshu.py         ├─ 小红书 (吃 MediaCrawler 导出)\n│   │   └── github.py              └─ GitHub (relevance_hints 过滤算法噪音)\n│   ├── corpus\u002F\n│   │   ├── store.py             RawPost \u002F Question 存取\n│   │   ├── recency.py           时效过滤(730d)\n│   │   └── dedupe_rank.py       去重 + 频次×时效排序(未标日期降权 0.2)\n│   ├── ocr\u002F\n│   │   ├── extract.py           OCR + 视觉回退\n│   │   └── xhs_images.py        小红书图片下载 + OCR 拼接\n│   └── scrape\u002Fnormalize_xhs.py  MediaCrawler 输出适配器\n├── tests\u002F                       单测(TDD)\n├── docs\u002F\n│   ├── specs\u002F                   3 份设计文档\n│   ├── plans\u002F                   6 份实施计划\n│   └── setup\u002Fmediacrawler.md    小红书源接入指引\n├── examples\u002F                    跑通的样例输出\n└── corpus_cache\u002F                运行时产物(gitignored)\n```\n\n## 开发\n\n```bash\n# 跑所有测试\n.venv\u002Fbin\u002Fpython -m pytest tests\u002F -v\n\n# 跑某个 connector 的测试\n.venv\u002Fbin\u002Fpython -m pytest tests\u002Ftest_nowcoder_connector.py -v\n```\n\n**怎么加新源**:实现 `Connector` ABC(见 `scripts\u002Fconnectors\u002Fbase.py`),返回 `SearchResult`。降级时用 `SearchResult.degraded(name, msg)`,绝不抛异常打断管道。\n\n**怎么调整时效窗口 \u002F 排序权重**:见 `scripts\u002Fcorpus\u002Frecency.py` 和 `scripts\u002Fcorpus\u002Fdedupe_rank.py`,纯函数,容易改 + 测试覆盖好。\n\n## Roadmap\n\n- [x] **小红书 live 采集**:MediaCrawler cookie driver 已接入,支持按关键词自动抓取小红书 notes JSON,并进入 `XiaohongshuConnector`。\n- [x] **小红书基础适配**:MediaCrawler 原生 JSON 已能 normalize 成 `RawPost`,支持标题、正文、时间戳、图片 URL。\n- [x] **Plan 7:小红书图片面经补全**:`image_list` 会按顺序下载到 `corpus_cache\u002Fassets\u002Fxhs\u002F{note_id}\u002F`,优先用图片 OCR 作为 `RawPost.raw_text\u002Fcontent_text` 主正文;标题、caption、tags 只进入 `locator_text`,并保留低置信度 vision fallback。\n- [ ] **Plan 8:`extract_questions()` 自动抽题**:从 text\u002FOCR\u002Fvision 文本中抽取标准 `Question`,接入 `dedupe_and_rank`,减少 agent 临场读 `raw_text` 手工合成题目的比例。\n- [ ] **Plan 9:端到端 runner + CI**:打通 resume -> search -> connectors -> raw_posts -> questions -> prep_package,并加入 GitHub Actions \u002F 端到端 fixtures。\n- [ ] **Plan 10:抖音图文\u002F视频源 MVP**:优先通过 MediaCrawler 接入抖音图文、标题、描述、评论文本;视频 ASR 先做接口与降级提示,确认高密度面经后再接完整转写。\n- [ ] **持久化术语词典**:跨 session 累积岗位名、公司名、技术词和真实高频术语,用于下一轮查询扩展。\n- [ ] **评测体系**:Golden Set + Trace 回放,覆盖 OCR 抽题、自动抽题、排序和备考包生成质量。\n\n## 贡献\n\n欢迎 issue \u002F PR。开发流程一律走 `docs\u002Fspecs\u002F` → `docs\u002Fplans\u002F` → TDD → 二阶段 review。可以翻看 `docs\u002Fplans\u002F` 找现成的范本。\n\n## Star History\n\n[![Star History Chart](https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=KunChen1110\u002FInterviewRadar&type=Date)](https:\u002F\u002Fwww.star-history.com\u002F#KunChen1110\u002FInterviewRadar&Date)\n\n## 免责\n\n仅供个人非商用。使用本工具拉取数据的合规性由用户自担。详见 [DISCLAIMER.md](DISCLAIMER.md)。\n\n## License\n\nMIT © 2026 Kun Chen\n",2,"2026-06-11 04:11:46","CREATED_QUERY"]