跳转至

考生数据管理接口

注: 所有接口只针对旗舰会员提供,非旗舰会员无法调用,所有开放平台接口默认共享10QPS

1、获取考生字段信息

获取考生字段信息:

GET https://api.kyexam.com/api/v1/student/getFields?code=xxx&time=当前时间戳

参数:

code=权限码&time=当前时间戳

参数说明:

  • code 每个账户唯一对应的验证码,string类型,旗舰会员及以上可在系统设置->开放平台设置中获取。

  • time 当前时间戳,例如1638768935。

  • Authorization 放到请求头的Token,详见示例代码。简单来说就是:将当前时间戳和您的code拼接起来,进行MD5加密而得。

如果操作成功,则返回:

{
    "data":[
        {
            "sfid":1,
            "label":"姓名"
        },
        {
            "sfid":2,
            "label":"性别"
        },
        {
            "sfid":4,
            "label":"手机"
        },
        {
            "sfid":10,
            "label":"密码"
        }
    ],
    "status":"ok"
}

如果操作失败,则返回:


接口使用示例:

package main

import (
    "crypto/md5"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "os"
    "strconv"
    "time"
)

const (
    Code = "xxx"
)

func main() {
    host := "https://api.kyexam.com"
    resource := "/api/v1/student/getFields"

    client := &http.Client{}
    fullPath := host + resource

    req, _ := http.NewRequest(http.MethodGet, fullPath, nil)
    time64 := time.Now().UTC().Unix()
    ParseToken := fmt.Sprintf("%x", md5.Sum([]byte(strconv.FormatInt(time64, 10)+Code)))
    req.Header.Set("Authorization", ParseToken)

    q := req.URL.Query()
    q.Add("code", Code)
    q.Add("time", strconv.Itoa(int(time64)))

    req.URL.RawQuery = q.Encode()

    resp, err := client.Do(req)
    if err != nil {
        log.Println(err)
        return
    }

    defer resp.Body.Close()

    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Println(err)
        return
    }

    // fmt.Println(string(b))
    f, _ := os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
    f.Write(b)
}

2、批量插入考生信息

批量插入考生信息:

POST https://api.kyexam.com/api/v1/student/addStudents

参数:

code=权限码&time=当前时间戳

参数说明:

  • code 每个账户唯一对应的验证码,string类型,旗舰会员及以上可在系统设置->开放平台设置中获取。

  • time 当前时间戳,例如1638768935。

  • info 要插入的数据。

  • Authorization 放到请求头的Token,详见示例代码。简单来说就是:将当前时间戳和您的code拼接起来,进行MD5加密而得。

如果操作成功,则返回:

{
    "fail":[
        //如插入失败,返回数据对应的下标位置
    ],
    "status":"ok",
    "success":[//插入成功的数据...
        {
            "sid":170603,//插入后学生的sid
            "index":1 //数据所在传入数据的位置
        },
        {
            "sid":170604,
            "index":2
        }
    ]
}

如果操作失败,则返回:


接口使用示例:

package main

import (
    "crypto/md5"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "net/url"
    "os"
    "strconv"
    "strings"
    "time"
)

const (
    Code = "xxx"
)

func main() {
    host := "https://api.kyexam.com"
    resource := "/api/v1/student/addStudents"

    client := &http.Client{}
    fullPath := host + resource

    info := `
[
    {
        "gid": "2993",
        "fields": [
            {
                "sfid": 4,
                "value": "2993"
            },
            {
                "sfid": 1,
                "value": "stufor2993"
            }
        ]
    },
    {
        "gid": "2994",
        "fields": [
            {
                "sfid": 10,
                "value": "2994"
            },
            {
                "sfid": 1,
                "value": "stufor2994"
            }
        ]
    }
]
    `
    time64 := time.Now().UTC().Unix()

    data := make(url.Values)
    data["code"] = []string{Code}
    data["info"] = []string{info}
    data["time"] = []string{strconv.Itoa(int(time64))}

    req, _ := http.NewRequest(http.MethodPost, fullPath, strings.NewReader(data.Encode()))

    ParseToken := fmt.Sprintf("%x", md5.Sum([]byte(strconv.FormatInt(time64, 10)+Code)))
    req.Header.Set("Authorization", ParseToken)
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

    resp, err := client.Do(req)
    if err != nil {
        log.Println(err)
        return
    }

    defer resp.Body.Close()

    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Println(err)
        return
    }

    fmt.Println(string(b))
    f, _ := os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
    f.Write(b)
}

3、批量修改考生信息

批量插入考生信息:

POST https://api.kyexam.com/api/v1/student/changeStuinfo

参数:

code=权限码&time=当前时间戳

参数说明:

  • code 每个账户唯一对应的验证码,string类型,旗舰会员及以上可在系统设置->开放平台设置中获取。

  • time 当前时间戳,例如1638768935。

  • info 要插入的数据。

  • Authorization 放到请求头的Token,详见示例代码。简单来说就是:将当前时间戳和您的code拼接起来,进行MD5加密而得。

如果操作成功,则返回:

{
    "fail":[
        //如失败,返回数据对应的下标位置
    ],
    "status":"ok",
    "success":[
        "170603",//修改成功的sid
        "170604"
    ]
}

如果操作失败,则返回:


接口使用示例:

package main

import (
    "crypto/md5"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "net/url"
    "os"
    "strconv"
    "strings"
    "time"
)

const (
    Code = "xxx"
)

func main() {
    host := "https://api.kyexam.com"
    resource := "/api/v1/student/changeStuinfo"

    client := &http.Client{}
    fullPath := host + resource

    info := `
[
    {
        "sid":170603,
        "loginValue": "",
        "fields": [
            {
                "sfid": 1,
                "value": "stufor2993change"
            },
            {
                "sfid": 4,
                "value": "18320320xxx"
            }
        ]
    },
    {
        "sid":170604,
        "loginValue": "",
        "fields": [
            {
                "sfid": 1,
                "value": "stufor2994change"
            },
            {
                "sfid": 10,
                "value": "29944"
            }
        ]
    }
]
    `

    time64 := time.Now().UTC().Unix()

    data := make(url.Values)
    data["code"] = []string{Code}
    data["info"] = []string{info}
    data["time"] = []string{strconv.Itoa(int(time64))}

    req, _ := http.NewRequest(http.MethodPost, fullPath, strings.NewReader(data.Encode()))

    ParseToken := fmt.Sprintf("%x", md5.Sum([]byte(strconv.FormatInt(time64, 10)+Code)))
    req.Header.Set("Authorization", ParseToken)

    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

    resp, err := client.Do(req)
    if err != nil {
        log.Println(err)
        return
    }

    defer resp.Body.Close()

    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Println(err)
        return
    }

    fmt.Println(string(b))
    f, _ := os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
    f.Write(b)
}

4、批量删除考生信息

批量删除考生信息:

POST https://api.kyexam.com/api/v1/student/delStu

参数:

code=权限码&time=当前时间戳&sids=学生唯一id(二选一字段)

参数说明:

  • code 每个账户唯一对应的验证码,string类型,旗舰会员及以上可在系统设置->开放平台设置中获取。

  • time 当前时间戳,例如1638768935。

  • sids(二选一) 学生唯一id。格式如下:[170603,170604] 也可参照实例代码

  • loginValues(二选一) 管理员设定的登录字段,例如名字,手机等。格式如下: ["李三","张四"] 也可参照实例代码

  • Authorization 放到请求头的Token,详见示例代码。简单来说就是:将当前时间戳和您的code拼接起来,进行MD5加密而得。

如果操作成功,则返回:

{
    "fail":[
        //如失败,返回数据对应的下标位置
    ],
    "status":"ok",
    "success":[
        "170603",//删除成功的sid
        "170604"
    ]
}

如果操作失败,则返回:


接口使用示例:

package main

import (
    "crypto/md5"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "net/url"
    "os"
    "strconv"
    "strings"
    "time"
)

const (
    Code = "xxx"
)

func main() {
    host := "https://api.kyexam.com"
    resource := "/api/v1/student/delStu"

    client := &http.Client{}
    fullPath := host + resource

    sids := "[170603,170604]"
    // loginValues := "[\"登录字段xx\",\"登录字段xxx\"]"

    time64 := time.Now().UTC().Unix()

    data := make(url.Values)
    data["code"] = []string{Code}
    data["sids"] = []string{sids}
    // data["loginValues"] = []string{loginValues}

    data["time"] = []string{strconv.Itoa(int(time64))}

    req, _ := http.NewRequest(http.MethodPost, fullPath, strings.NewReader(data.Encode()))

    ParseToken := fmt.Sprintf("%x", md5.Sum([]byte(strconv.FormatInt(time64, 10)+Code)))
    req.Header.Set("Authorization", ParseToken)

    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

    resp, err := client.Do(req)
    if err != nil {
        log.Println(err)
        return
    }

    defer resp.Body.Close()

    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Println(err)
        return
    }

    fmt.Println(string(b))
    f, _ := os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
    f.Write(b)
}

5、移动考生到组

移动考生到组:

POST https://api.kyexam.com/api/v1/student/movestugroup

参数:

code=权限码&time=当前时间戳

参数说明:

  • code 每个账户唯一对应的验证码,string类型,旗舰会员及以上可在系统设置->开放平台设置中获取。

  • time 当前时间戳,例如1638768935。

  • mvStuInfo 格式请参照示例代码,在loginValues与sid中任选其一。

  • Authorization 放到请求头的Token,详见示例代码。简单来说就是:将当前时间戳和您的code拼接起来,进行MD5加密而得。

如果操作成功,则返回:

{
    "fail":[
        //如失败,返回数据对应的下标位置
    ],
    "status":"ok",
    "success":[
        "170606",//移动成功的sid
        "170607"
    ]
}

如果操作失败,则返回:


接口使用示例:

package main

import (
    "crypto/md5"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "net/url"
    "os"
    "strconv"
    "strings"
    "time"
)

const (
    Code = "xxx"
)

func main() {
    host := "https://api.kyexam.com"
    resource := "/api/v1/student/movestugroup"

    client := &http.Client{}
    fullPath := host + resource

    mvStuInfo := `
    {
        "gids": [2993],
        "loginValues":[],                
        "sid":[170606,170607],
        "action": "moveto" 
    }
`

    /*
        上面以sid为例,如使用loginValues 格式如下  ["登录字段1","登录字段2"]
        action 可以为 addto moveto delfrom
        addto: 表示添加到组,这个时候一个考生可能存在多个组
        moveto: 表示移动到组,这个时候考生只存在传入的组
        delfrom: 表示考生从指定组移除,需注意移除后至少应还存在一个组中,否则移除失败
    */

    time64 := time.Now().UTC().Unix()

    data := make(url.Values)
    data["code"] = []string{Code}
    data["mvStuInfo"] = []string{mvStuInfo}
    data["time"] = []string{strconv.Itoa(int(time64))}

    req, _ := http.NewRequest(http.MethodPost, fullPath, strings.NewReader(data.Encode()))

    ParseToken := fmt.Sprintf("%x", md5.Sum([]byte(strconv.FormatInt(time64, 10)+Code)))
    req.Header.Set("Authorization", ParseToken)

    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

    resp, err := client.Do(req)
    if err != nil {
        log.Println(err)
        return
    }

    defer resp.Body.Close()

    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Println(err)
        return
    }

    fmt.Println(string(b))
    f, _ := os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
    f.Write(b)
}

6、获取考生信息

获取考生信息:

POST https://api.kyexam.com/api/v1/student/getstudentsinfo

参数:

code=权限码&time=当前时间戳

参数说明:

  • code 每个账户唯一对应的验证码,string类型,旗舰会员及以上可在系统设置->开放平台设置中获取。

  • time 当前时间戳,例如1638768935。

  • loginValues(二选一字段) 管理员设定的登录字段,例如名字,手机等。格式如下: ["李三","张四"] 也可参照实例代码。

  • sids(二选一字段) 学生唯一id。格式如下:[170603,170604] 也可参照实例代码。

  • Authorization 放到请求头的Token,详见示例代码。简单来说就是:将当前时间戳和您的code拼接起来,进行MD5加密而得。

如果操作成功,则返回:

{
    "data":[
        {
            "sid":170605,
            "fields":[
                {
                    "sFid":1,
                    "label":"姓名",
                    "value":"newstufor2993"
                }
            ],
            "group":[
                {
                    "gid":2993,
                    "title":"2993"
                }
            ]
        },
        {
            "sid":170606,
            "fields":[
                {
                    "sFid":1,
                    "label":"姓名",
                    "value":"newstufor2994"
                }
            ],
            "group":[
                {
                    "gid":2993,
                    "title":"2993"
                }
            ]
        }
    ],
    "fail":[
        //如失败,返回对应的sid或loginValues,这种情况可能是因为考生已被删除
    ],
    "status":"ok"
}

如果操作失败,则返回:


接口使用示例:

package main

import (
    "crypto/md5"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "net/url"
    "os"
    "strconv"
    "strings"
    "time"
)

const (
    Code = "xxx"
)

func main() {
    host := "https://api.kyexam.com"
    resource := "/api/v1/student/getstudentsinfo"

    client := &http.Client{}
    fullPath := host + resource

    // sids := "[170603,170604]"
    sids := "[170605,170606]"
    // loginValues := "[\"登录字段xx\",\"登录字段xxx\"]"

    time64 := time.Now().UTC().Unix()

    data := make(url.Values)
    data["code"] = []string{Code}
    data["sids"] = []string{sids}
    // data["loginValues"] = []string{loginValues}

    data["time"] = []string{strconv.Itoa(int(time64))}

    req, _ := http.NewRequest(http.MethodPost, fullPath, strings.NewReader(data.Encode()))

    ParseToken := fmt.Sprintf("%x", md5.Sum([]byte(strconv.FormatInt(time64, 10)+Code)))
    req.Header.Set("Authorization", ParseToken)

    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

    resp, err := client.Do(req)
    if err != nil {
        log.Println(err)
        return
    }

    defer resp.Body.Close()

    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Println(err)
        return
    }

    fmt.Println(string(b))
    f, _ := os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
    f.Write(b)
}

7、获取考生列表

获取考生列表:

POST https://api.kyexam.com/api/v1/student/getstulist

参数:

code=权限码&time=当前时间戳

参数说明:

  • code 每个账户唯一对应的验证码,string类型,旗舰会员及以上可在系统设置->开放平台设置中获取。

  • time 当前时间戳,例如1638768935。

  • start 分页参数。

  • limit 查询个数,最大为100。

  • Authorization 放到请求头的Token,详见示例代码。简单来说就是:将当前时间戳和您的code拼接起来,进行MD5加密而得。

如果操作成功,则返回:

{
    "data":[
        {
            "loginValue":"newstufor2993",
            "fields":[
                {
                    "sFid":1,
                    "label":"姓名",
                    "value":"newstufor2993"
                },
                {
                    "sFid":4,
                    "label":"手机",
                    "value":"2993"
                }
            ]
        },
        {
            "loginValue":"newstufor2994",
            "fields":[
                {
                    "sFid":1,
                    "label":"姓名",
                    "value":"newstufor2994"
                },
                {
                    "sFid":10,
                    "label":"密码",
                    "value":"2994"
                }
            ]
        },
        {
            "loginValue":"newstufor29942",
            "fields":[
                {
                    "sFid":1,
                    "label":"姓名",
                    "value":"newstufor29942"
                },
                {
                    "sFid":10,
                    "label":"密码",
                    "value":"2994"
                }
            ]
        }
    ],
    "status":"ok",
    "total":12
}

如果操作失败,则返回:


接口使用示例:

package main

import (
    "crypto/md5"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "net/url"
    "os"
    "strconv"
    "strings"
    "time"
)

const (
    Code = "xxx"
)

func main() {
    host := "https://api.kyexam.com"
    resource := "/api/v1/student/getstulist"

    client := &http.Client{}
    fullPath := host + resource

    time64 := time.Now().UTC().Unix()

    data := make(url.Values)
    data["code"] = []string{Code}
    data["start"] = []string{"0"}
    data["limit"] = []string{"3"}

    data["time"] = []string{strconv.Itoa(int(time64))}

    req, _ := http.NewRequest(http.MethodPost, fullPath, strings.NewReader(data.Encode()))

    ParseToken := fmt.Sprintf("%x", md5.Sum([]byte(strconv.FormatInt(time64, 10)+Code)))
    req.Header.Set("Authorization", ParseToken)

    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

    resp, err := client.Do(req)
    if err != nil {
        log.Println(err)
        return
    }

    defer resp.Body.Close()

    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Println(err)
        return
    }

    fmt.Println(string(b))
    f, _ := os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
    f.Write(b)
}

8、获取所有考生或者单一考生的考试记录

获取考生列表:

GET https://api.kyexam.com/api/v1/student/queryresults

参数:

code=权限码&time=当前时间戳

参数说明:

  • code 每个账户唯一对应的验证码,string类型,旗舰会员及以上可在系统设置->开放平台设置中获取。

  • time 当前时间戳,例如1638768935。

  • start 分页参数。

  • limit 查询个数,最大为100。

  • loginValues 如需查询单个考生的考试记录,需配合eid使用。

  • eid 如需查询单个考生的考试记录,需配合loginValues使用,详见示例代码。

  • Authorization 放到请求头的Token,详见示例代码。简单来说就是:将当前时间戳和您的code拼接起来,进行MD5加密而得。

如果操作成功,则返回:

{
    "data":[
        {
            "viewResult":"https://api.kyexam.com/transgetresult?tid=xxx\u0026token=xxx", //试卷详情链接,其中 '\u0026' 为 '&' 符号, 需要转码方可正常使用。
            "score":"2",//分数
            "passed":"0",//考试是否及格
            "status":"1",
            "startTime":"1639647217",//考试考试时间
            "endTime":"1639647236",//考试结束时间
            "sid":"170597",
            "loginValue":"n11",//登录字段
            "name":"n11",//考生名字
            "eid":"107264"//试卷id
        },
        {
            "viewResult":"https://api.kyexam.com/transgetresult?tid=xxx\u0026token=xxx",
            "score":"1",
            "passed":"0",
            "status":"1",
            "startTime":"1639647122",
            "endTime":"1639647132",
            "sid":"170597",
            "loginValue":"n11",
            "name":"n11",
            "eid":"107264"
        }
    ],
    "status":"ok",
    "total":1877
}

如果操作失败,则返回:


接口使用示例:

package main

import (
    "crypto/md5"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "os"
    "strconv"
    "time"
)

const (
    Code = "xxx"
)

func main() {
    host := "https://api.kyexam.com"
    resource := "/api/v1/student/queryresults"

    client := &http.Client{}
    fullPath := host + resource

    req, _ := http.NewRequest(http.MethodGet, fullPath, nil)
    time64 := time.Now().UTC().Unix()
    ParseToken := fmt.Sprintf("%x", md5.Sum([]byte(strconv.FormatInt(time64, 10)+Code)))
    req.Header.Set("Authorization", ParseToken)

    q := req.URL.Query()
    q.Add("code", Code)

    q.Add("start", "0")
    q.Add("limit", "2")
    //   ↑↑获取所有考生考试数据↑↑

    // ↓↓获取单一考生参与考试的记录↓↓
    // q.Add("loginValues", "n11")
    // q.Add("eid", "107264")

    q.Add("time", strconv.Itoa(int(time64)))

    req.URL.RawQuery = q.Encode()

    resp, err := client.Do(req)
    if err != nil {
        log.Println(err)
        return
    }

    defer resp.Body.Close()

    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Println(err)
        return
    }

    // fmt.Println(string(b))
    f, _ := os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
    f.Write(b)
}