使用Go调用企业微信API接口,实现工作自动化与沟通

企业微信是一款专为企业打造的全面的通讯工具,为企业提供高效沟通、协同办公、移动应用等多项功能。借助企业微信API接口,我们可以很方便地在自己的应用中集成企业微信的功能,实现工作自动化与沟通。

在本文中,我们将使用Go语言调用企业微信API接口,实现获取部门列表和发送文本消息的功能,并演示如何使用access_token来完成API鉴权。

首先,我们需要准备截图中所示的三个参数:

<img src="https://i.ibb.co/pWrcDsj/QQ-20211213161515.png" alt="QQ-20211213161515" border="0" />

其中,CorpID是企业的唯一标识,Secret是用于API调用的密钥,AgentID是企业微信应用的ID,在接下来的调用中我们将用到它们。

获取access_token

在使用企业微信API之前,我们需要先获取access_token,用于完成API鉴权。

type AccessTokenResp struct {
    ErrCode      int64  `json:"errcode"`
    ErrorMessage string `json:"errmsg"`
    AccessToken  string `json:"access_token"`
    ExpiresIn    int64  `json:"expires_in"`
}

// 获取access_token
func GetAccessToken() (string, error) {
    resp, err := http.Get(fmt.Sprintf(accessTokenUrl, CorpID, Secret))
    if err != nil {
        return "", err
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return "", err
    }

    var accessTokenResp AccessTokenResp
    err = json.Unmarshal(body, &accessTokenResp)
    if err != nil {
        return "", err
    }

    if accessTokenResp.ErrCode != 0 {
        return "", fmt.Errorf("get access token error: %s", accessTokenResp.ErrorMessage)
    }

    return accessTokenResp.AccessToken, nil
}

通过调用上述函数,我们可以获取到 access_token。

获取部门列表

接下来,我们来实现获取部门列表的功能。具体的API文档可以参考企业微信API文档

type DepartmentListResp struct {
    ErrCode     int64        `json:"errcode"`
    ErrorMessage   string      `json:"errmsg"`
    DepartmentList []Department `json:"department"`
}

type Department struct {
    ID       int64  `json:"id"`
    Name     string `json:"name"`
    ParentID int64  `json:"parentid"`
}

// 获取部门列表
func GetDepartmentList(accessToken string) ([]Department, error) {
    resp, err := http.Get(fmt.Sprintf(departmentListUrlFormat, accessToken))
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()

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

    var departmentListResp DepartmentListResp
    err = json.Unmarshal(body, &departmentListResp)
    if err != nil {
        return nil, err
    }

    if departmentListResp.ErrCode != 0 {
        return nil, fmt.Errorf("get department list error: %s", departmentListResp.ErrorMessage)
    }

    return departmentListResp.DepartmentList, nil
}

上述代码通过调用企业微信API接口,获取到部门列表,具体结果可以参考下图:

<img src="https://i.ibb.co/g9SdS8S/QQ-20211213165439.png" alt="QQ-20211213165439" border="0" />

发送文本消息

除了获取部门列表外,我们还可以通过企业微信API来发送消息。下面是一个发送文本消息的例子:

type TextMessage struct {
    ToUser  string `json:"touser"`
    ToParty string `json:"toparty"`
    ToTag   string `json:"totag"`
    MsgType string `json:"msgtype"`
    AgentID int64  `json:"agentid"`
    Text    struct {
        Content string `json:"content"`
    } `json:"text"`
    Safe int64 `json:"safe"`
}

type TextMessageResp struct {
    ErrCode      int64  `json:"errcode"`
    ErrorMessage string `json:"errmsg"`
    InvalidUser  string `json:"invaliduser"`
    InvalidParty string `json:"invalidparty"`
    InvalidTag   string `json:"invalidtag"`
}

// 发送文本消息
func SendMessage(accessToken, toUser, content string) error {
    message := TextMessage{
        ToUser:  toUser,
        MsgType: "text",
        AgentID: AgentID,
        Text: struct {
            Content string `json:"content"`
        }{
            Content: content,
        },
    }

    messageBytes, err := json.Marshal(&message)
    if err != nil {
        return err
    }

    resp, err := http.Post(fmt.Sprintf(sendMessageUrlFormat, accessToken), "application/json", bytes.NewReader(messageBytes))
    if err != nil {
        return err
    }
    defer resp.Body.Close()

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

    var textMessageResp TextMessageResp
    err = json.Unmarshal(body, &textMessageResp)
    if err != nil {
        return err
    }

    if textMessageResp.ErrCode != 0 {
        return fmt.Errorf("send message error: %s", textMessageResp.ErrorMessage)
    }

    return nil
}

使用上述代码可以向指定用户发送文本消息,具体结果可以参考下图:

<img src="https://i.ibb.co/4s4KrYH/QQ-20211213170240.png" alt="QQ-20211213170240" border="0" />

至此,我们已经实现了使用Go调用企业微信API的相关功能。在实际场景中,我们可以进一步封装上述代码,以便于自动化工作的编写。

分享:

扫一扫在手机阅读、分享本文