blacklist.go 3.6 KB

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