JobSpy MCP服务器
一个自给自足的 MCP(模型上下文协议) 服务器 它将多站点作业抓取作为AI可调用工具公开。 将其连接到任何兼容MCP的客户端(Claude Desktop、Cursor、自定义代理)并搜索 LinkedIn、Indeed、Glassdoor、ZipRecruiter、Google Jobs、, 以及区域委员会——所有这些都是通过自然语言或结构化工具调用实现的。
scraper实现直接在该存储库中提供;无外部 python-jobspy 包裹是必需的。
______________________________________________________________________
特性
- 4个MCP工具 —
scrape_jobs_tool,get_supported_countries,get_supported_sites,get_job_search_tips - 13个招聘板 --LinkedIn、Indeed、Glassdoor、ZipRecruiter、谷歌招聘、Bayt(中东)、Naukri(印度)、Stepstone(德国/DACH)、Xing(德国)、柏林创业公司招聘、欢迎来到丛林、欧盟创业公司、join.com
- 标准化输出模式 —
id,company_name,role_title,description,description_source,job_type,job_url,location,work_mode,language,source_platform,scraped_at,content_hash - 模式稳定的JSON输出 --所有公共工具风格的API都返回JSON信封,以实现一致的客户端解析
- 高级过滤 --工作类型、仅远程、发布年龄、特定城市、易于申请、分页偏移
- 进度报告 --通过MCP上下文实时更新进度
- Docker支持 --单映像部署
- 完全自给自足 --刮板源由以下供应商提供
jobspy_mcp_server/jobspy_scrapers/
API 参考
规范的API契约存在于 docs/API_集成.md.
将该文档用于:
- MCP工具参数和JSON响应形状
- CLI调用和stdout合约
- MCP传输端点详细信息
- 基于markdown的旧助手输出的迁移指南
______________________________________________________________________
技术栈
| 层 | 技术 |
|---|---|
| MCP框架 | FastMCP + mcp>=1.1.0 |
| 语言 | Python 3.10+ |
| 抓取 | 自定义HTTP抓取器(请求、tls客户端、BeautifulSoup4) |
| 数据处理 | pandas,numpy |
| 文本格式 | markdownify |
| 包管理器 | 紫外线 |
| 构建后端 | Hatching |
| 测试 | pytest |
| 容器化 | Docker |
______________________________________________________________________
项目结构
jobspy-mcp-server/
├── jobspy_mcp_server/
│ ├── __init__.py # Package exports
│ ├── __main__.py # python -m entrypoint
│ ├── cli.py # JSON-only standalone CLI entrypoint
│ ├── json_output.py # Shared normalized job serialization
│ ├── server.py # MCP tool definitions (scrape_jobs_tool, etc.)
│ └── jobspy_scrapers/ # Vendored scraper implementation
│ ├── __init__.py # scrape_jobs() public API
│ ├── model.py # JobPost, Country, and other data models
│ ├── util.py # Shared utilities
│ ├── exception.py # Custom exceptions
│ ├── linkedin/ # LinkedIn scraper
│ ├── indeed/ # Indeed scraper
│ ├── glassdoor/ # Glassdoor scraper
│ ├── google/ # Google Jobs scraper
│ ├── ziprecruiter/ # ZipRecruiter scraper
│ ├── bayt/ # Bayt (Middle East) scraper
│ ├── naukri/ # Naukri (India) scraper
│ ├── stepstone/ # Stepstone (Germany/DACH) scraper
│ ├── xing/ # Xing (Germany) scraper
│ ├── berlinstartupjobs/ # Berlin Startup Jobs scraper
│ ├── welcometothejungle/# Welcome to the Jungle scraper (Algolia API)
│ ├── eustartups/ # EU-Startups jobs board scraper
│ └── join/ # join.com scraper
├── test/
│ ├── test_jobspy_mcp.py # Unit tests (mocked)
│ └── test_server.py # MCP protocol smoke test
├── Dockerfile
├── pyproject.toml
├── requirements.lock # Pinned dependency lockfile
├── THIRD_PARTY_LICENSES.md
└── LICENSE______________________________________________________________________
安装
先决条件
- Python 3.10或更高版本
uv(推荐) 或pip
紫外线(推荐)
git clone https://github.com/yourorg/jobspy-mcp-server
cd jobspy-mcp-server
uv sync使用pip
git clone https://github.com/yourorg/jobspy-mcp-server
cd jobspy-mcp-server
pip install -e .______________________________________________________________________
运行服务器
紫外线:
uv run python -m jobspy_mcp_serverpython
python -m jobspy_mcp_server已安装的脚本入口点:
jobspy-mcp-serverDocker:
docker build -t jobspy-mcp-server .
docker run --rm -it jobspy-mcp-server服务器通过以下方式进行通信 标准 并且被设计为由不通过HTTP访问的MCP客户端启动。
MCP检查器(交互式调试UI)
要在本地测试服务器而不配置客户端,请使用 MCP检查员:
npx @modelcontextprotocol/inspector python -m jobspy_mcp_server然后打开 http://localhost:6274 在您的浏览器中。
一步一步:打电话 scrape_jobs_tool 来自检查员
- 启动检查器 --运行上面的命令。终端显示
MCP Inspector is up and running at http://localhost:6274. - 打开用户界面 首选
http://localhost:6274在您的浏览器中。 - 连接 --点击 连接 顶部栏中的按钮。服务器连接后,状态指示灯变为绿色。
- 浏览工具 --点击 工具 左侧边栏中的选项卡。你会看到
scrape_jobs_tool,get_supported_countries,get_supported_sites,以及get_job_search_tips. - 选择
scrape_jobs_tool--点击它。右侧面板显示了一个包含所有参数的输入表单。 - 填写参数 --在表单字段中输入值:
- search_term (必填):例如。 software engineer - cities:例如。 ["Munich", "Berlin", "Frankfurt"] (可选;指定城市以限制搜索) - country_indeed:例如。 germany (默认值:美国) - site_name:例如。 ["indeed"] - results_wanted:例如。 5 - 将其他字段保留为默认值或根据需要进行调整。
- 运行该工具 --单击 运行工具 按钮。
- 查看结果 --响应以JSON信封的形式出现在下面的面板中
ok,jobs,以及error.
示例:检查器中的JSON输出
在检查器窗体中设置这些参数:
| 字段 | 值 |
|---|---|
search_term | android engineer |
cities | ["San Francisco"] |
country_indeed | usa |
site_name | ["linkedin"] |
results_wanted | 3 |
linkedin_fetch_description | true |
重要提示: 默认情况下,LinkedIn列表不包括职位描述。 集linkedin_fetch_description到true获取每个作业的完整描述。 这使得每个作业多出一个HTTP请求,因此速度较慢。 如果你设置它false,thedescription字段将是null为了 LinkedIn结果。这不会影响其他网站,如Indeed或Glassdoor, 其中自动包括描述。
响应将是一个JSON信封,如下所示:
{
"ok": true,
"jobs": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"company_name": "Acme Corp",
"role_title": "Android Engineer",
"description": "...",
"description_source": "detail_page",
"job_type": "fulltime",
"job_url": "https://www.linkedin.com/jobs/view/1234567890",
"location": "San Francisco, CA",
"work_mode": "hybrid",
"language": "English",
"source_platform": "linkedin",
"scraped_at": "2026-04-03T09:00:00.000000+00:00",
"content_hash": "3af6df4f2570a7e2d23c76fc6e43d65ff15ec1881a627f2f6fb652f9d4a686f5"
}
],
"error": null
}检查员故障排除
- “连接”按钮保持灰色 --确保服务器进程在终端中启动时没有错误。检查一下
python -m jobspy_mcp_server它自己跑得很干净。 - 工具返回空结果 --试试看
indeed作为网站(最可靠),使用广泛search_term,并减少results_wanted到3. site_name格式 --在检查器窗体中,将其作为JSON数组输入:["indeed"]或["indeed", "linkedin"]。不要使用纯逗号分隔的字符串。- 端口冲突 --如果端口6274正在使用中,检查器将在终端中打印备用URL。
______________________________________________________________________
MCP客户端配置
克劳德桌面版
Windows配置路径: %APPDATA%\Claude\claude_desktop_config.json\ macOS配置路径: ~/Library/Application Support/Claude/claude_desktop_config.json
使用紫外线(推荐):
{
"mcpServers": {
"jobspy": {
"command": "uv",
"args": ["run", "python", "-m", "jobspy_mcp_server"],
"cwd": "/absolute/path/to/jobspy-mcp-server"
}
}
}使用已安装的脚本:
{
"mcpServers": {
"jobspy": {
"command": "jobspy-mcp-server"
}
}
}使用Docker:
{
"mcpServers": {
"jobspy": {
"command": "docker",
"args": ["run", "--rm", "-i", "jobspy-mcp-server"]
}
}
}编辑配置后,重新启动Claude Desktop。
开爪
OpenClaw没有原生MCP客户端支持,因此集成使用了两个桥接器:
| 方法 | OpenClaw工具 | 传输 | 最适合 |
|---|---|---|---|
| CLI包装器 | exec | stdin/stdout | 快速设置,无需服务器进程 |
| HTTP端点 | web_fetch | SSE/流式HTTP | 持久服务,多个客户端 |
快速入门-CLI(exec):
# Install the package (once)
pip install -e /path/to/jobspy-mcp-server
# Test the CLI (JSON output)
jobspy-search "python developer" --cities "Munich,Berlin,Frankfurt" --country "Germany" --sites "linkedin" --results 5
# Pipeline smoke test (OpenClaw/developer integration)
jobspy-search "software engineer" --cities "Berlin" --sites "stepstone,xing" --job-type "contract" --results 1快速入门--HTTP(web_fetch):
# Start the server with SSE transport
jobspy-mcp-server --transport sse --host 127.0.0.1 --port 8765
# SSE endpoint: GET http://127.0.0.1:8765/sse
# Messages: POST http://127.0.0.1:8765/messagesOpenClaw技能包含在 assets/openclaw-skill/SKILL.md.\ 将其复制到您的OpenClaw工作区:
# Windows
copy assets\openclaw-skill\SKILL.md %USERPROFILE%\.openclaw\workspace\skills\jobspy-search\SKILL.md
# macOS / Linux
cp assets/openclaw-skill/SKILL.md ~/.openclaw/workspace/skills/jobspy-search/SKILL.md有关完整的集成指南——端点、JSON-RPC示例、故障排除——请参阅 docs/openclaw-integration.md.
______________________________________________________________________
如何寻找工作
一旦服务器连接到客户端,您就可以通过自然语言提示或直接调用该工具来搜索作业。
自然语言(克劳德桌面)
键入聊天内容:
Search for Python developer jobs in New York on LinkedInFind remote data scientist roles on Indeed posted in the last 48 hoursLook for full-time software engineer jobs in London using LinkedIn and Glassdoor, fetch full descriptionsFind senior Java developer contract jobs on LinkedIn and Indeed, return 15 results客户端会自动将这些转换为 scrape_jobs_tool 电话。
直接工具调用
仅限LinkedIn:
{
"search_term": "software engineer",
"location": "San Francisco, CA",
"site_name": ["linkedin"],
"results_wanted": 10,
"linkedin_fetch_description": true
}LinkedIn+Indeed合并:
{
"search_term": "data scientist",
"location": "New York, NY",
"site_name": ["linkedin", "indeed"],
"results_wanted": 15,
"hours_old": 72
}所有主要板上的远程作业:
{
"search_term": "frontend developer",
"is_remote": true,
"site_name": ["linkedin", "indeed", "glassdoor"],
"job_type": "fulltime",
"results_wanted": 15
}印度/Naukri地区搜索:
{
"search_term": "machine learning engineer",
"location": "Bangalore",
"site_name": ["naukri", "linkedin"],
"results_wanted": 15
}中东/海湾搜索:
{
"search_term": "project manager",
"location": "Dubai",
"site_name": ["bayt", "indeed"],
"country_indeed": "united arab emirates",
"results_wanted": 15
}结构化JSON输出(默认):
{
"search_term": "android engineer",
"location": "San Francisco, CA",
"site_name": ["linkedin"],
"results_wanted": 5
}返回一个具有稳定顶级键的JSON信封: ok, jobs,以及 error.
- 成功:
ok=true,jobs=[...],error=null - 空结果:
ok=true,jobs=[],error=null - 验证/运行时失败:
ok=false,jobs=[],error={"code":"...","message":"..."}
每个作业对象仅包含: id (UUID), company_name, role_title, description, description_source, job_type, job_url, location, work_mode, language, source_platform, scraped_at,以及 content_hash 哪里 content_hash = SHA256(title + company + location) 正常化后。
______________________________________________________________________
MCP工具参考
scrape_jobs_tool
在多个工作板上搜索工作。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
search_term | 字符串 | 必需的 | 主要搜索关键字,例如 "python developer". |
cities | list\[字符串\] | [] | 要搜索的城市列表(例如。, ["Munich", "Berlin", "Frankfurt"]).如果指定,搜索仅限于这些城市。留空表示没有城市过滤器。 |
site_name | list\[字符串\] | ["linkedin"] | 支持的值: linkedin, indeed, glassdoor, zip_recruiter, google, bayt, naukri, stepstone, xing, berlin_startup_jobs, welcome_to_the_jungle, eu_startups, join每个请求最少1个站点,最多5个站点。 |
results_wanted | int | 1 | 每个站点的预期结果计数。使用城市扇出时,防护范围为1-15,并作为现场提取帽处理。 |
job_type | 字符串 | null | 支持的值来自内部 JobType 枚举: fulltime, parttime, internship, contract, temporary, other 以及更多的别名。 |
work_mode | 字符串 | null | 支持的值: remote, hybrid, on-site. |
is_remote | bool | 首选项派生 | 在支持的情况下启用仅远程筛选。如果省略,则应用运行时首选项默认值。 |
hours_old | int | 24 | 按支持的发布年龄进行筛选。防守1-72。 |
easy_apply bool的。 false | 在支持的地方轻松应用过滤器。 | ||
country_indeed | 字符串 | "usa" | 国家枚举选择器。主要由Indeed和Glassdoor使用。 |
linkedin_fetch_description bool的。 true | 在LinkedIn和Naukri上启用每个作业的详细信息获取(速度较慢)。 | ||
offset | int | 0 | 分页偏移。行为因提供者而异,也应用于最终组合的DataFrame中。 |
verbose | int | 1 | 日志记录级别: 0 错误, 1 警告, 2 信息。 |
参数注释:
site_name根据服务器中的固定允许列表进行验证。任何无效值都会返回错误。site_name每个请求最多支持5个值。results_wanted是全市范围内每个站点的请求上限。例子:results_wanted=1每个选定站点最多可提取一个作业。country_indeed接受以下别名usa,us,united states.使用get_supported_countries查看完整列表。linkedin_fetch_description=true增加了运行时间,因为它触发了额外的页面/API获取。
get_supported_countries
返回接受的国家标识符的完整列表 country_indeed.
What countries are supported for job searches?get_supported_sites
返回所有支持的工作板名称以及说明和使用指南。
What job boards can I search?get_job_search_tips
返回一份深入的指南,涵盖搜索词优化、网站选择、性能提示和常见故障排除。
Give me tips for finding jobs faster______________________________________________________________________
支持的工作板
site_name value | 平台 | 区域覆盖 | 内部行为说明 |
|---|---|---|---|
linkedin | Global | 使用偏移分页,在1000条记录附近有一个实用的硬停止。公共API支持 cities、远程过滤器、作业类型、最近性、易于应用和可选的完整描述获取。 | |
indeed | 确实 | 多个国家/地区 | 使用来自的国家/地区特定域/API代码 country_indeed.公共API支持 cities、最近性、作业类型、远程,以及通过特定于提供者的查询分支轻松应用。 |
glassdoor | Glassdoor | 多国 | 使用映射自的Glassdoor域 country_indeed.公共API支持 cities、远程过滤器、最近度、作业类型和易于应用。结果内部上限为900。 |
zip_recruiter | ZipRecruiter | 美国/加拿大焦点 | Cookie+令牌分页流程。不使用 country_indeed与LinkedIn或Indeed相比,高级过滤功能有限。 |
google | Google Jobs | Global aggregation | Query-bilt scrapeng,具有可选的内部覆盖和对公共API过滤器的支持,如远程、作业类型、最近性和 cities。结果内部上限为900。 |
bayt | Bayt | 中东焦点 | HTML解析流程。主要使用搜索词和分页;高级过滤器是有限的。 |
naukri | Naukri | 印度焦点 | 带有额外字段的JSON API流(skills, experience_range, company_rating等等)。公共API支持 cities、远程过滤器、最近度和可选的详细描述获取。 |
stepstone | Stepstone | 德国/DACH焦点 | HTML解析流程。支持搜索词、面向城市的过滤和分页。覆盖德国和欧洲就业市场。 |
xing | 德国焦点 | HTML解析流程。支持搜索词、面向城市的过滤和分页。德国专业社交平台,提供工作列表。 |
提供者参数支持矩阵
传说: Yes =直接支持, Partial =支持警告/特定于提供商的行为, No =忽略或未实现。
| 供应商 | cities | country_indeed | is_remote | job_type | hours_old | easy_apply | offset | linkedin_fetch_description | |
|---|---|---|---|---|---|---|---|---|---|
| 是 | 否(全球固定) | 是 | 是 | ||||||
| 确实 | 是 | 是 | 有 | 有 | 部分(查询分支规则) | 部分(询问分支规则) | 有 | 无 | |
| 玻璃门 | 是 | 是 | 对 | 是 | 有 | 有 | 对 | 有 | 无 |
| ZipRecruiter | 是 | 否(美国/加拿大流程) | 否 | 否 | 不 | 否 | 部分 | 否 | |
| 谷歌工作 | 是 | 否 | 是 | 是 | 不是 | 是 | |||
| Bayt | 部分 | 否(全球固定) | 否 | 否 | 不 | 否 | 部分 | 不 | |
| Naukri | 是 | 否(印度焦点) | 是 | 不是 | 是 | 不 | 是 | 是 | |
| Stepstone | 是 | 否(德国焦点) | 否 | 否 | 不 | 否 | 部分 | 否 | |
| 邢 | 是 | 否(德国焦点) | 否 | 否 | 不 | 否 | 部分 | 否 |
提供商警告和限制
- LinkedIn:比其他来源更严格的反机器人行为和退避敏感性。
- 事实上:国家选择是有意义的,应该为非美国搜索设置。
- Glassdoor:内部要求将结果限制在900。
- 谷歌工作:内部将搜索结果限制在900个以内,具体取决于光标的可用性。
- ZipRecruiter:最适合美国/加拿大;全球行为是有限的。
- Bayt,Naukri:高级过滤器保证较少的区域供应商。
- Stepstone,Xing:基于HTML抓取的德国/DACH区域提供商。
______________________________________________________________________
如何添加新提供者
此项目在以下情况下使用每个模块的提供程序架构 jobspy_mcp_server/jobspy_scrapers/.
1.创建提供者模块
创建新文件夹:
jobspy_mcp_server/jobspy_scrapers//
推荐文件:
__init__.py(必填):刮刀类实现。constant.py(可选但推荐):URL、有效载荷模板、选择器、标头。util.py(可选):特定于提供程序的解析帮助程序。
实现一个继承抽象的类 Scraper 并返回 JobResponse 从 scrape(scraper_input: ScraperInput).
2.注册提供者枚举
更新 Site 在 jobspy_mcp_server/jobspy_scrapers/model.py 使用新的字符串值 site_name.
例子:
class Site(Enum):
# ... existing providers
MY_PROVIDER = "my_provider"3.添加刮刀映射
更新 jobspy_mcp_server/jobspy_scrapers/__init__.py:
- 为新的scraper类添加导入。
- 在中添加映射
SCRAPER_MAPPING.
例子:
from jobspy_mcp_server.jobspy_scrapers.my_provider import MyProvider
SCRAPER_MAPPING = {
# ... existing mappings
Site.MY_PROVIDER: MyProvider,
}4.暴露MCP层中的提供者
更新中的验证允许列表 jobspy_mcp_server/guardrails.py:
- 将您的提供商添加到
VALID_SITES. - 在中添加描述
get_supported_sites输出。 - 在README中添加一个直接使用示例(推荐)。
5.遵循数据合同预期
填充 JobPost 一贯地:
- 必填质量字段:
title,job_url,company_name,location如果可用。 - 可选富集:
description、补偿字段,date_posted,job_type,is_remote. - 在需要的地方使用现有的转换器(markdown/plain)规范文本输出。
6.处理错误和恢复能力
- 捕获特定于提供者的请求/解析失败并返回
JobResponse(jobs=[])而不是破坏整个运行。 - 通过现有的提供程序记录器使用
create_logger公用事业。 - 为反机器人或限速提供商添加受控延迟/回退。
7.安全检查表(必填)
- 在返回之前,验证并规范任何抓取的URL。
- 除非故意要求,否则避免返回不安全的原始HTML。
- 对于描述,更喜欢标记/纯转换。
- 请勿对提供程序模块中的机密、API密钥或凭据进行硬编码。
8.测试检查表
在中添加或扩展测试 test/:
test_jobspy_mcp.py:验证新站点名称传递scrape_jobs_tool验证并显示在支持的站点输出中。- 提供者单元测试:解析器健壮性、空结果处理、分页行为和偏移/结果切片。
test_server.py:确保MCP服务器结构/工具保持完好。
9.常见的集成错误
- 添加了枚举但忘记了
SCRAPER_MAPPING导入/输入。 - 添加了刮刀映射,但忘记了
guardrails.pyVALID_SITES允许列表。 - 返回原始结构,而不是
JobResponse/JobPost模式。 - 忽略偏移/结果切片,并生成无界结果集。
- 添加了提供程序,但忘记了README支持的网站文档。
______________________________________________________________________
配置
基本操作不需要环境变量。可选运行时行为:
| 设置 | 如何配置 |
|---|---|
| 记录详细程度 | 设置 verbose 每个工具调用中的参数(0/1/2) |
| 代理支持 | 通过 proxies 如果扩展服务器,则直接进入底层scraper |
| TLS证书 | 通过 ca_cert 企业代理通过scraper层的路径 |
| 描述格式 | 硬编码为 "markdown" 在 server.py;改变 description_format 到 "html" 或 "plain" 如果需要 |
| ToS受限抓取器 | 设置环境变量 JOBSPY_RESPECT_ROBOTS=true 禁用 welcome_to_the_jungle 和 join 抓取器(它们将返回零个作业并记录警告,而不是抓取) |
______________________________________________________________________
测试
# Run all unit tests (no network required)
uv run pytest test -v
# Exclude integration tests (default CI mode)
uv run pytest test -q -m "not integration"
# Run integration tests (live network, real job boards)
uv run pytest test -v -m integration
# Run a specific file
uv run pytest test/test_jobspy_mcp.py -v
uv run pytest test/test_server.py -v随着 pip 而不是 uv:
pytest test -v______________________________________________________________________
构建和部署
本地可编辑安装
uv sync
# or
pip install -e .码头工人
# Build
docker build -t jobspy-mcp-server .
# Run (stdio mode — attach via MCP client)
docker run --rm -it jobspy-mcp-server软件包构建(wheel/slist)
uv build
# outputs dist/jobspy_mcp_server-1.0.0-*.whl______________________________________________________________________
故障排除
模块或导入错误
uv sync # reinstall all deps
python -m jobspy_mcp_server # confirm the entry point starts cleanly未返回任何结果
- 拓宽
search_term(字数更少) - 尝试
indeed首先作为一个单一的网站 - 检查城市拼写
cities;用于非美国搜索集country_indeed明确地
速率限制/HTTP 429
- 减少
results_wanted(从10开始) - 避免在LinkedIn上搜索大量内容
- 在连续搜索之间添加间距
- 使用
proxies用于重复的自动搜索
Claude Desktop未检测到工具
- 验证
claude_desktop_config.json是有效的JSON - 确认
cwd指向存储库根目录 - 配置更改后重新启动Claude Desktop
- 手动运行服务器一次,确认没有启动错误
linkedin_fetch_description 非常慢
- 仅在需要完整描述时启用此功能;它为每个作业发出一个额外的HTTP请求
______________________________________________________________________
贡献
- 分叉存储库并创建功能分支。
- 在适用的情况下,通过测试进行更改。
- 确保所有单元测试通过:
uv run pytest test -q -m "not integration" - 打开一个包含更改清晰描述的拉取请求。
代码样式由强制执行 black (线长88)。提交前运行:
uv run black .______________________________________________________________________
归因
刮刀的实施(jobspy_mcp_server/jobspy_scrapers/)来源于 JobSpy 由Cullen Watson(麻省理工学院许可证)提供 进入此存储库进行单个项目部署。
完整的许可证文本位于 第三阶段_许可.md.
______________________________________________________________________
许可证
MIT许可证——见 许可证 了解详情。
