企业微信是一款专为企业打造的全面的通讯工具,为企业提供高效沟通、协同办公、移动应用等多项功能。借助企业微信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的相关功能。在实际场景中,我们可以进一步封装上述代码,以便于自动化工作的编写。