Skip to content

接入指南

服务台 token

请求中代入服务台token,表示拥有和服务台负责人相同的权限(查看修改服务台实体)。

使用方法,设置在请求Header中:

  • Header Key: X-Lark-Helpdesk-Authorization
  • Header Value: base64(helpdesk_id:helpdesk_token), 通过base64加密将helpdesk_id和helpdesk_token用':'连接而成的字符串。

Golang Exapmle:

go
package main

import (
	b64 "encoding/base64"
	"fmt"
)

func main() {
	helpdeskAuthInfo := "12345:ht-sometoken"

	helpdeskAuthToken := b64.StdEncoding.EncodeToString([]byte(helpdeskAuthInfo))
	fmt.Println(helpdeskAuthToken)
}

请负责人妥善保管服务台 id 和 token 不要泄露,有风险时及时重置。

获取方式服务台管理后台 设置中心 > API 凭证

重置token : 重置 token 会生成新的 token,旧的 token 自动失效

image.png

限流策略

默认使用开放平台默认限流,单个API如有不同,会在对应API文档中说明。

如何使用服务台API

1、申请企业服务台 API 授权

若应用尚未申请服务台API权限,需在开发者后台增加权限申请并提交审核。企业自建应用需要企业管理员在管理后台审核通过;暂不支持应用商店应用。

2、API鉴权

服务台API作为开放平台对外能力一部分,会检查tenant_access_token/user_access_token得到对应信息。 同时使用服务台token鉴权,方便服务台负责人管理,控制应用对单个服务台资源的访问,修改权限。

3、调用服务台API

调用相关服务台API 对服务台资源创建,修改,删除,获取。 请参考具体的API文档

代码示例

以查询工单详情为例,仅供参考。 下面分别给出Python与Golang的实现

1、Python示例

javascript
import requests
import time

def get(url: str, **kwargs):
    r = requests.get(
        url,
        cookies=kwargs.get("cookies", {}),
        params=kwargs.get("params", {}),
        headers=dict(kwargs.get("headers", {}), **{"Connection": "close"}),
        json=kwargs.get("json", {}),
    )
    return r


def post(url: str, **kwargs):
    r = requests.post(
        url,
        cookies=kwargs.get("cookies", {}),
        params=kwargs.get("params", {}),
        headers=dict(kwargs.get("headers", {}), **{"Connection": "close"}),
        json=kwargs.get("json", {}),
    )
    return r


def get_tenant_header():
    url = "https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal/"
    # 开放平台机器人应用凭证,用于开通访问服务台权限
    body = {
        "app_id": "应用ID",
        "app_secret": "应用密钥"
    }
    # 把 服务台ID:服务台Token 转换为base64,填写到 X-Lark-Helpdesk-Authorization,用于指定访问哪个服务台
    # 在线base64编码  https://base64.us  https://tool.oschina.net/encrypt?type=3
    return {
        "Authorization": "Bearer %s"
                         % post(url, json=body).json()["tenant_access_token"],
        "X-Lark-Helpdesk-Authorization": "Njk4OTgwNTM1ODU1ODQ3ODM1NTpodC1lYjk1Y2ZlYi03ZGM1LTY1ZGUtMTUzOS1iMzZmOTk3MmM3ZjA=",
    }


tenant_header = get_tenant_header()


def get_ticket(id):
    url = "https://open.feishu.cn/open-apis/helpdesk/v1/tickets/%s" % id
    res = get(url, headers=tenant_header)
    try:
        info = res.json()["data"]["ticket"]
        return info
    except:
        print(id, res)
        return get_ticket(id)


info = get_ticket("工单ID")
print(info)

2、Golang示例

javascript
import (
	"bytes"
	b64 "encoding/base64"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"testing"
)

//开放平台机器人应用凭证,用于开通访问服务台权限
var appInfo = `
{
    "app_id":"应用ID",
    "app_secret":"应用密钥"
}
`

func httpRequest(req *http.Request) []byte {
	req.Header.Set("Content-Type", "application/json")
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	return body
}

func postJson(url string, myjson string) []byte {
	req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(myjson)))
	if err != nil {
		panic(err)
	}
	return httpRequest(req)
}

type tokenInfo struct {
	App_access_token    string `json:"app_access_token"`
	Tenant_access_token string `json:"tenant_access_token"`
}

//获取开放平台tenant token
func getTenantToken() string {
	url := "https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal/"
	body := postJson(url, appInfo)
	tokenInfo := tokenInfo{}
	json.Unmarshal(body, &tokenInfo)
	fmt.Println(tokenInfo)
	return tokenInfo.Tenant_access_token
}

func TestOpenApi(t *testing.T) {
	//服务台id跟token,用于指定访问哪个服务台
	helpdeskAuthInfo := "服务台ID:服务台Token"
	//服务台token base64编码
	helpdeskAuthToken := b64.StdEncoding.EncodeToString([]byte(helpdeskAuthInfo))
	url := "https://open.feishu.cn/open-apis/helpdesk/v1/tickets/工单ID"
	req, _ := http.NewRequest("GET", url, nil)
	req.Header.Set("X-Lark-Helpdesk-Authorization", helpdeskAuthToken)
	tenantToken := getTenantToken()
	//open api的token,请去开放平台申请好访问服务台资源权限
	req.Header.Set("Authorization", "Bearer "+tenantToken)
	body := httpRequest(req)
	fmt.Println(string(body))
}

内容来源:飞书开放平台 · 自动爬取整理