-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
/
blacklist.go
116 lines (98 loc) · 3.59 KB
/
blacklist.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// Package user blacklist 公众号用户黑名单管理
// 参考文档:https://developers.weixin.qq.com/doc/offiaccount/User_Management/Manage_blacklist.html
package user
import (
"errors"
"fmt"
"github.com/silenceper/wechat/v2/util"
)
const (
// 获取公众号的黑名单列表
getblacklistURL = "https://api.weixin.qq.com/cgi-bin/tags/members/getblacklist?access_token=%s"
// 拉黑用户
batchblacklistURL = "https://api.weixin.qq.com/cgi-bin/tags/members/batchblacklist?access_token=%s"
// 取消拉黑用户
batchunblacklistURL = "https://api.weixin.qq.com/cgi-bin/tags/members/batchunblacklist?access_token=%s"
)
// GetBlackList 获取公众号的黑名单列表
// 该接口每次调用最多可拉取 1000 个OpenID,当列表数较多时,可以通过多次拉取的方式来满足需求。
// 参数 beginOpenid:当 begin_openid 为空时,默认从开头拉取。
func (user *User) GetBlackList(beginOpenid ...string) (userlist *OpenidList, err error) {
if len(beginOpenid) > 1 {
return nil, errors.New("参数 beginOpenid 错误:请传递 1 个openID,若需要从头开始拉取列表请留空。")
}
// 获取 AccessToken
var accessToken string
if accessToken, err = user.GetAccessToken(); err != nil {
return
}
// 处理 request 内容
request := map[string]string{"begin_openid": ""}
if len(beginOpenid) == 1 {
request["begin_openid"] = beginOpenid[0]
}
// 调用接口
var resp []byte
url := fmt.Sprintf(getblacklistURL, accessToken)
if resp, err = util.PostJSON(url, &request); err != nil {
return nil, err
}
// 处理返回
userlist = &OpenidList{}
if err = util.DecodeWithError(resp, userlist, "GetBlackList"); err != nil {
return nil, err
}
return
}
// GetAllBlackList 获取公众号的所有黑名单列表
func (user *User) GetAllBlackList() (openIDList []string, err error) {
var (
beginOpenid string
count int
userlist *OpenidList
)
for {
// 获取列表(每次1k条)
if userlist, err = user.GetBlackList(beginOpenid); err != nil {
return nil, err
}
openIDList = append(openIDList, userlist.Data.OpenIDs...) // 存储本次获得的OpenIDs
count += userlist.Count // 记录获得的总数量
beginOpenid = userlist.NextOpenID // 记录下次循环的起始openID
if count >= userlist.Total {
break // 获得的数量=total,结束循环
}
}
return
}
// BatchBlackList 拉黑用户
// 参数 openidList:需要拉入黑名单的用户的openid,每次拉黑最多允许20个
func (user *User) BatchBlackList(openidList ...string) (err error) {
return user.batch(batchblacklistURL, "BatchBlackList", openidList...)
}
// BatchUnBlackList 取消拉黑用户
// 参数 openidList:需要取消拉入黑名单的用户的openid,每次拉黑最多允许20个
func (user *User) BatchUnBlackList(openidList ...string) (err error) {
return user.batch(batchunblacklistURL, "BatchUnBlackList", openidList...)
}
// batch 公共方法
func (user *User) batch(url, apiName string, openidList ...string) (err error) {
// 检查参数
if len(openidList) == 0 || len(openidList) > 20 {
return errors.New("参数 openidList 错误:每次操作黑名单用户数量为1-20个。")
}
// 获取 AccessToken
var accessToken string
if accessToken, err = user.GetAccessToken(); err != nil {
return
}
// 处理 request 内容
request := map[string][]string{"openid_list": openidList}
// 调用接口
var resp []byte
url = fmt.Sprintf(url, accessToken)
if resp, err = util.PostJSON(url, &request); err != nil {
return
}
return util.DecodeWithCommonError(resp, apiName)
}