Files
2026-07-24 15:50:07 +08:00

298 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` | **POSTJSON 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 加密,无需解密步骤。