Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

公众号用户黑名单管理 #609

Merged
merged 10 commits into from
Aug 31, 2022
89 changes: 89 additions & 0 deletions officialaccount/user/blacklist.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
// 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) {
silenceper marked this conversation as resolved.
Show resolved Hide resolved
// 获取 AccessToken
var accessToken string
if accessToken, err = user.GetAccessToken(); err != nil {
return
}

// 处理 request 内容
request := map[string]string{"begin_openid": ""}
if len(beginOpenid) == 1 {
gzylg marked this conversation as resolved.
Show resolved Hide resolved
request["begin_openid"] = beginOpenid[0]
gzylg marked this conversation as resolved.
Show resolved Hide resolved
}

// 调用接口
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
}

// 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)
}