mirror of
https://github.com/silenceper/wechat.git
synced 2026-02-04 12:52:27 +08:00
公众号用户黑名单管理 (#609)
This commit is contained in:
116
officialaccount/user/blacklist.go
Normal file
116
officialaccount/user/blacklist.go
Normal file
@@ -0,0 +1,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)
|
||||
}
|
||||
Reference in New Issue
Block a user