ResumeSDK简历解析提供对输入的附件简历进行结构化处理的功能,共解析出10大主要功能模块,合计170多个字段信息。ResumeSDK的服务基于http+json格式的接口方式提供服务,可以同时支持各种不同开发语言的客户端调用。
ResumeSDK提供SaaS模式和独立部署两种形式的服务模式:
两种服务方式的接口仅涉及账户信息的地方有差异,简历结构化等其他字段信息均一致。以下以SaaS服务的接口格式做详细介绍。
按照如下方式和内容构造http请求:
字段 | 类型 | 必填 | 描述 |
---|---|---|---|
uid | int | 必填 | 用户id(注:仅SaaS接口需要,独立部署版或者阿里云客户不需此字段) |
pwd | string | 必填 | 用户密码(注:仅SaaS接口需要,独立部署版或者阿里云客户不需此字段) |
字段 | 类型 | 必填 | 描述 |
---|---|---|---|
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。(注:解析头像会增加1倍左右耗时,如不需头像建议不开启) |
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字段,带上正确的文件后缀。
ResumeSDK以json格式返回解析结果,它的内容包括:
字段 | 类型 | 描述 |
---|---|---|
code | int | 状态码,200表示正常,其余表示异常,具体参考错误状态码 |
message | string | 状态信息描述 |
字段 | 类型 | 描述 |
---|---|---|
uid | int | 用户id |
usage_limit | int | 用户的总调用量 |
usage_remaining | int | 用户剩余的调用量,参考扣费规则,当值为0时不能再调用。为保持类型不变,仅保留整数部分 |
返回结构体示例:
{
"status": {
"code": 200,
"message": "OK"
},
"account": {
"uid": 123456,
"usage_limit": 62500,
"usage_remaining": 50000
},
"result": {
...
},
}
当错误状态码等于200时表示解析正常,为其他值时表示解析异常,不同的值代表不同的错误信息。
码值 | 含义 |
---|---|
200 | 正常状态,表示解析成功 |
250 | 账号(uid)或密码(pwd)错误 |
251 | 账号剩余用量为0(需及时充值) |
260 | 请求参数错误 |
261 | 简历内容为空 |
262 | 简历内容过长 |
263 | 不支持的简历文件格式 |
264 | base64解码出错 |
265 | 图片文件过大,或者长宽大小超过限制 |
266 | 输入参数file_name缺少文件后缀名(请带上正确的文件后缀,如果是纯文本则为.txt) |
267 | 输入的json结构体有误(即解码失败) |
240 | 简历解析内部错误 |
241 | 文件解析内部错误 |
280 | 人岗匹配内部错误 |
简历解析结果均放在result字段下,共包含170多个字段信息。
基本信息包含解析结果的基础字段,作为result结构体下的一级字段存在。包含的字段如下:
基本信息包含解析结果的基础字段,作为result结构体下的一级字段存在。包含的字段如下:
字段 | 含义 | 类型 | 取值 |
---|---|---|---|
name | 姓名 | string | 人名,比如“姚明” |
name_en | 英文名 | string | 英文名,比如“James”、“Yao ming”(20241201新增) |
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 | 统招、自考、在职、成教、函授等 |
联系方式作为result结构体下的一级字段存在。包含的字段如下:
字段 | 含义 | 类型 | 取值 |
---|---|---|---|
邮箱 | string | 联系邮箱 | |
phone | 电话号码 | string | 手机/电话号码 |
virtual_phone | 虚拟号码 | string | 虚拟电话号码,当前支持智联、51job |
virtual_phone_time | 虚拟号码失效时间 | string | 虚拟电话号码失效时间,当前支持智联、51job |
QQ号 | string | QQ号 | |
weixin | 微信号 | string | 微信号 |
postal_code | 邮编 | string | 邮编 |
city | 所在城市 | string | 城市名,比如“重庆”、“广东”、“华容县” |
city_norm | 所在城市(规范化) | string | 规范化的城市名,到“区县”一级: 中国-广东省 中国-湖南省-岳阳市 中国-湖南省-岳阳市-华容县 中国-吉林省-长春市-朝阳区 |
living_address | 当前所在地 | string | 用户填写的地址,比如“上海市虹口区广粤路xx弄x号xxx室” |
living_address_norm | 当前所在地(规范化) | string | 规范化到“区县”一级,比如“中国-上海市-虹口区” |
期望工作作为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,多个地址以逗号分隔。 |
简历信息作为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 |
头像信息作为result结构体下的一级字段存在。包含的字段如下(注:两个字段最多只有1个有结果):
字段 | 含义 | 类型 | 取值 |
---|---|---|---|
avatar_url | 个人头像图片url | string | 以url形式存在的个人头像,比如有些html简历,头像就是一个url链接。 |
avatar_data | 个人头像图片数据 | string | 以图片形式嵌入在简历中的个人头像,解析后的结果为:”data:image/#ext;base64, #data”, 其中#ext为图片格式,#data为经base64编码的实际图片数据。 注:如果要转成图片文件,则用Base64对#data进行decode,然后存成#ext格式的图片。 |
文本内容作为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_publications | 论文著作文本内容 | string | 文本内容(20240408新增) |
cont_my_project | 个人作品文本内容 | string | 文本内容 |
cont_cover_letter | 求职信文本内容 | string | 文本内容 |
cont_extra_info | 附加信息文本内容 | string | 文本内容 |
raw_text | 原始简历文本内容 | string | 文本内容 |
教育经历存放于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 | 用户填写的内容 |
工作经历及实习经历存放于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 | 用户填写的内容 |
社会及学校实践经历存放于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 | 用户填写的内容 |
项目经历存放于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 | 项目职责 |
培训经历存放于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_name | 培训名称 | string | 培训名称,比如“JAVA培训”(20241201新增) |
train_cert | 所获证书 | string | 证书名称 |
train_cont | 培训内容 | string | 内容描述 |
技能列表存放于result结构体下的一级字段skills_objs
中,每一个技能包含的字段如下:
字段 | 含义 | 类型 | 取值 |
---|---|---|---|
skills_name | 技能名称 | string | 技能名词,比如“java开发”、“市场调研”等 |
skills_level | 熟练程度 | string | 熟练程度 |
skills_time | 技能使用时间 | string | 时长 |
语言技能存放于result结构体下的一级字段lang_objs
中,每一个语言技能包含的字段如下:
字段 | 含义 | 类型 | 取值 |
---|---|---|---|
language_name | 语言名称 | string | 语言名称,比如“英语”、“俄语”等 |
language_level | 熟练程度 | string | 熟练程度 |
language_read_write | 读写能力 | string | 比如“熟练”等 |
language_listen_speak | 听说能力 | string | 比如“熟练”等 |
语言证书列表存放于result结构体下的一级字段cert_objs
中,每一个语言证书包含的字段如下:
字段 | 含义 | 类型 | 取值 |
---|---|---|---|
langcert_lang | 语言名称 | string | 语言名称,比如“英语”、“俄语”等 |
langcert_name | 证书名称 | string | 证书名称 |
langcert_score | 证书成绩 | string | 成绩,比如625,不同证书的成绩范围不同 |
所有证书及奖项(包括语言证书、职业证书、奖项名称等)存放于result结构体下的一级字段all_cert_objs
中,每一个证书包含的字段如下:
字段 | 含义 | 类型 | 取值 |
---|---|---|---|
cert_name | 证书名称 | string | 证书名称,比如“证券从业资格证书”、“计算机二级”等 |
cert_type | 类型名称 | string | 类型名称,取值: 1)award:代表奖项; 2)certificate:代表证书; |
ResumeSDK简历解析基于http+json格式的接口方式提供服务,可以同时支持各种不同开发语言的客户端调用。
使用前需要先获取接口账号信息,ResumeSDK提供以下几种渠道的接口:
官网接口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:
res_js = {}
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)))
return res_js
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代码:需要安装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代码:此代码需要安装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代码:基于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);
?>
官网接口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#代码。
using System;
using System.Net;
using System.IO;
using System.Web.Script.Serialization;
class TestParserApi {
/*
请求接口格式:
- 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 json_string = 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();
Console.WriteLine("http status code: {0}", response.StatusCode);
using (var streamReader = new StreamReader(response.GetResponseStream())){
json_string = streamReader.ReadToEnd();
}
// Console.WriteLine(json_string);
// 解析并打印json结果(此处用JavaScriptSerializer解析,也可用Newtonsoft.Json等)
var serializer = new JavaScriptSerializer();
dynamic js = serializer.DeserializeObject(json_string);
Console.WriteLine("code:" + js["status"]["code"] + ", message: " + js["status"]["message"]);
Console.WriteLine("name:" + js["result"]["name"]);
}
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);
}
}
独立部署版不需进行用户验证,其接口官网SaaS版接口差不多。具体使用说明如下:
阿里云接口AppCode验证方式和官网接口差不多,使用Authorization替换headers中的uid和pwd即可。具体说明如下:
腾讯云接口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);
}
}