Files
campus_spider/doc/offershow.md
T
2026-07-24 15:50:07 +08:00

12 KiB
Raw Blame History

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 foundtext/plain)。参数必须写在请求体 JSON 中。
  • 未登录的分页限制:未登录状态下 plan_tablepagesize 参数均被忽略——无论传 page=1 还是 page=5size=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_tablecompany_many_tagscompany.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_table4)提供编码含义与筛选选项。

1. get_company_tags.idplan_table.company_many_tags(强关联 / 外键)

  • plan_tablecompany_many_tags: "4,19"逗号分隔的行业标签 id 列表
  • 查表:4 = IT/互联网,19 = 游戏 ⇒ 该公司行业为【IT/互联网 + 游戏】。
  • 同一字典也对应 plan_table 请求体的行业筛选参数 company_many_tags(登录后生效),以及 plan.company.industry_type(单值主行业)。

2. get_hot_city.city_listplan_table 请求体 city(筛选入参)

  • city_list 提供可选城市名,作为 plan_tablecity 入参使用;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 下发,HttpOnlyDomain=www.offershow.cnMax-Age≈15400s(约 4 小时)。用于匿名访客追踪,当前不影响裸调取数。
  • 业务码:成功统一为 code: 200001(非 HTTP 200 语义)。
  • 路由约束plan_table 仅接受 POST + JSON body,误用 GET 返回 404 page not foundtext/plain)。
  • 登录门槛:翻页(page≥2)、自定义 size、以及 company_many_tags/search_content 等筛选均需登录态才生效;未登录只能取到第 1 页固定 10 条、且仅 city 筛选可用。
  • 数据形态:响应为明文 JSON,无 xiaozhaoya 那样的 AES 加密,无需解密步骤。