基础介绍
接口文档
简历解析 简历画像 人岗匹配 职位解析 职位语义相似度 简历评估 人才推荐 人才搜索 简历查重

简历解析

ResumeSDK简历解析提供对输入的附件简历进行结构化处理的功能,共解析出10大主要功能模块,合计160多个字段信息。ResumeSDK的服务基于http+json格式的接口方式提供服务,可以同时支持各种不同开发语言的客户端调用。


服务模式

ResumeSDK提供SaaS模式和独立部署两种形式的服务模式:

  1. SaaS模式:服务部署在我司服务器上,客户通过远程API调用的方式使用服务,按调用次数或者包年模式收费。可通过以下2种方式进行使用:
  2. 1)直接和我们购买:单价便宜,可以按次、包月或者包年。需要签合同,有起充额度要求;
    2)通过云市场购买:单价稍贵,可以按次购买。不需签合同,起充额度要求低,随购随用;(阿里云接口地址腾讯云接口地址
  3. 独立部署:服务部署在客户自己的服务器上,客户自行运维和管控服务,无调用次数和期限的限制;

两种服务方式的接口仅涉及账户信息的地方有差异,简历结构化等其他字段信息均一致。以下以SaaS服务的接口格式做详细介绍。


注意事项

  1. 不定期新增字段:功能升级需要,我们会不定期在json结果中增加一些新的解析字段,因此在读取结果数据时,请注意对后续新增字段的兼容;
  2. 高级功能默认关闭:对于头像解析及实践经历解析等功能,由于会影响解析效率,因此默认是关闭状态,如有需要请参考请求接口文档进行开启;
  3. 对于图片等简历格式,如果需要更佳的解析效果,请将请求参数ocr_type置为1;

1、请求接口格式


请求ULR

  • SaaS接口请求url:http://www.resumesdk.com/api/parse;
  • 独立部署请求url:http://ip:2015/api/ResumeParser;(ip换成实际的ip地址)
  • 阿里云接口请求url:http://resumesdk.market.alicloudapi.com/ResumeParse;
  • 腾讯云接口请求url:https://service-9wsy8usn-1302482110.bj.apigw.tencentcs.com/release/ResumeParser;

接口格式

按照如下方式和内容构造http请求:

  1. http请求方式:POST;
  2. http请求头设置Content Type:application/json,并设置:
  3. 字段 类型 必填 描述
    uid int 必填 用户id(注:仅SaaS接口需要,独立部署版或者阿里云客户不需此字段)
    pwd string 必填 用户密码(注:仅SaaS接口需要,独立部署版或者阿里云客户不需此字段)
  4. http请求内容,通过json格式打包如下字段信息:
    字段 类型 必填 描述
    file_name string 必填 简历文件名。请务必带上正确的文件后缀名,否则部分简历可能解析失败。
    file_cont string 必填 简历文件内容(以base64编码),其中:
    1)图片简历:based64编码后大小不超过8M,最短边至少100px,支持jpg/jpeg/png/bmp/tif/gif格式。
    图片越大OCR超时风险越高,建议大小不超过4M、长宽比小于4、分辨率600*800以上;
    2)非图片简历:based64编码后大小不超过10M(注:阿里云接口是不超过8M);
    need_avatar int 可选 是否需要解析头像,0为不需要,1为需要,默认为0
    need_social_exp int 可选 是否需要解析实践经历,0为不需要,1为需要,默认为0:
    1)若需要解析,则对“社会实践”及“在校活动”文本进行解析,解析结果放置在social_exp_objs字段中;
    ocr_type int 可选 ocr(图片解析所用到的文字识别)类型。(注:仅独立部署版需要,SaaS接口或者阿里云客户不需此字段)
    version int 可选 接口版本,当前取值为0和1,默认为0:
    1)version=0:仅当字段在简历中有出现,才会在json结果中返回;
    2)version=1:不管字段在简历中有无出现,均在json结果中返回,若无出现则该字段取值为空;

请求结构体示例:


    {
        "file_name": "resume_name.docx",
        "file_cont": "UFAFDA132fAFA...",
        "need_avatar": 0
    }
            

注1:其中uid和pwd为账号信息,需要和我们申请。如果通过阿里云接口服务进行接入(appcode认证方式),则不需uid和pwd,且返回接口无account信息。 注2:2022.04新增基于url的请求方式:只需将file_cont替换为file_url字段(存放简历文件所在的url)即可,其余字段不变。若url中包含文件后缀,可不设置file_name;若url中不包含后缀,则请设置file_name字段,带上正确的文件后缀。


2、返回接口总体格式

ResumeSDK以json格式返回解析结果,它的内容包括:

  1. "status",解析结果状态信息:
    字段 类型 描述
    code int 状态码,200表示正常,其余表示异常,具体参考错误状态码
    message string 状态信息描述
  2. "account",账户状态信息:
    字段 类型 描述
    uid int 用户id
    usage_limit int 用户的总调用量
    usage_remaining int 用户剩余的调用量,参考扣费规则,当值为0时不能再调用。为保持类型不变,仅保留整数部分
  3. "result",简历解析结构体。包含170多个字段信息,具体参考简历解析结构体

返回结构体示例:


    {
        "status": {
            "code": 200,
            "message": "OK"
        },
        "account": {
            "uid": 123456,
            "usage_limit": 62500,
            "usage_remaining": 50000
        },
        "result": {
            ...
        },
    }
            

2.1.1 错误状态码

当错误状态码等于200时表示解析正常,为其他值时表示解析异常,不同的值代表不同的错误信息。

码值 含义
200 正常状态,表示解析成功
250 账号(uid)或密码(pwd)错误
251 账号剩余用量为0(需及时充值)
260 请求参数错误
261 简历内容为空
262 简历内容过长
263 不支持的简历文件格式
264 base64解码出错
265 图片文件过大,或者长宽大小超过限制
266 输入参数file_name缺少文件后缀名(请带上正确的文件后缀,如果是纯文本则为.txt)
267 输入的json结构体有误(即解码失败)
240 简历解析内部错误
241 文件解析内部错误
280 人岗匹配内部错误

3、简历解析结构体

简历解析结果均放在result字段下,共包含170多个字段信息。


3.1 基本信息

基本信息包含解析结果的基础字段,作为result结构体下的一级字段存在。包含的字段如下:

3.1.1 基本信息—基础信息

基本信息包含解析结果的基础字段,作为result结构体下的一级字段存在。包含的字段如下:

字段 含义 类型 取值
name 姓名 string 人名,比如“姚明”
surname 姓氏 string 姓氏,比如“姚”
gender 性别 string 男、女、male、female
gender_inf 性别(推断) string 男、女。根据简历信息建模预测出的性别,约9成多的准确率。
age 年龄 string 年龄,比如“25”
age_inf 年龄(推断) string 如简历中无年龄,则从简历信息推断出该字段,有一定的误差率。
height 身高 string 180cm
weight 体重 string 75kg
marital_status 婚姻状态 string 已婚、未婚、已结婚、未结婚、保密
birthday 出生日期 string 比如:2019.10.01或者2019.10
hukou_address 户口地址 string 用户填写的地址,比如“上海市虹口区广粤路xx弄x号xxx室”
hukou_address_norm 户口地址(规范化) string 规范化到“区县”一级,比如“中国-上海市-虹口区”
hometown_address 籍贯地址 string 用户填写的地址,比如“上海市虹口区广粤路xx弄x号xxx室”
hometown_address_norm 籍贯地址(规范化) string 规范化到“区县”一级,比如“中国-上海市-虹口区”
id_card 身份证号 string 身份证号
race 民族 string 比如:汉、汉族
nationality 国籍 string 比如:中国、越南、美国
polit_status 政治面貌 string 比如:党员、团员、共青团员、共产党员、无党派人士、共产党党员
blood_type 血型 string 比如:A、A型、Rh阴性
star_sign 星座 string 比如:白羊、白羊座
languages 语言能力 string 英语、日语等,多个语言间用逗号分隔
english_level 英语水平 string 比如:大学英语6级、专业英语8级
computer_level 计算机水平 string 计算机水平
blog 博客/主页地址 string 博客/主页地址
apply_job 应聘职位 string 比如:java工程师、HR Manager
apply_cpy 应聘公司 string 比如:阿里巴巴、腾讯科技有限公司
work_year 工作年限(自填或从工作经历推断) string 4种取值:“8”、“3.5”、“10~15”、“应届生”
work_year_norm 工作年限(对work_year的规范化) string 4种取值对应的规范化:“8”、“3.5”、“10”、“0”
work_year_inf 工作年限(从工作经历里推断) string 2种取值:“8”、“3.5” (注:实习或兼职经历不计入工作年限)
work_start_time 参加工作时间(自填或从工作经历推断) string 比如:2019.10.01、2019.10
work_start_time_inf 参加工作时间(从工作经历推断) string 比如:2019.10.01、2019.10
work_position 当前职位 string 比如:java开发、产品总监
work_pos_type_p 当前职能类型 string 比如:软件工程师、项目经理
work_company 当前单位 string 单位名称
work_industry 所处行业 string 行业名称
work_status 在职状态 string 用户填写的内容
work_salary 当前薪资 string 取值类型:
“135000元/年”
“13500元/月”
“80000~120000元/年”
“8000~12000元/月”
work_salary_min 当前月薪(下限) string 比如:“8000”
work_salary_max 当前月薪(上限) string 比如:“12000”
work_location 工作地点 string 工作地点
work_location_norm 工作地点(规范化) string 同city_norm
work_job_nature 工作性质 string 全职、兼职、实习
has_oversea_edu 有否海外留学经历 string 0:否,1:是;默认为无
has_oversea_exp 有否海外工作经历 string 0:否,1:是;默认为无
grad_time 毕业时间 string 2019.10.01、2019.10
college 毕业学校 string 学校名称
college_type 毕业学校类型 string 取值0~7:
0:普通院校
1:985
2:211
3:港澳台院校
4:海外院校
5:中学
6:职业教育
7:培训机构
college_rank 毕业学校排名 string 取值1~1000
college_dept 毕业院系 string 院系名称
major 所学专业 string 专业名称
degree 学历 string 用户填写的值,比如:小学、初中、高中、中专、大专、本科、研究生、硕士、博士、博士后、mba等
recruit 是否统招 string 统招、自考、在职、成教、函授等

3.1.2 基本信息—联系方式

联系方式作为result结构体下的一级字段存在。包含的字段如下:

字段 含义 类型 取值
email 邮箱 string 联系邮箱
phone 电话号码 string 手机/电话号码
virtual_phone 虚拟号码 string 虚拟电话号码,当前支持智联、51job
virtual_phone_time 虚拟号码失效时间 string 虚拟电话号码失效时间,当前支持智联、51job
qq QQ号 string QQ号
weixin 微信号 string 微信号
postal_code 邮编 string 邮编
city 所在城市 string 城市名,比如“重庆”、“广东”、“华容县”
city_norm 所在城市(规范化) string 规范化的城市名,到“区县”一级:
中国-广东省
中国-湖南省-岳阳市
中国-湖南省-岳阳市-华容县
中国-吉林省-长春市-朝阳区
living_address 当前所在地 string 用户填写的地址,比如“上海市虹口区广粤路xx弄x号xxx室”
living_address_norm 当前所在地(规范化) string 规范化到“区县”一级,比如“中国-上海市-虹口区”

3.1.3 基本信息—期望工作

期望工作作为result结构体下的一级字段存在。包含的字段如下:

字段 含义 类型 取值
expect_job 期望工作 string 职位名称
expect_cpy 期望工作单位 string 单位名称
expect_salary 期望薪资 string 取值类型:
“135000元/年”
“13500元/月”
“80000~120000元/年”
“8000~12000元/月”
“面议”
expect_salary_min 期望薪资(下限) string 同work_salary_min
expect_salary_max 期望薪资(上限) string 同work_salary_max
expect_industry 期望行业 string 行业名称
expect_time 到岗时间 string 用户填写的内容
expect_jnature 期望工作性质 string 用户填写的内容
expect_jstatus 当前离职/在职状态 string 用户填写的内容
expect_jlocation 期望工作地址 string 用户填写的内容
expect_jlocation_norm 期望工作地址(规范化) string 同city_norm,多个地址以逗号分隔。

3.1.4 基本信息—简历信息

简历信息作为result结构体下的一级字段存在。包含的字段如下:

字段 含义 类型 取值
resume_type 简历类型 string 取值如下:
0:中文(简体)   10:中文(繁体)
1:英文
2:中英(前中后英)
3:英中(前英后中)
4:空
resume_source 简历来源 string 智联、智联卓聘、前程无忧、51精英、猎聘、boss直聘、拉勾
resume_id 简历id string 智联/51job等网站里的简历id
resume_name 简历文件名 string 输入的简历文件名
resume_parse_time 简历解析时间 string YYYY-MM-DD HH-MM-SS
resume_update_time 简历更新时间 string 更新时间
resume_integrity 简历完整度 string 取值0~100

3.1.5 基本信息—头像信息

头像信息作为result结构体下的一级字段存在。包含的字段如下(注:两个字段最多只有1个有结果):

字段 含义 类型 取值
avatar_url 个人头像图片url string 以url形式存在的个人头像,比如有些html简历,头像就是一个url链接。
avatar_data 个人头像图片数据 string 以图片形式嵌入在简历中的个人头像,解析后的结果为:”data:image/#ext;base64, #data”,
其中#ext为图片格式,#data为经base64编码的实际图片数据。
注:如果要转成图片文件,则用Base64对#data进行decode,然后存成#ext格式的图片。

3.1.6 基本信息—文本内容

文本内容作为result结构体下的一级字段存在。包含的字段如下:

字段 含义 类型 取值
cont_basic_info 基本信息文本内容 string 文本内容
cont_expect_job 期望工作文本内容 string 文本内容
cont_education 教育经历文本内容 string 文本内容
cont_job_exp 工作经历文本内容 string 文本内容
cont_proj_exp 项目经历文本内容 string 文本内容
cont_internship 实习经历文本内容 string 文本内容
cont_social_exp 社会实践文本内容 string 文本内容
cont_campus_exp 在校活动文本内容 string 文本内容
cont_job_skill 个人技能文本内容 string 文本内容
cont_my_desc 自我评价文本内容 string 文本内容
cont_hobby 兴趣爱好文本内容 string 文本内容
cont_language 语言技能文本内容 string 文本内容
cont_certificate 所获证书文本内容 string 文本内容
cont_award 所获奖励文本内容 string 文本内容
cont_training 培训经历文本内容 string 文本内容
cont_course 所学课程文本内容 string 文本内容
cont_research 科研实践文本内容 string 文本内容
cont_my_project 个人作品文本内容 string 文本内容
cont_cover_letter 求职信文本内容 string 文本内容
cont_extra_info 附加信息文本内容 string 文本内容
raw_text 原始简历文本内容 string 文本内容

3.2 教育经历

教育经历存放于result结构体下的一级字段education_objs中,每一段教育经历包含的字段如下:

字段 含义 类型 取值
start_date 开始时间 string 日期,比如“2019.09.01”、“2019.09”、“2019”
end_date 结束时间 string 日期,比如“2019.09.01”、“2019.09”、“2019”、“至今”
edu_college 学校 string 学校名称
edu_college_type 学校类型 string 参考前面college_type字段
edu_college_rank 学校排名 string 取值1~1000
edu_college_dept 院系 string 院系名称
edu_major 专业 string 专业名称
edu_recruit 是否统招 string 参考前面recruit字段
edu_gpa gpa成绩 string 用户填写的内容
edu_degree 学历 string 用户填写的值,比如:小学、初中、高中、中专、大专、本科、研究生、硕士、博士、博士后、mba等
edu_degree_norm 学历(规范化) string 规范化的值:小学、初中、高中、中专、大专、本科、硕士研究生、博士研究生、博士后、mba
edu_content 教育描述 string 用户填写的内容

3.3 工作经历及实习经历

工作经历及实习经历存放于result结构体下的一级字段job_exp_objs中,其中实习经历通过job_nature="实习"进行标识。
每一段工作经历包含的字段如下:

字段 含义 类型 取值
start_date 开始时间 string 日期,比如“2019.09.01”、“2019.09”、“2019”
end_date 结束时间 string 日期,比如“2019.09.01”、“2019.09”、“2019”、“至今”
job_cpy 公司 string 公司名称
job_cpy_nature 公司性质 string 上市、民营、国企、央企、外企、外资、美资、港资等公司或企业
job_cpy_size 公司规模 string 用户填写的内容
job_cpy_desc 公司描述 string 用户填写的内容
job_industry 行业 string 行业名称
job_position 职位 string 职位名称
job_pos_type 职能类型(用户填写) string 简历中用户填写的职能类型
job_pos_type_p 职能类型(模型预测) string 算法模型预测的职能类型
job_dept 所在部门 string 部门名称
job_nature 工作性质 string 全职、兼职、实习
job_salary 工作薪资 string 用户填写的内容
job_staff 下属人数 string 用户填写的内容
job_report_to 汇报对象 string 用户填写的内容
job_location 工作地点 string 用户填写的内容
job_why_leave 离职原因 string 用户填写的内容
job_duration 持续时间 string 比如“1年3个月”、“3年”、“6个月”
job_capacity 工作能力 string 用户填写的内容
job_content 工作内容 string 用户填写的内容

3.4 社会及学校实践经历

社会及学校实践经历存放于result结构体下的一级字段social_exp_objs中(若要解析实践经历,需要在请求接口中增加参数need_social_exp=1)。
每一段实践经历包含的字段和工作经历的字段信息相同,具体字段如下:

字段 含义 类型 取值
start_date 开始时间 string 日期,比如“2019.09.01”、“2019.09”、“2019”
end_date 结束时间 string 日期,比如“2019.09.01”、“2019.09”、“2019”、“至今”
job_cpy 单位 string 单位名称或者活动组织名称,可以是某一个实体名称,也可以是某一项活动名称
job_cpy_nature 公司性质 string 上市、民营、国企、央企、外企、外资、美资、港资等公司或企业
job_cpy_size 公司规模 string 用户填写的内容
job_cpy_desc 公司描述 string 用户填写的内容
job_industry 行业 string 行业名称
job_position 职位 string 职位名称
job_dept 所在部门 string 部门名称
job_nature 工作性质 string 全职、兼职、实习
job_salary 工作薪资 string 用户填写的内容
job_staff 下属人数 string 用户填写的内容
job_report_to 汇报对象 string 用户填写的内容
job_location 工作地点 string 用户填写的内容
job_why_leave 离职原因 string 用户填写的内容
job_duration 持续时间 string 比如“1年3个月”、“3年”、“6个月”
job_capacity 工作能力 string 用户填写的内容
job_content 工作内容 string 用户填写的内容

3.5 项目经历

项目经历存放于result结构体下的一级字段proj_exp_objs中,每一段项目经历包含的字段如下:

字段 含义 类型 取值
start_date 开始时间 string 日期,比如“2019.09.01”、“2019.09”、“2019”
end_date 结束时间 string 日期,比如“2019.09.01”、“2019.09”、“2019”、“至今”
proj_name 项目名称 string 项目名称
proj_cpy 所在公司 string 公司名称
proj_position 担任职位 string 职位名称
proj_content 项目内容 string 项目内容
proj_resp 项目职责 string 项目职责

3.6 培训经历

培训经历存放于result结构体下的一级字段training_objs中,每一段培训经历包含的字段如下:

字段 含义 类型 取值
start_date 开始时间 string 日期,比如“2019.09.01”、“2019.09”、“2019”
end_date 结束时间 string 日期,比如“2019.09.01”、“2019.09”、“2019”、“至今”
train_org 培训机构 string 机构名称
train_loc 培训地点 string 地点名称
train_cert 所获证书 string 证书名称
train_cont 培训内容 string 内容描述

3.7 技能列表

技能列表存放于result结构体下的一级字段skills_objs中,每一个技能包含的字段如下:

字段 含义 类型 取值
skills_name 技能名称 string 技能名词,比如“java开发”、“市场调研”等
skills_level 熟练程度 string 熟练程度
skills_time 技能使用时间 string 时长

3.8 语言技能

语言技能存放于result结构体下的一级字段lang_objs中,每一个语言技能包含的字段如下:

字段 含义 类型 取值
language_name 语言名称 string 语言名称,比如“英语”、“俄语”等
language_level 熟练程度 string 熟练程度
language_read_write 读写能力 string 比如“熟练”等
language_listen_speak 听说能力 string 比如“熟练”等

3.9 语言证书列表

语言证书列表存放于result结构体下的一级字段cert_objs中,每一个语言证书包含的字段如下:

字段 含义 类型 取值
langcert_lang 语言名称 string 语言名称,比如“英语”、“俄语”等
langcert_name 证书名称 string 证书名称
langcert_score 证书成绩 string 成绩,比如625,不同证书的成绩范围不同

3.10 所有证书及奖项

所有证书及奖项(包括语言证书、职业证书、奖项名称等)存放于result结构体下的一级字段all_cert_objs中,每一个证书包含的字段如下:

字段 含义 类型 取值
cert_name 证书名称 string 证书名称,比如“证券从业资格证书”、“计算机二级”等
cert_type 类型名称 string 类型名称,取值:
1)award:代表奖项;
2)certificate:代表证书;

简历解析调用示例

ResumeSDK简历解析基于http+json格式的接口方式提供服务,可以同时支持各种不同开发语言的客户端调用。


使用说明

使用前需要先获取接口账号信息,ResumeSDK提供以下几种渠道的接口:

  1. 官网SaaS版接口:需联系官网客服获取测试接口账号,使用时填入uid和pwd信息;
  2. 官网独立部署版接口:需要先部署好服务;
  3. 阿里云接口:通过阿里云接口地址获取AppCode账号信息;
  4. 腾讯云接口:通过腾讯云接口地址获取账号信息;

1、官网SaaS接口示例


Python

官网接口Python代码:需要安装pip install requests。此代码同时支持python2及python3。


#coding: utf-8

import sys
import base64
import requests
import json

def test_parser(url, fname, uid, pwd):
    """
    请求简历解析接口,请求字段:
    - uid:必填,用户id;
    - pwd:必填,用户密码;
    - file_name: 必填,简历文件名(请确保后缀正确);
    - file_cont: 必填,经based64编码的简历文件内容;
    - need_avatar: 可选,是否需要解析头像,0为不需要,1为需要,默认为0;
    - 其他可选字段可参考官网:https://www.resumesdk.com/docs/rs-parser.html#reqType
    """

    # 读取文件内容,构造请求
    cont = open(fname, 'rb').read()
    base_cont = base64.b64encode(cont)
    base_cont = base_cont.decode('utf-8') if sys.version.startswith('3') else base_cont     #兼容python2与python3
    
    headers = {'uid': str(uid), 'pwd': pwd}

    data = {'file_name': fname,
            'file_cont': base_cont,
            'need_avatar': 0,
            }
    
    # 发送请求
    res = requests.post(url, data=json.dumps(data), headers=headers)
    
    # 解析结果
    http_code = res.status_code
    if http_code != 200:
        print("http status code:", res.status_code)
    else:
        res_js = json.loads(res.text)
        print('result:\n%s\n'%(json.dumps(res_js, indent=2, ensure_ascii=False)))
    
if __name__ == '__main__' :
    url = 'http://www.resumesdk.com/api/parse'    # 接口地址,也可以用https
    fname = u'D:/resumeSDK/resume.docx'  # 替换为你的文件名
    uid = 123456   # 替换为你的用户名(int格式)
    pwd = '123abc'  # 替换为你的密码(str格式)
    res_js = test_parser(url, fname, uid, pwd)
            

Java

官网接口Java代码:需要安装apache-http, json, commons-io


import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.commons.codec.binary.Base64;
import org.apache.http.Consts;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;

public class TestParseApi {
  /**
   * 请求接口格式:(更详细可参考官网:https://www.resumesdk.com/docs/rs-parser.html#reqType)
   * - uid: 必填,用户id;
   * - pwd: 必填,用户密码;
   * - file_name: 必填,简历文件名(请确保后缀正确);
   * - file_cont: 必填,经based64编码的简历文件内容;
   * - need_avatar: 可选,是否需要解析头像,0为不需要,1为需要,默认为0;
   * - 其他可选字段可参考官网:https://www.resumesdk.com/docs/rs-parser.html#reqType
   */
    public static void testResumeParser(String url, String fname, int uid, String pwd) throws Exception {
        HttpPost httpPost = new HttpPost(url);

      // 设置头字段
        httpPost.setHeader("uid", String.valueOf(uid));
        httpPost.setHeader("pwd", pwd);
        httpPost.addHeader("content-type", "application/json");
        
        // 读取简历内容
      byte[] bytes = FileUtils.readFileToByteArray(new File(fname));
      String data = new String(Base64.encodeBase64(bytes), Consts.UTF_8);
      
        // 设置请求接口信息
        JSONObject json = new JSONObject();
        json.put("file_name", fname); // 文件名
        json.put("file_cont", data);  // 经base64编码过的文件内容
        json.put("need_avatar", 0); 
        StringEntity params = new StringEntity(json.toString(), Consts.UTF_8);
        httpPost.setEntity(params);
        
        // 发送请求
        HttpClient httpclient = new DefaultHttpClient(); 
        HttpResponse response = httpclient.execute(httpPost);
        
        // 处理返回结果
        int httpCode = response.getStatusLine().getStatusCode();
        System.out.println("http status code:" + httpCode);

        String resCont = EntityUtils.toString(response.getEntity(), Consts.UTF_8);
        JSONObject res = new JSONObject(resCont); 
        JSONObject status = res.getJSONObject("status");
        if(status.getInt("code") != 200) {
            System.out.println("request failed: code=<" + status.getInt("code") + ">, message=<" + status.getString("message") + ">");
        }
        else {
            JSONObject result = res.getJSONObject("result");
            System.out.println("result:\n" + result.toString(4));
            System.out.println("request succeeded");
        }
    }
    
    public static void main(String[] args) throws Exception {
        String url = "http://www.resumesdk.com/api/parse";    // 接口地址,也可以用https
        String fname = "D:/resumeSDK/resume.docx";  //替换为你的文件名
        int uid = 123456;   //替换为你的用户名(int格式)
        String pwd = "123abc";  //替换为你的密码(String格式)

        testResumeParser(url, fname, uid, pwd);
    }
}
            

JavaScript

官网接口JavaScript代码:此代码需要安装npm install request。


var request = require('request');
var fs = require('fs');

var url = 'http://www.resumesdk.com/api/parse'; // 接口地址,也可以用https
var fname = 'D:/resumeSDK/resume.docx';        // 替换为你的文件名
var uid = 123456;       // 替换为你的用户名(int格式)
var pwd = '123abc';     // 替换为你的密码(str格式)

var options = {
    url: url,
    headers: {
        'uid': uid,
        'pwd': pwd,
    },
    json: {
        'file_cont': Buffer(fs.readFileSync(fname)).toString('base64'),
        'file_name': fname,
        'need_avatar': 0
    }
};

var result = request.post(options, function(err, resp, body) {
    console.log('http status code: ', resp.statusCode);
    if (err) {
        console.log(err);
        process.exit(1);
    } else {
        console.log(body);
        process.exit(0);
    }
});
            

PHP

官网接口PHP代码:基于cURL进行post请求的PHP代码。


<?php
    /*
      请求接口格式:(更详细可参考官网:https://www.resumesdk.com/docs/rs-parser.html#reqType)
        - uid:必填,用户id;
        - pwd:必填,用户密码;
        - file_name: 必填,简历文件名(请确保后缀正确);
        - file_cont: 必填,经based64编码的简历文件内容;
        - need_avatar: 可选,是否需要解析头像,0为不需要,1为需要,默认为0;
        - 其他可选字段可参考官网:https://www.resumesdk.com/docs/rs-parser.html#reqType
    */
    $url ="http://www.resumesdk.com/api/parse";     // 接口地址,也可以用https

    $file_name = 'D:/resumeSDK/resume.docx';       // 替换为你的本地文件名
    $file_cont = base64_encode(file_get_contents($file_name));
    $data = array(
        'file_cont' => $file_cont,
        'file_name'=> $file_name,
        'need_avatar' => 0
    );
    $data_string = json_encode($data);

    $headers = array(
        'Content-Type: application/json',
        'uid: 123456',      //替换为您的uid
        'pwd: 123abc'       //替换为您的pwd   
    );

    $ch = curl_init();
    curl_setopt($ch , CURLOPT_URL , $url);
    curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch , CURLOPT_POST, 1);
    curl_setopt($ch , CURLOPT_POSTFIELDS, $data_string);
    curl_setopt($ch , CURLOPT_HTTPHEADER, $headers);
    $output = curl_exec($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    echo 'HTTP status code: ' . $httpcode . "\n";
    print_r($output);
?>
            

Golang

官网接口Go代码。


package main

import (
    "bytes"
    "fmt"
    "log"
    "net/http"
    "os"
    "encoding/base64"
    "encoding/json"
    "bufio"
    "io/ioutil"
)

type Input struct {
    File_name string `json:"file_name"`
    File_cont string `json:"file_cont"`
    Need_avatar int `json:"need_avatar"`
}

// Creates http request
func createRequest(url string, uid int, pwd string, fname string) (*http.Request, error) {
    file, err := os.Open(fname)
    if err != nil {
        return nil, err
    }
    defer file.Close()

    // Read entire file into byte slice.
    reader := bufio.NewReader(file)
    content, _ := ioutil.ReadAll(reader)

    // Create Request
    file_cont := base64.StdEncoding.EncodeToString(content)
    input := Input{File_name: fname, File_cont: file_cont, Need_avatar: 0}
    jsonValue, _ := json.Marshal(input)
    req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonValue))

    // Set headers
    req.Header.Set("Content-Type", "application/json")
    uid_str := fmt.Sprintf("%d", uid)
    req.Header.Set("uid", uid_str)
    req.Header.Set("pwd", pwd)
    return req, err
}

func testParser(url string, uid int, pwd string, fname string) {
    request, err := createRequest(url, uid, pwd, fname)
    if err != nil {
        log.Fatal(err)
    }

    client := &http.Client{}
    resp, err := client.Do(request)
    fmt.Println("http status code: ", resp.StatusCode)
    if err != nil {
        log.Fatal(err)
    } else {
        body := &bytes.Buffer{}
        _, err := body.ReadFrom(resp.Body)
        if err != nil {
            log.Fatal(err)
        }
        resp.Body.Close()
        fmt.Println(body)
    }
}

func main() {
    url := "http://www.resumesdk.com/api/parse"      // 接口地址,也可以用https
    uid := 123456    // 替换为你的用户名(int格式)
    pwd  := "123abc" // 替换为你的密码(str格式)
    fname := "D:/resumeSDK/resume.docx"  //替换为您的简历
    testParser(url, uid, pwd, fname) 
}

            

C#

官网接口C#代码。


using System;
using System.Net;
using System.IO;
using System.Collections.Generic;
using System.Web.Script.Serialization;

public class StatusObj {
  public string message {get;set;}
  public int code {get;set;}
}

public class AccountObj {
  public int uid {get;set;}
  public int usage_limit {get;set;}
  public int usage_remaining {get;set;}
}

public class EducationObj {
  public string start_date {get;set;}
  public string end_date {get;set;}
  public string edu_college {get;set;}
  public string edu_college_dept {get;set;}
  public string edu_major {get;set;}
  public string edu_degree {get;set;}
  public string edu_degree_norm {get;set;}
}

public class JobExpObj {
  public string start_date {get;set;}
  public string end_date {get;set;}
  public string job_cpy {get;set;}
  public string job_cpy_nature {get;set;}
  public string job_cpy_size {get;set;}
  public string job_industry {get;set;}
  public string job_position {get;set;}
  public string job_cpy_dept {get;set;}
  public string job_nature {get;set;}
  public string job_salary {get;set;}
  public string job_staff {get;set;}
  public string job_report_to {get;set;}
  public string job_location {get;set;}
  public string job_why_leave {get;set;}
  public string job_duaraton {get;set;}
  public string job_content {get;set;}
}

public class ProjExpObj {
  public string start_date {get;set;}
  public string end_date {get;set;}
  public string proj_name {get;set;}
  public string proj_position {get;set;}
  public string proj_content {get;set;}
  public string proj_resp {get;set;}
}

public class ResultObj {
  public string name {get;set;}
  public string email {get;set;}
  public string phone {get;set;}
  public string gender {get;set;}
  public string age {get;set;}
  public string city {get;set;}
  public string height {get;set;}
  public string weight {get;set;}
  public string marital_status {get;set;}
  public string birthday {get;set;}
  public string living_address {get;set;}
  public string hukou_address {get;set;}
  public string hometown_address {get;set;}
  public string qq {get;set;}
  public string race {get;set;}
  public string nationality {get;set;}
  public string postal_code {get;set;}
  public string polit_status {get;set;}
  public string english {get;set;}
  public string work_year {get;set;}
  public string work_start_time {get;set;}
  public string work_position {get;set;}
  public string work_company {get;set;}
  public string grad_time {get;set;}
  public string college {get;set;}
  public string college_dept {get;set;}
  public string major {get;set;}
  public string degree {get;set;}
  public string expect_job {get;set;}
  public string expect_cpy {get;set;}
  public string expect_salary {get;set;}
  public string expect_industry {get;set;}
  public string expect_time {get;set;}
  public string expect_jnature {get;set;}
  public string expect_jlocation {get;set;}

  public List education_objs {get;set;}
  public List job_exp_objs {get;set;}
  public List proj_exp_objs {get;set;}

  public string social_exp {get;set;}
  public string job_skill {get;set;}
  public string my_desc {get;set;}
  //public string raw_text {get;set;}

  // 更多字段及定义请参考《接口文档》
  // ...
}

public class ParseResObj {
  public StatusObj status {get;set;}
  public AccountObj account {get;set;}
  public ResultObj result {get;set;}
}

class TestParserApi {
  static public string Base64Encode(string s) {
    byte[] bytes = System.Text.Encoding.UTF8.GetBytes(s);
    string res = Convert.ToBase64String(bytes);

    return res;
  }

  static public void PrintBasicInfo(ResultObj res) {
    /**
      打印基本信息字段
    **/
    Console.WriteLine("{");
    foreach(var prop in res.GetType().GetProperties()) {
      if(!prop.Name.EndsWith("_objs")) {
        if(prop.GetValue(res, null) != null) {
          Console.WriteLine("    {0}: {1}", prop.Name, prop.GetValue(res, null));
        } 
      }
    }
    Console.WriteLine("}");
  }

  /*
    请求接口格式:
      - uid:必填,用户id;
      - pwd:必填,用户密码;
      - file_name: 必填,简历文件名(请确保后缀正确);
      - file_cont: 必填,经based64编码的简历文件内容;
      - need_avatar: 可选,是否需要解析头像,0为不需要,1为需要,默认为0;
      - 其他可选字段可参考官网:https://www.resumesdk.com/docs/rs-parser.html#reqType
  */
  static public void TestParser(string url, string fname, int uid, string pwd) {
    string html = string.Empty;
    
    // 构造请求头
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";
    request.ContentType = "application/json";
    request.Headers.Add("uid", uid.ToString());
    request.Headers.Add("pwd", pwd);

    // 读取文件内容,经过base64编码后发送
    Byte[] bytes = File.ReadAllBytes(fname);
    String base_cont = Convert.ToBase64String(bytes);
    
    using (var streamWriter = new StreamWriter(request.GetRequestStream())){
        string json = new JavaScriptSerializer().Serialize(new
                    {
                        file_cont = base_cont,  // 经base64编码的文件内容
                        file_name = fname,  // 文件名称
                        need_avatar = 0,
                    });

        streamWriter.Write(json);
    }

    // 获取请求结果:json格式
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    using (var streamReader = new StreamReader(response.GetResponseStream())){
      html = streamReader.ReadToEnd();
      //Console.WriteLine(html);
    }

    // 解析并打印json结果(此处用JavaScriptSerializer解析,也可用Newtonsoft.Json等)
    var jss = new JavaScriptSerializer();
    ParseResObj res = jss.Deserialize(html);
    Console.WriteLine("http status code: {0}", res.status.code);
    PrintBasicInfo(res.result);
    if(!string.IsNullOrEmpty(res.result.name)) {
      Console.WriteLine("name is: " + res.result.name);
    }
    Console.WriteLine("usage_remaining is: " + res.account.usage_remaining);
    Console.WriteLine("parse resume <{0}> succeeded: code=<{1}>, message=<{2}>", fname, res.status.code, res.status.message);
  }

    static public void Main(){
      string url = "http://www.resumesdk.com/api/parse";  // 接口地址,也可以用https
      string fname = "./resume.docx"; // 替换为你的简历文件
      int uid = 123456;      // 替换为你的uid
      string pwd = "123abc";   // 替换为你的pwd
      TestParser(url, fname, uid, pwd);
    }
}

            


2、官网独立部署接口示例


独立部署版不需进行用户验证,其接口官网SaaS版接口差不多。具体使用说明如下:

  1. 服务部署好之后获得服务的ip和port信息;
  2. 参考前面官网SaaS版接口对应语言的代码进行修改:
    • 请求url:改为http://ip:port/api/ResumeParser(替换为实际的ip和port),比如http://localhost:2015/api/ResumeParser;
    • 请求接口:
      • headers字段:去掉headers中的uid和pwd字段;
      • ocr_type字段:根据配置的OCR服务进行选择
        • ocr_type=0:百度OCR;
        • ocr_type=1:腾讯OCR;
        • ocr_type=2:阿里读光OCR;
        • ocr_type=5:自定义OCR;
    • 返回接口:返回接口中无account字段信息,其他字段均一致;

3、阿里云接口示例


阿里云接口AppCode验证方式和官网接口差不多,使用Authorization替换headers中的uid和pwd即可。具体说明如下:

  1. 通过阿里云接口地址购买账号;
  2. 进入阿里云控制台 / 云市场 / 已购买的服务,找到对应的AppCode信息;
  3. 参考前面官网SaaS版接口对应语言的代码进行修改:
    • 请求url:http://resumesdk.market.alicloudapi.com/ResumeParse
    • 请求接口:将headers中的uid和pwd字段换成Authorization字段:key="Authorization",value="APPCODE " + 你的AppCode;
    • 返回接口:返回接口中无account字段信息,其他字段均一致;

4、腾讯云接口示例


Java

腾讯云接口Java代码。


import java.io.File;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;
import org.apache.http.Consts;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;

public class TestParseTx {
    public static String calcAuthorization(String source, String secretId, String secretKey, String datetime)
            throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException {
        String signStr = "x-date: " + datetime + "\n" + "x-source: " + source;
        Mac mac = Mac.getInstance("HmacSHA1");
        Key sKey = new SecretKeySpec(secretKey.getBytes("UTF-8"), mac.getAlgorithm());
        mac.init(sKey);
        byte[] hash = mac.doFinal(signStr.getBytes("UTF-8"));
        String sig = new String(Base64.encodeBase64(hash), Consts.UTF_8);

        String auth = "hmac id=\"" + secretId + "\", algorithm=\"hmac-sha1\", headers=\"x-date x-source\", signature=\"" + sig + "\"";
        return auth;
    }

    public static void testResumeParser(String url, String fileName, String secretId, String secretKey) throws Exception {
        // 读取简历内容
        byte[] bytes = org.apache.commons.io.FileUtils.readFileToByteArray(new File(fileName));
        String data = new String(Base64.encodeBase64(bytes), Consts.UTF_8);
        System.out.println("data len: " + data.length());
        
        // 设置请求信息
        JSONObject json = new JSONObject();
        json.put("file_name", fileName);    // 文件名
        json.put("file_cont", data);        // 经base64编码过的文件内容
        json.put("need_avatar", 0);         // 设置need_avatar
        StringEntity params = new StringEntity(json.toString(), Consts.UTF_8);
        System.out.println("data len: " + params.getContentLength());
        
        Calendar cd = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
        sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
        String datetime = sdf.format(cd.getTime());
        
        String source = "market";
        String auth = calcAuthorization(source, secretId, secretKey, datetime);
        
        // 发送请求并处理json结果
        try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
            HttpPost httpPost = new HttpPost(url);
            
            // 设置头字段
            httpPost.addHeader("X-Source", "market");
            httpPost.addHeader("X-Date", datetime);
            httpPost.addHeader("Authorization", auth);
            httpPost.addHeader("content-type", "application/json");
            httpPost.setEntity(params);
            
            try (CloseableHttpResponse response = httpclient.execute(httpPost)) {
                int httpCode = response.getStatusLine().getStatusCode();
                System.out.println("http status code: " + httpCode);
                
                // 处理返回结果
                if (httpCode >= 200 && httpCode < 300) {
                    String resCont = EntityUtils.toString(response.getEntity(), Consts.UTF_8);
                    JSONObject res = new JSONObject(resCont); 
                    JSONObject status = res.getJSONObject("status");
                    System.out.println("status:\n" + status.toString(4));
                    JSONObject result = res.getJSONObject("result");
                    System.out.println("result:\n" + result.toString(4));
                }
                else {
                    System.out.println("Unexpected http code: " + httpCode);
                }
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) throws Exception {
        String url = "https://service-9wsy8usn-1302482110.bj.apigw.tencentcs.com/release/ResumeParser";     //腾讯云ResumeSDK简历解析接口服务url
        String secretId = "xxxxx";    //云市场分配的密钥Id
        String secretKey = "xxxxxx";  //云市场分配的密钥Key
        String fileName = "D:/resumeSDK/resume.docx";  //替换为你的文件名
        testResumeParser(url, fileName, secretId, secretKey);
    }
}