diff --git a/README.md b/README.md index 0514a13..d92d618 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,6 @@ AI Agent 已经能帮你写代码、改文档、管项目——但你让它去 | 📕 **小红书** | — | 阅读、搜索、发帖、评论、点赞 | 告诉 Agent「帮我配小红书」 | | 🎵 **抖音** | — | 视频解析、无水印下载链接获取 | 告诉 Agent「帮我配抖音」 | | 💼 **LinkedIn** | Jina Reader 读公开页面 | Profile 详情、公司页面、职位搜索 | 告诉 Agent「帮我配 LinkedIn」 | -| 🏢 **Boss直聘** | Jina Reader 读职位页 | 搜索职位、向 HR 打招呼 | 告诉 Agent「帮我配 Boss直聘」 | | 💬 **微信公众号** | 搜索 + 阅读公众号文章(全文 Markdown) | — | 无需配置 | | 📰 **微博** | 热搜、搜索内容/用户/话题、用户动态、评论 | — | 无需配置 | | 🎙️ **小宇宙播客** | — | 播客音频转文字(Whisper 转录,免费 Key) | 告诉 Agent「帮我配小宇宙播客」 | @@ -176,7 +175,6 @@ channels/ ├── xiaohongshu.py → mcporter MCP ← 可以换成其他 XHS 工具…… ├── douyin.py → mcporter MCP ← 可以换成其他抖音工具…… ├── linkedin.py → linkedin-mcp ← 可以换成 LinkedIn API…… -├── bosszhipin.py → mcp-bosszp ← 可以换成其他招聘工具…… ├── wechat.py → camoufox+miku ← 搜索+阅读微信公众号文章 ├── rss.py → feedparser ← 可以换成 atoma…… ├── exa_search.py → mcporter MCP ← 可以换成 Tavily、SerpAPI…… @@ -198,7 +196,6 @@ channels/ | 小红书 | [xiaohongshu-mcp](https://github.com/xpzouying/xiaohongshu-mcp) | ⭐9K+,Go 语言,Docker 一键部署 | | 抖音 | [douyin-mcp-server](https://github.com/yzfly/douyin-mcp-server) | MCP 服务,无需登录,视频解析 + 无水印下载 | | LinkedIn | [linkedin-scraper-mcp](https://github.com/stickerdaniel/linkedin-mcp-server) | ⭐900+,MCP 服务,浏览器自动化 | -| Boss直聘 | [mcp-bosszp](https://github.com/mucsbr/mcp-bosszp) | MCP 服务,支持职位搜索和打招呼 | | 微信公众号 | [wechat-article-for-ai](https://github.com/bzd6661/wechat-article-for-ai) + [miku_ai](https://github.com/GobinFan/Miku_Spider) | Camoufox 隐身浏览器读全文 + 搜狗搜索 | > 📌 这些都是「当前选型」。不满意?换掉对应文件就行。这正是脚手架的意义。 @@ -335,7 +332,7 @@ Yes! Agent Reach is an installer + configuration tool — any AI coding agent th ## 致谢 -[Jina Reader](https://github.com/jina-ai/reader) · [yt-dlp](https://github.com/yt-dlp/yt-dlp) · [xreach](https://www.npmjs.com/package/xreach-cli) · [Exa](https://exa.ai) · [mcporter](https://github.com/steipete/mcporter) · [feedparser](https://github.com/kurtmckee/feedparser) · [xiaohongshu-mcp](https://github.com/xpzouying/xiaohongshu-mcp) · [douyin-mcp-server](https://github.com/yzfly/douyin-mcp-server) · [linkedin-scraper-mcp](https://github.com/stickerdaniel/linkedin-mcp-server) · [mcp-bosszp](https://github.com/mucsbr/mcp-bosszp) +[Jina Reader](https://github.com/jina-ai/reader) · [yt-dlp](https://github.com/yt-dlp/yt-dlp) · [xreach](https://www.npmjs.com/package/xreach-cli) · [Exa](https://exa.ai) · [mcporter](https://github.com/steipete/mcporter) · [feedparser](https://github.com/kurtmckee/feedparser) · [xiaohongshu-mcp](https://github.com/xpzouying/xiaohongshu-mcp) · [douyin-mcp-server](https://github.com/yzfly/douyin-mcp-server) · [linkedin-scraper-mcp](https://github.com/stickerdaniel/linkedin-mcp-server) ## 联系 diff --git a/agent_reach/channels/__init__.py b/agent_reach/channels/__init__.py index db12feb..888126a 100644 --- a/agent_reach/channels/__init__.py +++ b/agent_reach/channels/__init__.py @@ -18,7 +18,6 @@ from .exa_search import ExaSearchChannel from .xiaohongshu import XiaoHongShuChannel from .douyin import DouyinChannel from .linkedin import LinkedInChannel -from .bosszhipin import BossZhipinChannel from .wechat import WeChatChannel from .weibo import WeiboChannel from .xiaoyuzhou import XiaoyuzhouChannel @@ -34,7 +33,6 @@ ALL_CHANNELS: List[Channel] = [ XiaoHongShuChannel(), DouyinChannel(), LinkedInChannel(), - BossZhipinChannel(), WeChatChannel(), WeiboChannel(), XiaoyuzhouChannel(), diff --git a/agent_reach/channels/bosszhipin.py b/agent_reach/channels/bosszhipin.py deleted file mode 100644 index 20d7df4..0000000 --- a/agent_reach/channels/bosszhipin.py +++ /dev/null @@ -1,63 +0,0 @@ -# -*- coding: utf-8 -*- -"""Boss直聘 — check if mcp-bosszp is available.""" - -import shutil -import subprocess -from .base import Channel - - -class BossZhipinChannel(Channel): - name = "bosszhipin" - description = "Boss直聘职位搜索" - backends = ["mcp-bosszp", "Jina Reader"] - tier = 2 - - def can_handle(self, url: str) -> bool: - from urllib.parse import urlparse - domain = urlparse(url).netloc.lower() - return "zhipin.com" in domain or "boss.com" in domain - - def check(self, config=None): - mcporter = shutil.which("mcporter") - if not mcporter: - return "off", ( - "可通过 Jina Reader 读取职位页面。完整功能需要:\n" - " 1. git clone https://github.com/mucsbr/mcp-bosszp.git\n" - " 2. cd mcp-bosszp && pip install -r requirements.txt && playwright install chromium\n" - " 3. python boss_zhipin_fastmcp_v2.py(启动后扫码登录)\n" - " 4. mcporter config add bosszhipin http://localhost:8000/mcp" - ) - try: - r = subprocess.run( - [mcporter, "config", "get", "bosszhipin", "--json"], - capture_output=True, - encoding="utf-8", - errors="replace", - timeout=5, - ) - if r.returncode != 0 or "bosszhipin" not in r.stdout.lower(): - return "off", ( - "mcporter 已装但 Boss直聘 MCP 未配置。\n" - " 详见 https://github.com/mucsbr/mcp-bosszp" - ) - except Exception: - return "off", "mcporter 连接异常" - - try: - r = subprocess.run( - [mcporter, "call", "bosszhipin.get_login_info_tool", "--output", "json"], - capture_output=True, - encoding="utf-8", - errors="replace", - timeout=10, - ) - out = r.stdout.lower() - if r.returncode == 0 and "\"is_logged_in\": true" in out: - return "ok", "完整可用(职位搜索、登录态检查、向 HR 打招呼)" - if r.returncode == 0: - return "ok", "MCP 已连接,可搜索职位;打招呼前可能需要先登录" - return "warn", "MCP 已配置,但连接异常;请检查 mcp-bosszp 服务状态" - except subprocess.TimeoutExpired: - return "warn", "MCP 已配置,但健康检查超时;请检查 mcp-bosszp 服务状态" - except Exception: - return "warn", "MCP 已配置,但连接异常;请检查 mcp-bosszp 服务状态" diff --git a/agent_reach/skill/SKILL.md b/agent_reach/skill/SKILL.md index e8e631d..821754e 100644 --- a/agent_reach/skill/SKILL.md +++ b/agent_reach/skill/SKILL.md @@ -3,7 +3,7 @@ name: agent-reach description: > Use the internet: search, read, and interact with 13+ platforms including Twitter/X, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu (小红书), Douyin (抖音), - WeChat Articles (微信公众号), LinkedIn, Boss直聘, RSS, Exa web search, and any web page. + WeChat Articles (微信公众号), LinkedIn, RSS, Exa web search, and any web page. Use when: (1) user asks to search or read any of these platforms, (2) user shares a URL from any supported platform, (3) user asks to search the web, find information online, or research a topic, @@ -136,14 +136,7 @@ mcporter call 'linkedin.search_people(keyword: "AI engineer", limit: 10)' Fallback: `curl -s "https://r.jina.ai/https://linkedin.com/in/username"` -## Boss直聘 (mcporter) - -```bash -mcporter call 'bosszhipin.get_recommend_jobs_tool(page: 1)' -mcporter call 'bosszhipin.search_jobs_tool(keyword: "Python", city: "北京")' -``` - -Fallback: `curl -s "https://r.jina.ai/https://www.zhipin.com/job_detail/xxx"` +## RSS (feedparser) ## RSS diff --git a/docs/README_en.md b/docs/README_en.md index 73b45ef..a4c51b9 100644 --- a/docs/README_en.md +++ b/docs/README_en.md @@ -66,7 +66,6 @@ Update Agent Reach: https://raw.githubusercontent.com/Panniantong/agent-reach/ma | 📕 **XiaoHongShu** | Read · Search · **Post · Comment · Like** | mcporter | Via [xiaohongshu-mcp](https://github.com/user/xiaohongshu-mcp) internal API, install and go | | 🎵 **Douyin** | Video parsing · Watermark-free download | mcporter | Via [douyin-mcp-server](https://github.com/yzfly/douyin-mcp-server), no login needed | | 💼 **LinkedIn** | Jina Reader (public pages) | Full profiles, companies, job search | Tell your Agent "help me set up LinkedIn" | -| 🏢 **Boss直聘** | Jina Reader (job pages) | Job search, greet recruiters | Tell your Agent "help me set up Boss直聘" | | 💬 **WeChat Articles** | Search + Read | Zero config | Search + read WeChat Official Account articles (full Markdown) ([wechat-article-for-ai](https://github.com/bzd6661/wechat-article-for-ai) + [miku_ai](https://github.com/GobinFan/Miku_Spider)) | | 📰 **Weibo** | Trending · Search · Feeds · Comments | Zero config | Hot search, content/user/topic search, feeds, comments ([mcp-server-weibo](https://github.com/Panniantong/mcp-server-weibo)) | | 🎙️ **Xiaoyuzhou Podcast** | Transcription | Free API key | Podcast audio → full text transcript via Groq Whisper (free) | @@ -203,7 +202,6 @@ channels/ ├── xiaohongshu.py → mcporter MCP ← swap to other XHS tools… ├── douyin.py → mcporter MCP ← swap to other Douyin tools… ├── linkedin.py → linkedin-mcp ← swap to LinkedIn API… -├── bosszhipin.py → mcp-bosszp ← swap to other job tools… ├── rss.py → feedparser ← swap to atoma… ├── exa_search.py → mcporter MCP ← swap to Tavily, SerpAPI… └── __init__.py → Channel registry (for doctor checks) @@ -224,7 +222,6 @@ Each channel file only checks whether its upstream tool is installed and working | XiaoHongShu | [xiaohongshu-mcp](https://github.com/user/xiaohongshu-mcp) | Internal API, bypasses anti-bot | | Douyin | [douyin-mcp-server](https://github.com/yzfly/douyin-mcp-server) | MCP server, no login needed, video parsing + watermark-free download | | LinkedIn | [linkedin-scraper-mcp](https://github.com/stickerdaniel/linkedin-mcp-server) | 900+ stars, MCP server, browser automation | -| Boss直聘 | [mcp-bosszp](https://github.com/mucsbr/mcp-bosszp) | MCP server, job search + recruiter greeting | | WeChat Articles | [wechat-article-for-ai](https://github.com/bzd6661/wechat-article-for-ai) + [miku_ai](https://github.com/GobinFan/Miku_Spider) | Stealth browser for full article reading + Sogou search | | Weibo | `mcporter` | `mcporter call 'weibo.get_trendings(limit: 10)'` | | Xiaoyuzhou Podcast | `transcribe.sh` | `bash ~/.agent-reach/tools/xiaoyuzhou/transcribe.sh ` | @@ -299,7 +296,7 @@ Install douyin-mcp-server, then your agent can use `mcporter call 'douyin.parse_ ## Credits -[Jina Reader](https://github.com/jina-ai/reader) · [yt-dlp](https://github.com/yt-dlp/yt-dlp) · [xreach](https://www.npmjs.com/package/xreach-cli) · [Exa](https://exa.ai) · [feedparser](https://github.com/kurtmckee/feedparser) · [douyin-mcp-server](https://github.com/yzfly/douyin-mcp-server) · [linkedin-scraper-mcp](https://github.com/stickerdaniel/linkedin-mcp-server) · [mcp-bosszp](https://github.com/mucsbr/mcp-bosszp) +[Jina Reader](https://github.com/jina-ai/reader) · [yt-dlp](https://github.com/yt-dlp/yt-dlp) · [xreach](https://www.npmjs.com/package/xreach-cli) · [Exa](https://exa.ai) · [feedparser](https://github.com/kurtmckee/feedparser) · [douyin-mcp-server](https://github.com/yzfly/douyin-mcp-server) · [linkedin-scraper-mcp](https://github.com/stickerdaniel/linkedin-mcp-server) ## Contact diff --git a/docs/install.md b/docs/install.md index 049e316..ba5d133 100644 --- a/docs/install.md +++ b/docs/install.md @@ -272,36 +272,6 @@ pip install linkedin-scraper-mcp > > 详见 https://github.com/stickerdaniel/linkedin-mcp-server -**Boss直聘 (可选 — mcp-bosszp):** -> "Boss直聘职位页面可直接读取。完整搜索和打招呼功能需要 mcp-bosszp。" - -```bash -mkdir -p ~/.agent-reach/tools && cd ~/.agent-reach/tools -git clone https://github.com/mucsbr/mcp-bosszp.git && cd mcp-bosszp -pip install -r requirements.txt && playwright install chromium -``` - -> **登录方式(手机 App 扫码):** -> -> mcp-bosszp 使用二维码登录,需要 Boss直聘 App 扫码。 -> -> ```bash -> # 1. 启动 MCP 服务 -> python boss_zhipin_fastmcp_v2.py -> -> # 2. 通过 MCP 触发登录(会生成二维码图片) -> mcporter call 'bosszhipin.start_login()' -> -> # 3. 浏览器打开二维码图片(服务器上用 http://服务器IP:8000/static/qrcode_xxx.png) -> # 4. 用 Boss直聘 App 扫码确认 -> ``` -> -> 扫码成功后 session 自动保存,之后可以搜索职位和自动打招呼。 -> -> 或用 Docker:`docker-compose up -d` -> -> 详见 https://github.com/mucsbr/mcp-bosszp - ### Step 4: Final check Run `agent-reach doctor` one final time and report the results to your user. @@ -355,5 +325,4 @@ After installation, use upstream tools directly. See SKILL.md for the full comma | 小宇宙播客 | `transcribe.sh` | `bash ~/.agent-reach/tools/xiaoyuzhou/transcribe.sh ` | | 抖音 | `mcporter` | `mcporter call 'douyin.parse_douyin_video_info(...)'` | | LinkedIn | `mcporter` | `mcporter call 'linkedin.get_person_profile(...)'` | -| Boss直聘 | `mcporter` | `mcporter call 'bosszhipin.search_jobs_tool(...)'` | | RSS | `feedparser` | `python3 -c "import feedparser; ..."` | diff --git a/tests/test_channel_contracts.py b/tests/test_channel_contracts.py index 87feda3..f0b3818 100644 --- a/tests/test_channel_contracts.py +++ b/tests/test_channel_contracts.py @@ -115,7 +115,6 @@ def test_channel_can_handle_contract(): "xiaohongshu": "https://www.xiaohongshu.com/explore/123", "douyin": "https://www.douyin.com/video/123", "linkedin": "https://www.linkedin.com/in/test", - "bosszhipin": "https://www.zhipin.com/web/geek/job?query=python", "weibo": "https://weibo.com/u/1749127163", "rss": "https://example.com/feed.xml", "exa_search": "https://example.com", diff --git a/tests/test_channels.py b/tests/test_channels.py index c9c8dd5..f8cac6b 100644 --- a/tests/test_channels.py +++ b/tests/test_channels.py @@ -5,7 +5,6 @@ import shutil import subprocess from agent_reach.channels import get_all_channels, get_channel -from agent_reach.channels.bosszhipin import BossZhipinChannel from agent_reach.channels.xiaohongshu import XiaoHongShuChannel @@ -26,25 +25,6 @@ class TestChannelRegistry: assert "twitter" in names -class TestBossZhipinChannel: - def test_reports_ok_when_configured_and_logged_in(self, monkeypatch): - monkeypatch.setattr(shutil, "which", lambda _: "/opt/homebrew/bin/mcporter") - - def fake_run(cmd, **kwargs): - if cmd[:4] == ["/opt/homebrew/bin/mcporter", "config", "get", "bosszhipin"]: - return subprocess.CompletedProcess(cmd, 0, '{"name":"bosszhipin"}', "") - if cmd[:3] == ["/opt/homebrew/bin/mcporter", "call", "bosszhipin.get_login_info_tool"]: - return subprocess.CompletedProcess(cmd, 0, '{"is_logged_in": true}', "") - raise AssertionError(f"unexpected command: {cmd}") - - monkeypatch.setattr(subprocess, "run", fake_run) - - assert BossZhipinChannel().check() == ( - "ok", - "完整可用(职位搜索、登录态检查、向 HR 打招呼)", - ) - - class TestXiaoHongShuChannel: def test_reports_ok_when_server_health_is_ok(self, monkeypatch): monkeypatch.setattr(shutil, "which", lambda _: "/opt/homebrew/bin/mcporter")