12 KiB
12 KiB
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)。
请求示例
curl 'https://www.offershow.cn/json/category.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
请求示例
curl 'https://www.offershow.cn/api/od/get_company_tags'
返回值(明文)
{
"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
请求示例
curl 'https://www.offershow.cn/api/od/get_hot_city'
返回值(明文)
{
"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 |
- | 否 | 前端上下文透传字段,不影响未登录查询结果 |
请求示例
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}'
返回值(明文)
{
"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 加密,无需解密步骤。