298 lines
12 KiB
Markdown
298 lines
12 KiB
Markdown
# offershow.cn 招聘接口说明
|
||
|
||
> 基础域名:`https://www.offershow.cn`
|
||
> 招聘业务接口响应体结构统一为 `{ "code": <int>, "data": <object>, "msg": <string> }`;业务成功码为 **`200001`**。
|
||
> 与 xiaozhaoya 不同,**offershow 的 `data` 为明文 JSON,无加密**,拿到即可直接解析。
|
||
> 每次请求服务端都会下发一枚匿名访客 Cookie `_uvc_`(`HttpOnly`,有效期约 4 小时),用于访客追踪/风控;当前所有接口**裸调(不带 Cookie / 登录态)即可返回数据**。
|
||
|
||
## 一、接口总览
|
||
|
||
| # | 接口 | 方法 | 功能 | 是否需要授权 |
|
||
|---|------|------|------|-------------|
|
||
| 1 | `/json/category.json` | GET | **职位分类字典**:6 位数编码的两级职位分类树 | 否(静态文件,走 CDN 缓存) |
|
||
| 2 | `/api/od/get_company_tags` | GET | **公司行业标签字典**:行业标签 id / 名称 / 关键词 | 否 |
|
||
| 3 | `/api/od/get_hot_city` | GET | **热门城市列表**:筛选用城市名数组 | 否 |
|
||
| 4 | `/api/od/plan_table` | **POST(JSON body)** | **招聘计划列表**:分页返回招聘计划概要(引用上面 2、3 的字典) | **部分**:未登录时 `page`/`size` 及大部分筛选被忽略,恒返回固定 10 条预览 |
|
||
|
||
### 重要说明
|
||
|
||
- **接口 4 必须用 POST + JSON body**:以 GET 或把参数放 query string 调用一律返回 `404 page not found`(`text/plain`)。参数必须写在请求体 JSON 中。
|
||
- **未登录的分页限制**:未登录状态下 `plan_table` 的 `page`、`size` 参数均被忽略——无论传 `page=1` 还是 `page=5`、`size=20` 还是 `size=100`,都只返回**固定的第 1 页 10 条**。翻页与自定义每页条数需要登录态。
|
||
- **未登录的筛选限制**:仅 `city`(城市)筛选生效(会同时改变 `total` 与返回列表);`company_many_tags`(行业)、`search_content`(关键词)等筛选**在未登录时被忽略**(`total` 与结果均不变)。
|
||
|
||
---
|
||
|
||
## 二、请求示例、参数与返回值
|
||
|
||
### 接口 1:职位分类字典 `GET /json/category.json`
|
||
|
||
静态 JSON 文件,无参数,命中腾讯云 CDN 缓存(`x-cache-lookup: Cache Hit`)。
|
||
|
||
**请求示例**
|
||
|
||
```bash
|
||
curl 'https://www.offershow.cn/json/category.json'
|
||
```
|
||
|
||
**返回值(明文)**
|
||
|
||
```json
|
||
{
|
||
"data": [
|
||
{
|
||
"value": 100000,
|
||
"label": "技术/开发",
|
||
"children": [
|
||
{ "value": 101000, "label": "后端开发" },
|
||
{ "value": 101700, "label": "前端开发" },
|
||
{ "value": 102000, "label": "人工智能/算法" }
|
||
// ...
|
||
]
|
||
}
|
||
// ... 共 16 个一级分类
|
||
]
|
||
}
|
||
```
|
||
|
||
**编码规律**
|
||
|
||
- 一级分类:`100000`(技术/开发)、`110000`(产品)、`120000`(设计/交互)…… 按万位递增。
|
||
- 二级分类:一级基数 + 千位递增,如技术/开发(`100000`)下的 `101000` 后端开发、`101700` 前端开发。
|
||
- 一级分类共 16 个:技术/开发、产品、设计/交互、运营、市场/采购、人事/财务/行政、销售/客服、传媒、金融、教育/科研/培训、医疗健康、咨询/翻译/法律、服务业、生产制造、房地产/建筑、其他。
|
||
|
||
---
|
||
|
||
### 接口 2:公司行业标签字典 `GET /api/od/get_company_tags`
|
||
|
||
**请求示例**
|
||
|
||
```bash
|
||
curl 'https://www.offershow.cn/api/od/get_company_tags'
|
||
```
|
||
|
||
**返回值(明文)**
|
||
|
||
```json
|
||
{
|
||
"code": 200001,
|
||
"data": {
|
||
"company_tags": [
|
||
{ "id": 4, "content": "IT/互联网", "descriptions": "IT|互联网" },
|
||
{ "id": 19, "content": "游戏", "descriptions": "游戏" },
|
||
{ "id": 5, "content": "硬件/半导体", "descriptions": "电子|通信|硬件|半导体" }
|
||
// ...
|
||
]
|
||
},
|
||
"msg": ""
|
||
}
|
||
```
|
||
|
||
**字段说明**
|
||
|
||
| 字段 | 说明 |
|
||
|------|------|
|
||
| `id` | 行业标签 id,被 `plan_table` 的 `company_many_tags`、`company.industry_type` 引用 |
|
||
| `content` | 展示名称 |
|
||
| `descriptions` | 该标签涵盖的关键词,`|` 分隔 |
|
||
|
||
**完整标签表**
|
||
|
||
| id | content | descriptions |
|
||
|----|---------|-------------|
|
||
| 4 | IT/互联网 | IT\|互联网 |
|
||
| 19 | 游戏 | 游戏 |
|
||
| 5 | 硬件/半导体 | 电子\|通信\|硬件\|半导体 |
|
||
| 7 | 汽车/自动驾驶 | 新能源\|汽车\|自动驾驶 |
|
||
| 13 | 机械/制造业 | 生产\|制造\|机械 |
|
||
| 6 | 金融行业 | 金融\|保险\|证券\|投资 |
|
||
| 12 | 消费生活 | 消费\|生活\|服务\|娱乐 |
|
||
| 17 | 医疗健康 | 医疗\|健康 |
|
||
| 14 | 政府/事业单位 | 科研\|政府\|公共事业 |
|
||
| 8 | 国企央企 | 国企\|央企\|研究所 |
|
||
| 9 | 广告传媒 | 传媒\|印刷\|艺术\|设计 |
|
||
| 10 | 建筑/房地产 | 房地产\|建筑\|物业 |
|
||
| 18 | 材料/能源/化工 | 能源\|化工\|环保 |
|
||
| 16 | 物流/交通运输 | 采购\|贸易\|交通\|物流 |
|
||
| 15 | 其他行业 | 其他行业 |
|
||
|
||
---
|
||
|
||
### 接口 3:热门城市 `GET /api/od/get_hot_city`
|
||
|
||
**请求示例**
|
||
|
||
```bash
|
||
curl 'https://www.offershow.cn/api/od/get_hot_city'
|
||
```
|
||
|
||
**返回值(明文)**
|
||
|
||
```json
|
||
{
|
||
"code": 200001,
|
||
"data": {
|
||
"city_list": ["全部", "北京", "上海", "广州", "深圳", "杭州", "成都", "武汉",
|
||
"苏州", "南京", "天津", "郑州", "合肥", "长沙", "济南", "太原", "青岛",
|
||
"石家庄", "西安", "重庆", "厦门", "宁波", "福州", "昆明", "南昌", "佛山", "东莞"]
|
||
},
|
||
"msg": ""
|
||
}
|
||
```
|
||
|
||
- 首项为占位项 `"全部"`,其余为可用于 `plan_table` 请求体 `city` 参数的城市名。
|
||
|
||
---
|
||
|
||
### 接口 4:招聘计划列表 `POST /api/od/plan_table`
|
||
|
||
**请求体(JSON)**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|------|------|------|------|
|
||
| `page` | int | 是 | 页码,从 1 开始。**未登录时被忽略**(恒为第 1 页) |
|
||
| `size` | int | 是 | 每页条数。**未登录时被忽略**(恒返回 10 条) |
|
||
| `recruit_plan_type` | int | 否 | 招聘计划类型,如 `2`。缺省/传 0 不影响未登录返回 |
|
||
| `city` | string | 否 | 城市名(取自接口 3)。**未登录时生效**,会改变 `total` 与返回列表 |
|
||
| `search_content` | string | 否 | 关键词搜索。**未登录时被忽略** |
|
||
| `company_many_tags` | string | 否 | 行业标签 id(逗号分隔,取自接口 2)。**未登录时被忽略** |
|
||
| `recruit_type` | int | 否 | 招聘类型(0=不限) |
|
||
| `company_character` | int | 否 | 公司性质(0=不限) |
|
||
| `progress_status` | int | 否 | 进度状态(0=不限) |
|
||
| `is_recommend` | int | 否 | 是否推荐(0=不限) |
|
||
| `object_id` / `column_type` / `title` / `total` | - | 否 | 前端上下文透传字段,不影响未登录查询结果 |
|
||
|
||
**请求示例**
|
||
|
||
```bash
|
||
curl -X POST 'https://www.offershow.cn/api/od/plan_table' \
|
||
-H 'content-type: application/json' \
|
||
--data '{"page":1,"size":20,"recruit_plan_type":2}'
|
||
```
|
||
|
||
**返回值(明文)**
|
||
|
||
```json
|
||
{
|
||
"code": 200001,
|
||
"data": {
|
||
"total": 29954,
|
||
"is_login": false,
|
||
"is_recruit_vip": false,
|
||
"recruit_vip_num": 134,
|
||
"plans": [
|
||
{
|
||
"uuid": "b67d206c-b93d-4536-8005-6b10ac45eead",
|
||
"company_name": "网易游戏互娱",
|
||
"company_uuid": "管理员录入",
|
||
"company_logo": "/company_logo/2684d697-....jpg",
|
||
"company_many_tags": "4,19",
|
||
"company": {
|
||
"uuid": "", "fullname": "", "nickname": "", "logo": "",
|
||
"address": "", "intro": "", "website_link": "",
|
||
"industry_type": 0, "character": 0, "finance": 0, "scale": 0
|
||
},
|
||
"recruit_title": "网易游戏(互娱)2027届校园招聘正式启动!",
|
||
"recruit_city": "广州 | 杭州 | 上海",
|
||
"positions": "游戏策划类\r\n技术类\r\n用户体验及设计类\r\n产品类\r\n...",
|
||
"recruit_type": 3,
|
||
"plan_type": 2,
|
||
"recruit_plan_type": 1,
|
||
"graduate_type": 1,
|
||
"deliver_type": 1,
|
||
"time_type": 2,
|
||
"is_official": 2,
|
||
"is_recommend": 1,
|
||
"origin": "网易游戏互娱招聘公众号",
|
||
"notice_url": "https://mp.weixin.qq.com/s/....",
|
||
"recommend_code": " ZJwCjn",
|
||
"recommend_type": 1,
|
||
"view_cnt": 180,
|
||
"welfares": "[]",
|
||
"create_time": "2026-07-21T11:31:20+08:00",
|
||
"start_time": "2026-07-21T00:00:00+08:00",
|
||
"end_time": "2027-01-17T00:00:00+08:00",
|
||
"recruit_local_graduate_date_start": "2026-09-01T00:00:00+08:00",
|
||
"recruit_local_graduate_date_end": "2027-08-31T00:00:00+08:00",
|
||
"recruit_overseas_graduate_date_start": "2026-09-01T00:00:00+08:00",
|
||
"recruit_overseas_graduate_date_end": "2027-08-31T00:00:00+08:00"
|
||
}
|
||
// ... 未登录固定返回 10 条
|
||
]
|
||
},
|
||
"msg": ""
|
||
}
|
||
```
|
||
|
||
**`data` 顶层字段**
|
||
|
||
| 字段 | 说明 |
|
||
|------|------|
|
||
| `total` | 符合查询条件的总条数(`city` 筛选会改变它;`company_many_tags`/`search_content` 未登录时不改变) |
|
||
| `plans` | 招聘计划数组,未登录固定 10 条 |
|
||
| `is_login` | 是否已登录(裸调为 `false`) |
|
||
| `is_recruit_vip` | 是否招聘 VIP |
|
||
| `recruit_vip_num` | VIP 招聘数量 |
|
||
|
||
**单条 plan 关键字段**
|
||
|
||
| 字段 | 说明 |
|
||
|------|------|
|
||
| `uuid` | 招聘计划唯一标识 |
|
||
| `company_name` | 公司名 |
|
||
| `company_many_tags` | 行业标签 id 列表(逗号分隔),查表见接口 2 |
|
||
| `company` | 公司详情对象,未登录时多为空值 |
|
||
| `recruit_title` | 招聘标题 |
|
||
| `recruit_city` | 招聘城市,` | ` 分隔的自由文本 |
|
||
| `positions` | 招聘职位,`\r\n` 分隔的**自由文本**(非接口 1 的编码) |
|
||
| `notice_url` | 招聘公告原文链接(常为微信公众号推文) |
|
||
| `recruit_type` / `plan_type` / `graduate_type` / `deliver_type` / `time_type` / `is_official` / `is_recommend` | 内部小枚举,无独立字典接口,需前端硬编码映射 |
|
||
| `view_cnt` | 浏览量 |
|
||
| `create_time` / `start_time` / `end_time` | 时间字段(RFC3339,含 +08:00 时区) |
|
||
| `recruit_local_graduate_date_*` / `recruit_overseas_graduate_date_*` | 境内/境外毕业时间窗口 |
|
||
|
||
---
|
||
|
||
## 三、字段字典与关联关系
|
||
|
||
三个"字典接口"(1、2、3)为主数据接口 `plan_table`(4)提供编码含义与筛选选项。
|
||
|
||
### 1. `get_company_tags.id` ⟷ `plan_table.company_many_tags`(强关联 / 外键)
|
||
|
||
- `plan_table` 中 `company_many_tags: "4,19"` 是**逗号分隔的行业标签 id 列表**。
|
||
- 查表:`4` = IT/互联网,`19` = 游戏 ⇒ 该公司行业为【IT/互联网 + 游戏】。
|
||
- 同一字典也对应 `plan_table` 请求体的行业筛选参数 `company_many_tags`(登录后生效),以及 `plan.company.industry_type`(单值主行业)。
|
||
|
||
### 2. `get_hot_city.city_list` ⟷ `plan_table` 请求体 `city`(筛选入参)
|
||
|
||
- `city_list` 提供可选城市名,作为 `plan_table` 的 `city` 入参使用;`city` 是未登录唯一生效的筛选条件。
|
||
- 注意返回里的 `recruit_city` 是 ` | ` 分隔的自由文本,可含 `city_list` 之外的地名(如"香港/澳门/海外")。
|
||
|
||
### 3. `category.json` ⟷ 职位筛选(弱关联)
|
||
|
||
- `category.json` 是职位分类编码表,用于按职位维度的筛选/搜索(前端级联下拉)。
|
||
- **注意**:`plan_table.positions` 是招聘方录入的自由文本(`\r\n` 分隔),**不回填 category 的 `value`**,两者仅语义相关、无 id 级外键。
|
||
|
||
### 关系图
|
||
|
||
```
|
||
get_company_tags.id ──(逗号分隔多值)──► plan_table.company_many_tags [强关联/外键]
|
||
get_company_tags.id ──(单值主行业)────► plan_table.company.industry_type [强关联/外键]
|
||
|
||
get_hot_city.city_list ──(筛选入参)───► plan_table 请求体 city [筛选条件, 未登录唯一生效]
|
||
|
||
category.json.value ──(筛选入参)──────► plan_table 职位筛选参数(登录后) [查询条件]
|
||
category.json.label ~~(语义对应,无id)~ plan_table.positions(自由文本) [弱关联]
|
||
|
||
plan_table 独立枚举: recruit_type / plan_type / graduate_type / ... [无字典接口, 需前端硬编码]
|
||
```
|
||
|
||
---
|
||
|
||
## 四、反爬与鉴权说明
|
||
|
||
- **访客 Cookie `_uvc_`**:每次请求服务端 `Set-Cookie` 下发,`HttpOnly`、`Domain=www.offershow.cn`、`Max-Age≈15400s`(约 4 小时)。用于匿名访客追踪,当前不影响裸调取数。
|
||
- **业务码**:成功统一为 `code: 200001`(非 HTTP 200 语义)。
|
||
- **路由约束**:`plan_table` 仅接受 POST + JSON body,误用 GET 返回 `404 page not found`(`text/plain`)。
|
||
- **登录门槛**:翻页(`page`≥2)、自定义 `size`、以及 `company_many_tags`/`search_content` 等筛选均需登录态才生效;未登录只能取到第 1 页固定 10 条、且仅 `city` 筛选可用。
|
||
- **数据形态**:响应为明文 JSON,无 xiaozhaoya 那样的 AES 加密,无需解密步骤。
|