From d86b28c90feb6682bf009990f18895e0996ce8b0 Mon Sep 17 00:00:00 2001 From: markwang Date: Sun, 3 Sep 2023 17:08:39 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1-?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=AE=A2=E6=9C=8D=3D=E7=9F=A5=E8=AF=86?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- work/kf/knowledge.go | 366 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 366 insertions(+) create mode 100644 work/kf/knowledge.go diff --git a/work/kf/knowledge.go b/work/kf/knowledge.go new file mode 100644 index 0000000..c370ae0 --- /dev/null +++ b/work/kf/knowledge.go @@ -0,0 +1,366 @@ +package kf + +import ( + "fmt" + + "github.com/silenceper/wechat/v2/util" +) + +const ( + // addKnowledgeGroupURL 知识库分组添加 + addKnowledgeGroupURL = "https://qyapi.weixin.qq.com/cgi-bin/kf/knowledge/add_group?access_token=%s" + // delKnowledgeGroupURL 知识库分组删除 + delKnowledgeGroupURL = "https://qyapi.weixin.qq.com/cgi-bin/kf/knowledge/del_group?access_token=%s" + // modKnowledgeGroupURL 知识库分组修改 + modKnowledgeGroupURL = "https://qyapi.weixin.qq.com/cgi-bin/kf/knowledge/mod_group?access_token=%s" + // listKnowledgeGroupURL 知识库分组列表 + listKnowledgeGroupURL = "https://qyapi.weixin.qq.com/cgi-bin/kf/knowledge/list_group?access_token=%s" + // addKnowledgeIntentURL 知识库问答添加 + addKnowledgeIntentURL = "https://qyapi.weixin.qq.com/cgi-bin/kf/knowledge/add_intent?access_token=%s" + // delKnowledgeIntentURL 知识库问答删除 + delKnowledgeIntentURL = "https://qyapi.weixin.qq.com/cgi-bin/kf/knowledge/del_intent?access_token=%s" + // modKnowledgeIntentURL 知识库问答修改 + modKnowledgeIntentURL = "https://qyapi.weixin.qq.com/cgi-bin/kf/knowledge/mod_intent?access_token=%s" + // listKnowledgeIntentURL 知识库问答列表 + listKnowledgeIntentURL = "https://qyapi.weixin.qq.com/cgi-bin/kf/knowledge/list_intent?access_token=%s" +) + +// AddKnowledgeGroupRequest 知识库分组添加请求 +type AddKnowledgeGroupRequest struct { + Name string `json:"name"` +} + +// AddKnowledgeGroupResponse 知识库分组添加响应 +type AddKnowledgeGroupResponse struct { + util.CommonError + GroupID string `json:"group_id"` +} + +// AddKnowledgeGroup 知识库分组添加 +// see https://developer.work.weixin.qq.com/document/path/95971#%E6%B7%BB%E5%8A%A0%E5%88%86%E7%BB%84 +func (r *Client) AddKnowledgeGroup(req *AddKnowledgeGroupRequest) (*AddKnowledgeGroupResponse, error) { + var ( + accessToken string + err error + ) + if accessToken, err = r.ctx.GetAccessToken(); err != nil { + return nil, err + } + var response []byte + if response, err = util.PostJSON(fmt.Sprintf(addKnowledgeGroupURL, accessToken), req); err != nil { + return nil, err + } + result := &AddKnowledgeGroupResponse{} + if err = util.DecodeWithError(response, result, "AddKnowledgeGroup"); err != nil { + return nil, err + } + return result, nil +} + +// DelKnowledgeGroupRequest 知识库分组删除请求 +type DelKnowledgeGroupRequest struct { + GroupID string `json:"group_id"` +} + +// DelKnowledgeGroup 知识库分组删除 +// see https://developer.work.weixin.qq.com/document/path/95971#%E5%88%A0%E9%99%A4%E5%88%86%E7%BB%84 +func (r *Client) DelKnowledgeGroup(req *DelKnowledgeGroupRequest) error { + var ( + accessToken string + err error + ) + if accessToken, err = r.ctx.GetAccessToken(); err != nil { + return err + } + var response []byte + if response, err = util.PostJSON(fmt.Sprintf(delKnowledgeGroupURL, accessToken), req); err != nil { + return err + } + return util.DecodeWithCommonError(response, "DelKnowledgeGroup") +} + +// ModKnowledgeGroupRequest 知识库分组修改请求 +type ModKnowledgeGroupRequest struct { + GroupID string `json:"group_id"` + Name string `json:"name"` +} + +// ModKnowledgeGroup 知识库分组修改 +// see https://developer.work.weixin.qq.com/document/path/95971#%E4%BF%AE%E6%94%B9%E5%88%86%E7%BB%84 +func (r *Client) ModKnowledgeGroup(req *ModKnowledgeGroupRequest) error { + var ( + accessToken string + err error + ) + if accessToken, err = r.ctx.GetAccessToken(); err != nil { + return err + } + var response []byte + if response, err = util.PostJSON(fmt.Sprintf(modKnowledgeGroupURL, accessToken), req); err != nil { + return err + } + return util.DecodeWithCommonError(response, "ModKnowledgeGroup") +} + +// ListKnowledgeGroupRequest 知识库分组列表请求 +type ListKnowledgeGroupRequest struct { + Cursor string `json:"cursor"` + Limit int `json:"limit"` + GroupID string `json:"group_id"` +} + +// ListKnowledgeGroupResponse 知识库分组列表响应 +type ListKnowledgeGroupResponse struct { + util.CommonError + NextCursor string `json:"next_cursor"` + HasMore int `json:"has_more"` + GroupList []KnowledgeGroup `json:"group_list"` +} + +type KnowledgeGroup struct { + GroupID string `json:"group_id"` + Name string `json:"name"` + IsDefault int `json:"is_default"` +} + +// ListKnowledgeGroup 知识库分组列表 +// see https://developer.work.weixin.qq.com/document/path/95971#%E8%8E%B7%E5%8F%96%E5%88%86%E7%BB%84%E5%88%97%E8%A1%A8 +func (r *Client) ListKnowledgeGroup(req *ListKnowledgeGroupRequest) (*ListKnowledgeGroupResponse, error) { + var ( + accessToken string + err error + ) + if accessToken, err = r.ctx.GetAccessToken(); err != nil { + return nil, err + } + var response []byte + if response, err = util.PostJSON(fmt.Sprintf(listKnowledgeGroupURL, accessToken), req); err != nil { + return nil, err + } + result := &ListKnowledgeGroupResponse{} + if err = util.DecodeWithError(response, result, "ListKnowledgeGroup"); err != nil { + return nil, err + } + return result, nil +} + +// AddKnowledgeIntentRequest 知识库问答添加请求 +type AddKnowledgeIntentRequest struct { + GroupID string `json:"group_id"` + Question IntentQuestion `json:"question"` + SimilarQuestions IntentSimilarQuestions `json:"similar_questions"` + Answers []IntentAnswerReq `json:"answers"` +} + +// IntentQuestion 主问题 +type IntentQuestion struct { + Text IntentQuestionText `json:"text"` +} + +// IntentQuestionText 问题文本 +type IntentQuestionText struct { + Content string `json:"content"` +} + +// IntentSimilarQuestions 相似问题 +type IntentSimilarQuestions struct { + Items []IntentQuestion `json:"items"` +} + +// IntentAnswerReq 回答请求 +type IntentAnswerReq struct { + Text IntentAnswerText `json:"text"` + Attachments []IntentAnswerAttachmentReq `json:"attachments"` +} + +// IntentAnswerText 回答文本 +type IntentAnswerText struct { + Content string `json:"content"` +} + +// IntentAnswerAttachmentReq 回答附件请求 +type IntentAnswerAttachmentReq struct { + MsgType string `json:"msgtype"` + Image IntentAnswerAttachmentImgReq `json:"image,omitempty"` + Video IntentAnswerAttachmentVideoReq `json:"video,omitempty"` + Link IntentAnswerAttachmentLink `json:"link,omitempty"` + MiniProgram IntentAnswerAttachmentMiniProgramReq `json:"miniprogram,omitempty"` +} + +// IntentAnswerAttachmentImgReq 图片类型回答附件请求 +type IntentAnswerAttachmentImgReq struct { + MediaID string `json:"media_id"` +} + +// IntentAnswerAttachmentVideoReq 视频类型回答附件请求 +type IntentAnswerAttachmentVideoReq struct { + MediaID string `json:"media_id"` +} + +// IntentAnswerAttachmentLink 链接类型回答附件 +type IntentAnswerAttachmentLink struct { + Title string `json:"title"` + PicURL string `json:"picurl"` + Desc string `json:"desc"` + URL string `json:"url"` +} + +// IntentAnswerAttachmentMiniProgramReq 小程序类型回答附件请求 +type IntentAnswerAttachmentMiniProgramReq struct { + Title string `json:"title"` + ThumbMediaID string `json:"thumb_media_id"` + AppID string `json:"appid"` + PagePath string `json:"pagepath"` +} + +// AddKnowledgeIntentResponse 知识库问答添加响应 +type AddKnowledgeIntentResponse struct { + util.CommonError + IntentID string `json:"intent_id"` +} + +// AddKnowledgeIntent 知识库问答添加 +// see https://developer.work.weixin.qq.com/document/path/95972#%E6%B7%BB%E5%8A%A0%E9%97%AE%E7%AD%94 +func (r *Client) AddKnowledgeIntent(req *AddKnowledgeIntentRequest) (*AddKnowledgeIntentResponse, error) { + var ( + accessToken string + err error + ) + if accessToken, err = r.ctx.GetAccessToken(); err != nil { + return nil, err + } + var response []byte + if response, err = util.PostJSON(fmt.Sprintf(addKnowledgeIntentURL, accessToken), req); err != nil { + return nil, err + } + result := &AddKnowledgeIntentResponse{} + if err = util.DecodeWithError(response, result, "AddKnowledgeIntent"); err != nil { + return nil, err + } + return result, nil +} + +// DelKnowledgeIntentRequest 知识库问答删除请求 +type DelKnowledgeIntentRequest struct { + IntentID string `json:"intent_id"` +} + +// DelKnowledgeIntent 知识库问答删除 +// see https://developer.work.weixin.qq.com/document/path/95972#%E5%88%A0%E9%99%A4%E9%97%AE%E7%AD%94 +func (r *Client) DelKnowledgeIntent(req *DelKnowledgeIntentRequest) error { + var ( + accessToken string + err error + ) + if accessToken, err = r.ctx.GetAccessToken(); err != nil { + return err + } + var response []byte + if response, err = util.PostJSON(fmt.Sprintf(delKnowledgeIntentURL, accessToken), req); err != nil { + return err + } + return util.DecodeWithCommonError(response, "DelKnowledgeIntent") +} + +// ModKnowledgeIntentRequest 知识库问答修改请求 +type ModKnowledgeIntentRequest struct { + IntentID string `json:"intent_id"` + Question IntentQuestion `json:"question"` + SimilarQuestions IntentSimilarQuestions `json:"similar_questions"` + Answers []IntentAnswerReq `json:"answers"` +} + +// ModKnowledgeIntent 知识库问答修改 +// see https://developer.work.weixin.qq.com/document/path/95972#%E4%BF%AE%E6%94%B9%E9%97%AE%E7%AD%94 +func (r *Client) ModKnowledgeIntent(req *ModKnowledgeIntentRequest) error { + var ( + accessToken string + err error + ) + if accessToken, err = r.ctx.GetAccessToken(); err != nil { + return err + } + var response []byte + if response, err = util.PostJSON(fmt.Sprintf(modKnowledgeIntentURL, accessToken), req); err != nil { + return err + } + return util.DecodeWithCommonError(response, "ModKnowledgeIntent") +} + +// ListKnowledgeIntentRequest 知识库问答列表请求 +type ListKnowledgeIntentRequest struct { + Cursor string `json:"cursor"` + Limit int `json:"limit"` + GroupID string `json:"group_id"` + IntentID string `json:"intent_id"` +} + +// ListKnowledgeIntentResponse 知识库问答列表响应 +type ListKnowledgeIntentResponse struct { + util.CommonError + NextCursor string `json:"next_cursor"` + HasMore int `json:"has_more"` + IntentList []KnowledgeIntent `json:"intent_list"` +} + +// KnowledgeIntent 问答摘要 +type KnowledgeIntent struct { + GroupID string `json:"group_id"` + IntentID string `json:"intent_id"` + Question IntentQuestion `json:"question"` + SimilarQuestions IntentSimilarQuestions `json:"similar_questions"` + Answers []IntentAnswerRes `json:"answers"` +} + +// IntentAnswerRes 回答返回 +type IntentAnswerRes struct { + Text IntentAnswerText `json:"text"` + Attachments []IntentAnswerAttachmentRes `json:"attachments"` +} + +// IntentAnswerAttachmentRes 回答附件返回 +type IntentAnswerAttachmentRes struct { + MsgType string `json:"msgtype"` + Image IntentAnswerAttachmentImgRes `json:"image,omitempty"` + Video IntentAnswerAttachmentVideoRes `json:"video,omitempty"` + Link IntentAnswerAttachmentLink `json:"link,omitempty"` + MiniProgram IntentAnswerAttachmentMiniProgramRes `json:"miniprogram,omitempty"` +} + +// IntentAnswerAttachmentImgRes 图片类型回答附件返回 +type IntentAnswerAttachmentImgRes struct { + Name string `json:"name"` +} + +// IntentAnswerAttachmentVideoRes 视频类型回答附件返回 +type IntentAnswerAttachmentVideoRes struct { + Name string `json:"name"` +} + +// IntentAnswerAttachmentMiniProgramRes 小程序类型回答附件返回 +type IntentAnswerAttachmentMiniProgramRes struct { + Title string `json:"title"` + AppID string `json:"appid"` + PagePath string `json:"pagepath"` +} + +// ListKnowledgeIntent 知识库问答列表 +// see https://developer.work.weixin.qq.com/document/path/95972#%E8%8E%B7%E5%8F%96%E9%97%AE%E7%AD%94%E5%88%97%E8%A1%A8 +func (r *Client) ListKnowledgeIntent(req *ListKnowledgeIntentRequest) (*ListKnowledgeIntentResponse, error) { + var ( + accessToken string + err error + ) + if accessToken, err = r.ctx.GetAccessToken(); err != nil { + return nil, err + } + var response []byte + if response, err = util.PostJSON(fmt.Sprintf(listKnowledgeIntentURL, accessToken), req); err != nil { + return nil, err + } + result := &ListKnowledgeIntentResponse{} + if err = util.DecodeWithError(response, result, "ListKnowledgeIntent"); err != nil { + return nil, err + } + return result, nil +} From c2536faa50927e50c0fa78342a7a2ddb3d8e92f3 Mon Sep 17 00:00:00 2001 From: markwang Date: Sun, 3 Sep 2023 17:13:24 +0800 Subject: [PATCH 2/3] fix:golangci-lint --- work/kf/knowledge.go | 1 + 1 file changed, 1 insertion(+) diff --git a/work/kf/knowledge.go b/work/kf/knowledge.go index c370ae0..230b954 100644 --- a/work/kf/knowledge.go +++ b/work/kf/knowledge.go @@ -117,6 +117,7 @@ type ListKnowledgeGroupResponse struct { GroupList []KnowledgeGroup `json:"group_list"` } +// KnowledgeGroup 知识库分组 type KnowledgeGroup struct { GroupID string `json:"group_id"` Name string `json:"name"` From d782fb0ebccbb8122deee861f63335d097093c55 Mon Sep 17 00:00:00 2001 From: markwang Date: Mon, 4 Sep 2023 08:47:00 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=E7=A7=BB=E9=99=A4=E9=9D=9E=E5=BF=85?= =?UTF-8?q?=E8=A6=81=E7=9A=84err=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- work/kf/knowledge.go | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/work/kf/knowledge.go b/work/kf/knowledge.go index 230b954..1d196c1 100644 --- a/work/kf/knowledge.go +++ b/work/kf/knowledge.go @@ -51,10 +51,8 @@ func (r *Client) AddKnowledgeGroup(req *AddKnowledgeGroupRequest) (*AddKnowledge return nil, err } result := &AddKnowledgeGroupResponse{} - if err = util.DecodeWithError(response, result, "AddKnowledgeGroup"); err != nil { - return nil, err - } - return result, nil + err = util.DecodeWithError(response, result, "AddKnowledgeGroup") + return result, err } // DelKnowledgeGroupRequest 知识库分组删除请求 @@ -139,10 +137,8 @@ func (r *Client) ListKnowledgeGroup(req *ListKnowledgeGroupRequest) (*ListKnowle return nil, err } result := &ListKnowledgeGroupResponse{} - if err = util.DecodeWithError(response, result, "ListKnowledgeGroup"); err != nil { - return nil, err - } - return result, nil + err = util.DecodeWithError(response, result, "ListKnowledgeGroup") + return result, err } // AddKnowledgeIntentRequest 知识库问答添加请求 @@ -235,10 +231,8 @@ func (r *Client) AddKnowledgeIntent(req *AddKnowledgeIntentRequest) (*AddKnowled return nil, err } result := &AddKnowledgeIntentResponse{} - if err = util.DecodeWithError(response, result, "AddKnowledgeIntent"); err != nil { - return nil, err - } - return result, nil + err = util.DecodeWithError(response, result, "AddKnowledgeIntent") + return result, err } // DelKnowledgeIntentRequest 知识库问答删除请求 @@ -360,8 +354,6 @@ func (r *Client) ListKnowledgeIntent(req *ListKnowledgeIntentRequest) (*ListKnow return nil, err } result := &ListKnowledgeIntentResponse{} - if err = util.DecodeWithError(response, result, "ListKnowledgeIntent"); err != nil { - return nil, err - } - return result, nil + err = util.DecodeWithError(response, result, "ListKnowledgeIntent") + return result, err }