# offershow.cn 招聘接口说明 > 基础域名:`https://www.offershow.cn` > 招聘业务接口响应体结构统一为 `{ "code": , "data": , "msg": }`;业务成功码为 **`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 加密,无需解密步骤。