| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- 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)
- return result.Tags, err
- }
- // 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)
- 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
- }
|