ResumeSDK简历画像提供对输入的附件简历进行提取并进行人才画像的功能。ResumeSDK的服务基于http+json格式的接口方式提供服务,可以同时支持各种不同开发语言的客户端调用。
ResumeSDK提供SaaS模式和独立部署两种形式的服务模式:
两种服务方式的接口仅涉及账户信息的地方有差异,简历结构化等其他字段信息均一致。以下以SaaS服务的接口格式做详细介绍。
ResumeSDK以json格式返回上述信息,其中profiler_result为简历画像独有字段,其他字段和简历解析一致。
返回结构体示例:
{
"status": {
"code": 200,
"message": "OK"
},
"account": {
"uid": 123456,
"usage_limit": 62500,
"usage_remaining": 50000
},
"result": {
...
},
"profiler_result": {
...
},
}
简历画像结果均放在profiler_result字段下。
字段 | 子字段 | 含义 | 类型 | 取值&描述 |
---|---|---|---|---|
job_skills | tag | 技能名称 | String | 工作技能名称,比如java、机器学习等 |
type | 技能类型 | String | 对应的类型,比如后端开发、前端开发等 | |
weight | 技能权重 | int | 百分制 | |
soft_skills | tag | 软素质技能 | String | 软素质技能名称,比如团队合作精神、责任心强等 |
languages | tag | 语言名称 | String | 掌握的语言名称,比如俄语、粤语等 |
certificates | tag | 证书名称 | String | 所获证书名称,比如英语4级、pmp认证等 |
awards | tag | 奖励名称 | String | 所获奖项名称,比如三好学生、围棋比赛冠军等 |
hobbies | tag | 爱好名称 | String | 比如篮球、骑车等 |
样本示例:
"skills": {
"job_skills": [
{
"tag": "需求收集",
"type": "互联网产品经理",
"weight": 69
},
{
"tag": "迭代产品",
"type": "互联网产品经理",
"weight": 68
},
],
"soft_skills": [
{
"tag": "逻辑思维"
},
{
"tag": "沟通协调能力"
},
],
"hobbies": [
{
"tag": "骑车"
}
],
"languages": [
{
"tag": "英语"
}
],
"certificates": [
{
"tag": "PMP项目管理认证"
},
{
"tag": "大学英语4级"
}
],
"awards": [
{
"tag": "三好学生"
}
]
}
字段 | 含义 | 类型 | 取值&描述 |
---|---|---|---|
tag | 标签值 | string | 比如男、30~40岁等 |
type | 标签类型 | string | 取值及含义: - age:年龄; - gender:性别; - experience:工作经验; - current_city: 所在城市; - cv_salary: 当前薪资; - expect_salary: 期望薪资; |
样本示例:
"basic": [
{
"tag": "男",
"type": "gender"
},
{
"tag": "35-40岁",
"type": "age"
},
{
"tag": "10年以上经验",
"type": "experience"
}
{
"tag": "北京市",
"type": "current_city"
},
{
"tag": "10-20K",
"type": "cv_salary"
},
{
"tag": "期望10-20K",
"type": "expect_salary"
}
]
字段 | 含义 | 类型 | 取值&描述 |
---|---|---|---|
tag | 标签值 | string | 比如本科学历、计算机专业等 |
type | 标签类型 | string | 取值及含义: - degree:学历; - major:专业; - graduate:是否毕业; - college: 学校; - college_level: 学校类别; - abroad_edu: 海外留学经历; - abroad_country: 留学地区; |
样本示例:
"education": [
{
"tag": "本科学历",
"type": "degree"
},
{
"tag": "计算机科学与技术专业",
"type": "major"
},
{
"tag": "应届生",
"type": "graduate"
},
{
"tag": "北京化工大学",
"type": "college"
},
{
"tag": "211院校",
"type": "college_level"
},
{
"tag": "海外留学经历",
"type": "abroad_edu"
},
{
"tag": "留学地区:美国",
"type": "abroad_country"
}
]
字段 | 含义 | 类型 | 取值&描述 |
---|---|---|---|
tag | 标签值 | string | 不同类型取值不一样 |
type | 标签类型 | string | 取值及含义: - position:职位名称; - position_type:职位类型; - industry:所处行业; - company_level: 公司类型; |
样本示例:
"job_exp": [
{
"tag": "薪酬福利主管",
"type": "position"
},
{
"tag": "办公室内勤",
"type": "position"
},
{
"tag": "人事/行政-行政/后勤-行政专员/助理",
"type": "position_type"
},
{
"tag": "人事/行政-人力资源-薪资福利经理/主管",
"type": "position_type"
},
{
"tag": "计算机/互联网/通信/电子-网络游戏",
"type": "industry"
}
]
字段 | 含义 | 类型 | 取值&描述 |
---|---|---|---|
c1 | 一级职能 | string | 一级职能名称 |
c2 | 二级职能 | string | 二级职能名称 |
c3 | 三级职能 | string | 三级职能名称 |
weight | 权重 | string | 百分制 |
样本示例:
"predicted_pos_types": [
{
"c1": "人事/行政",
"c2": "行政/后勤",
"c3": "行政专员/助理",
"weight": 24
},
{
"c1": "人事/行政",
"c2": "人力资源",
"c3": "薪资福利经理/主管",
"weight": 11
},
{
"c1": "人事/行政",
"c2": "人力资源",
"c3": "人事主管",
"weight": 8
},
{
"c1": "人事/行政",
"c2": "人力资源",
"c3": "薪资福利专员/助理",
"weight": 7
},
{
"c1": "人事/行政",
"c2": "行政/后勤",
"c3": "后勤",
"weight": 6
}
]
字段 | 含义 | 类型 | 取值&描述 |
---|---|---|---|
c1 | 行业名称 | string | 所属行业名称,比如:计算机/互联网/通信/电子 |
weight | 隶属度 | int | 百分制 |
样本示例:
"predicted_industries_c1": [
{
"c1": "计算机/互联网/通信/电子",
"weight": 70
},
{
"c1": "服务业",
"weight": 20
},
{
"c1": "政府/非营利组织/其他",
"weight": 10
},
{
"c1": "制药/医疗",
"weight": 0
},
{
"c1": "广告/媒体",
"weight": 0
},
{
"c1": "房地产/建筑",
"weight": 0
},
{
"c1": "物流/运输",
"weight": 0
},
{
"c1": "会计/金融/银行/保险",
"weight": 0
},
{
"c1": "专业服务/教育/培训",
"weight": 0
},
{
"c1": "能源/环保/化工",
"weight": 0
},
{
"c1": "贸易/消费/制造/营运",
"weight": 0
}
]
字段 | 含义 | 类型 | 取值&描述 |
---|---|---|---|
c1 | 一级行业 | string | 一级行业名称,比如:计算机/互联网/通信/电子 |
c2 | 二级行业 | string | 二级行业名称,比如:网络游戏 |
weight | 隶属度 | int | 百分制 |
样本示例:
"predicted_industries_c2": [
{
"c1": "服务业",
"c2": "餐饮业",
"weight": 18
},
{
"c1": "计算机/互联网/通信/电子",
"c2": "计算机软件",
"weight": 14
},
{
"c1": "贸易/消费/制造/营运",
"c2": "快速消费品(食品、饮料、化妆品)",
"weight": 7
}
]
字段 | 含义 | 类型 | 取值&描述 |
---|---|---|---|
average_job_time | 平均每段工作的时长 | float | 以月为单位 |
average_job_type_time | 平均每段职能的时长 | float | 以月为单位 |
average_industry_time | 平均每个行业的时长 | float | 以月为单位 |
long_job_time_num | 长时间的工作经历数 | int | 段数 |
short_job_time_num | 短时间的工作经历数 | int | 段数 |
job_stability | 工作稳定性 | string | 稳定、不稳定(如果无值则为空) |
样本示例:
"stability": {
"average_job_time": 28.6,
"average_job_type_time": 71.5,
"average_industry_time": 71.5,
"long_job_time_num": 3,
"short_job_time_num": 1,
"job_stability": "稳定"
}
字段 | 含义 | 类型 | 取值&描述 |
---|---|---|---|
predicted_salary | 预测薪资 | string | 共7档:3K以下、3-5K、5-10K、10-20K、20-30K、30-50K、50K以上 |
样本示例:
"predicted_salary": "5-10K"
能力指数capacity,作为profiler_result结构体下的一级字段存在。包含的字段如下:
字段 | 含义 | 类型 | 取值&描述 |
---|---|---|---|
education | 教育指数 | int | 百分制 |
honor | 荣誉指数 | int | 百分制 |
language | 语言能力指数 | int | 百分制 |
management | 管理能力指数 | int | 百分制 |
job_exp | 职业经历指数 | int | 百分制 |
social_exp | 实践经历指数 | int | 百分制 |
样本示例:
"capacity": {
"education": 90,
"honor": 10,
"language": 30,
"management": 10,
"job_exp": 30,
"social_exp": 10
}
简历亮点分析highlights,Array类型。作为profiler_result结构体下的一级字段存在。包含的字段定义如下:
字段 | 含义 | 类型 | 取值&描述 |
---|---|---|---|
title | 亮点点名称 | string | 比如工作稳定、名企经历等 |
content | 亮点内容 | string | 亮点的详细信息 |
type | 亮点类型 | string | 亮点所属类型,比如job_exp、education等 |
样本示例:
"highlights": [
{
"title": "工作稳定",
"content": "【工作稳定】:平均每段工作经历持续【43】个月,且存在【1】段工作经历2年以上",
"type": "job_exp"
},
{
"title": "",
"content": "在【国内电商运营】职能领域和【美容/保健】行业里有【较丰富】工作经历",
"type": "job_exp"
},
{
"title": "211院校",
"content": "【较不错】的教育背景:学士学历,毕业于【211院校】",
"type": "education"
}
]
简历风险点分析risks,Array类型。作为profiler_result结构体下的一级字段存在。包含的字段定义如下:
字段 | 含义 | 类型 | 取值&描述 |
---|---|---|---|
title | 风险点名称 | string | 比如工作不稳定、空档期等 |
content | 风险点内容 | string | 风险点的详细信息 |
type | 风险点类型 | string | 风险点所属类型,比如job_exp、education等 |
样本示例:
"risks": [
{
"title": "工作不稳定",
"content": "【工作不稳定】:平均每段工作经历仅持续【10】个月,且存在【1】段工作经历1年以下",
"type": "job_exp"
},
{
"title": "空档期",
"content": "【空档期】:候选人在 2014.06~2015.07 期间共存在【13个月】的职业空档期",
"type": "job_exp"
}
]
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-profiler.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_profile' # 接口地址,也可以用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 {
/**
* 请求接口格式:
* - uid: 必填,用户id;
* - pwd: 必填,用户密码;
* - file_name: 必填,简历文件名(请确保后缀正确);
* - file_cont: 必填,经based64编码的简历文件内容;
* - need_avatar: 可选,是否需要解析头像,0为不需要,1为需要,默认为0;
* - 其他可选字段可参考官网:https://www.resumesdk.com/docs/rs-profiler.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("profiler_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_profile"; // 接口地址,也可以用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_profile'; // 接口地址,也可以用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
/*
请求接口格式:
- uid:必填,用户id;
- pwd:必填,用户密码;
- file_name: 必填,简历文件名(请确保后缀正确);
- file_cont: 必填,经based64编码的简历文件内容;
- need_avatar: 可选,是否需要解析头像,0为不需要,1为需要,默认为0;
- 其他可选字段可参考官网:https://www.resumesdk.com/docs/rs-profiler.html#reqType
*/
$url ="http://www.resumesdk.com/api/parse_profile"; // 接口地址,也可以用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_profile" // 接口地址,也可以用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;
*/
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"]);
Console.WriteLine("stability:" + js["profiler_result"]["stability"]["job_stability"]);
}
static public void Main(){
string url = "http://www.resumesdk.com/api/parse_profile"; // 接口地址,也可以用https
string fname = "./resume.docx"; // 替换为你的简历文件
int uid = 123456; // 替换为你的uid
string pwd = "123abc"; // 替换为你的pwd
TestParser(url, fname, uid, pwd);
}
}
独立部署版不需进行用户验证,其接口官网SaaS版接口差不多。具体使用说明如下:
阿里云接口AppCode验证方式和官网接口差不多,使用Authorization替换headers中的uid和pwd即可。具体说明如下: