242 lines
5.7 KiB
Go
242 lines
5.7 KiB
Go
|
package user
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/silenceper/wechat/v2/util"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
tagCreateURL = "https://api.weixin.qq.com/cgi-bin/tags/create?access_token=%s"
|
||
|
tagGetURL = "https://api.weixin.qq.com/cgi-bin/tags/get?access_token=%s"
|
||
|
tagUpdateURL = "https://api.weixin.qq.com/cgi-bin/tags/update?access_token=%s"
|
||
|
tagDeleteURL = "https://api.weixin.qq.com/cgi-bin/tags/delete?access_token=%s"
|
||
|
tagUserListURL = "https://api.weixin.qq.com/cgi-bin/user/tag/get?access_token=%s"
|
||
|
tagBatchtaggingURL = "https://api.weixin.qq.com/cgi-bin/tags/members/batchtagging?access_token=%s"
|
||
|
tagBatchuntaggingURL = "https://api.weixin.qq.com/cgi-bin/tags/members/batchuntagging?access_token=%s"
|
||
|
tagUserTidListURL = "https://api.weixin.qq.com/cgi-bin/tags/getidlist?access_token=%s"
|
||
|
)
|
||
|
|
||
|
// TagInfo 标签信息
|
||
|
type TagInfo struct {
|
||
|
ID int32 `json:"id"`
|
||
|
Name string `json:"name"`
|
||
|
Count int64 `json:"count"`
|
||
|
}
|
||
|
|
||
|
// TagOpenIDList 标签用户列表
|
||
|
type TagOpenIDList struct {
|
||
|
Count int `json:"count"`
|
||
|
Data struct {
|
||
|
OpenIDs []string `json:"openid"`
|
||
|
} `json:"data"`
|
||
|
NextOpenID string `json:"next_openid"`
|
||
|
}
|
||
|
|
||
|
// CreateTag 创建标签
|
||
|
func (user *User) CreateTag(tagName string) (tagInfo *TagInfo, err error) {
|
||
|
var accessToken string
|
||
|
accessToken, err = user.GetAccessToken()
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
uri := fmt.Sprintf(tagCreateURL, accessToken)
|
||
|
var response []byte
|
||
|
var request struct {
|
||
|
Tag struct {
|
||
|
Name string `json:"name"`
|
||
|
} `json:"tag"`
|
||
|
}
|
||
|
request.Tag.Name = tagName
|
||
|
response, err = util.PostJSON(uri, &request)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
var result struct {
|
||
|
util.CommonError
|
||
|
Tag *TagInfo `json:"tag"`
|
||
|
}
|
||
|
err = json.Unmarshal(response, &result)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
if result.ErrCode != 0 {
|
||
|
err = fmt.Errorf("CreateTag Error , errcode=%d , errmsg=%s", result.ErrCode, result.ErrMsg)
|
||
|
return
|
||
|
}
|
||
|
return result.Tag, nil
|
||
|
}
|
||
|
|
||
|
// DeleteTag 删除标签
|
||
|
func (user *User) DeleteTag(tagID int32) (err error) {
|
||
|
accessToken, err := user.GetAccessToken()
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
url := fmt.Sprintf(tagDeleteURL, accessToken)
|
||
|
var request struct {
|
||
|
Tag struct {
|
||
|
ID int32 `json:"id"`
|
||
|
} `json:"tag"`
|
||
|
}
|
||
|
request.Tag.ID = tagID
|
||
|
resp, err := util.PostJSON(url, &request)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
return util.DecodeWithCommonError(resp, "DeleteTag")
|
||
|
}
|
||
|
|
||
|
// UpdateTag 编辑标签
|
||
|
func (user *User) UpdateTag(tagID int32, tagName string) (err error) {
|
||
|
accessToken, err := user.GetAccessToken()
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
url := fmt.Sprintf(tagUpdateURL, accessToken)
|
||
|
var request struct {
|
||
|
Tag struct {
|
||
|
ID int32 `json:"id"`
|
||
|
Name string `json:"name"`
|
||
|
} `json:"tag"`
|
||
|
}
|
||
|
request.Tag.ID = tagID
|
||
|
request.Tag.Name = tagName
|
||
|
resp, err := util.PostJSON(url, &request)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
return util.DecodeWithCommonError(resp, "UpdateTag")
|
||
|
}
|
||
|
|
||
|
// GetTag 获取公众号已创建的标签
|
||
|
func (user *User) GetTag() (tags []*TagInfo, err error) {
|
||
|
accessToken, err := user.GetAccessToken()
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
url := fmt.Sprintf(tagGetURL, accessToken)
|
||
|
response, err := util.HTTPGet(url)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
var result struct {
|
||
|
util.CommonError
|
||
|
Tags []*TagInfo `json:"tags"`
|
||
|
}
|
||
|
err = json.Unmarshal(response, &result)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
return result.Tags, nil
|
||
|
}
|
||
|
|
||
|
// OpenIDListByTag 获取标签下粉丝列表
|
||
|
func (user *User) OpenIDListByTag(tagID int32, nextOpenID ...string) (userList *TagOpenIDList, err error) {
|
||
|
accessToken, err := user.GetAccessToken()
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
url := fmt.Sprintf(tagUserListURL, accessToken)
|
||
|
var request = struct {
|
||
|
ID int32 `json:"tagid"`
|
||
|
OpenID string `json:"next_openid"`
|
||
|
}{
|
||
|
ID: tagID,
|
||
|
}
|
||
|
if len(nextOpenID) > 0 {
|
||
|
request.OpenID = nextOpenID[0]
|
||
|
}
|
||
|
response, err := util.PostJSON(url, &request)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
userList = new(TagOpenIDList)
|
||
|
err = json.Unmarshal(response, &userList)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// BatchTag 批量为用户打标签
|
||
|
func (user *User) BatchTag(openIDList []string, tagID int32) (err error) {
|
||
|
accessToken, err := user.GetAccessToken()
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
if len(openIDList) == 0 {
|
||
|
return
|
||
|
}
|
||
|
var request = struct {
|
||
|
OpenIDList []string `json:"openid_list"`
|
||
|
TagID int32 `json:"tagid"`
|
||
|
}{
|
||
|
OpenIDList: openIDList,
|
||
|
TagID: tagID,
|
||
|
}
|
||
|
url := fmt.Sprintf(tagBatchtaggingURL, accessToken)
|
||
|
resp, err := util.PostJSON(url, &request)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
return util.DecodeWithCommonError(resp, "BatchTag")
|
||
|
}
|
||
|
|
||
|
// BatchUntag 批量为用户取消标签
|
||
|
func (user *User) BatchUntag(openIDList []string, tagID int32) (err error) {
|
||
|
if len(openIDList) == 0 {
|
||
|
return
|
||
|
}
|
||
|
accessToken, err := user.GetAccessToken()
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
url := fmt.Sprintf(tagBatchuntaggingURL, accessToken)
|
||
|
var request = struct {
|
||
|
OpenIDList []string `json:"openid_list"`
|
||
|
TagID int32 `json:"tagid"`
|
||
|
}{
|
||
|
OpenIDList: openIDList,
|
||
|
TagID: tagID,
|
||
|
}
|
||
|
resp, err := util.PostJSON(url, &request)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
return util.DecodeWithCommonError(resp, "BatchUntag")
|
||
|
}
|
||
|
|
||
|
// UserTidList 获取用户身上的标签列表
|
||
|
func (user *User) UserTidList(openID string) (tagIDList []int32, err error) {
|
||
|
accessToken, err := user.GetAccessToken()
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
url := fmt.Sprintf(tagUserTidListURL, accessToken)
|
||
|
var request = struct {
|
||
|
OpenID string `json:"openid"`
|
||
|
TagID int32 `json:"tagid"`
|
||
|
}{
|
||
|
OpenID: openID,
|
||
|
}
|
||
|
resp, err := util.PostJSON(url, &request)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
var result struct {
|
||
|
util.CommonError
|
||
|
TagIDList []int32 `json:"tagid_list"`
|
||
|
}
|
||
|
err = json.Unmarshal(resp, &result)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
if result.ErrCode != 0 {
|
||
|
err = fmt.Errorf("UserTidList Error , errcode=%d , errmsg=%s", result.ErrCode, result.ErrMsg)
|
||
|
return
|
||
|
}
|
||
|
return result.TagIDList, nil
|
||
|
}
|