java:微信公众号批量打标签

前言

微信公众号给用户打标签
打开链接,准备第一步,无标签情况下,知道需要打那个标签直接从打标签那开始看
参考文档:微信标签API

准备

1 准备tagid

首先你需要创建标签,然后获取标签ID,没有查看上边的API

2 消息体

创建消息体对象

import lombok.Data;
import java.util.ArrayList;

@Data
public class TagUser {
    private ArrayList<String> openid_list;
    private int tagid;
}

import com.picc.web.wechat.model.TagUser;
import lombok.Data;

/**
 * @Author ZhangLe
 * @Date 2020/11/3 14:10
 */
@Data
public class TagUserVo {
    private TagUser tagUser;
    private String errMsg;
}

打标签

1 发送体

    public void returnMap(){
        //需要查询打标签的对象
        Map<Integer, Integer> map = new HashMap<>();
        map.put(4401,130);
        map.put(4406,134);
        map.put(4407,135);
        map.put(4408,136);
        map.put(4412,138);
        map.put(4413,139);
        map.put(4414,140);
        map.put(4415,141);
        map.put(4416,142);
        map.put(4417,143);
        map.put(4418,144);
        map.put(4419,145);
        map.put(4420,146);
        map.put(4452,148);
        map.put(4471,150);
        map.put(4494,151);
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //获取微信TOKEN 定义成变量 这个可以写到调用方法传过来
        String token =  sendWeChatMsg.getToken();
        if(token==null||"".equals(token)){
            System.out.println("服务器故障");
            return;
        }
        for (int i: map.keySet() ) {
            Integer integer = map.get(i);
            System.out.println("开始"+i+" "+integer+" "+df.format(new Date()));
            token=findOpenIdByTag(i,integer,token);
            System.out.println("结束"+i+""+integer+" "+df.format(new Date()));

        }
    }
    public String findOpenIdByTag(int tagNum,int tagId,String token) {

        //获取需要打标签的群体,只要openid数组 你要是有这个 或者打标签的只有一个数组 修改下方法直接用
        List<String> list = weChatTokenMapper.findOpenIdByTag(tagNum+"");

        if(list==null||list.size()==0){return token;}
      
        //获得数组大小
        int size = list.size();
        //开始次数
        int i=1;
        //创建消息体对象
        TagUser tagUser = new TagUser();
        //设置需要打得标签 重要 写对
        tagUser.setTagid(tagId);
        //设置数组 50人一组 微信规定一次只能打50人
        ArrayList<String> openids = new ArrayList<>();
        //循环 数组大小我的是15W Java运行没问题
        List<TagUserVo> arr= new ArrayList<>();
        System.err.println("发送总数:"+list.size());
        for (String userid : list) {
            //滤空
            if (userid != null && !"".equals(userid)) {
                openids.add(userid);
            }

            //发送消息 50人一组
            if(i%50==0){
                //存入数组
                tagUser.setOpenid_list(openids);
                //HTTP发送请求给微信API
                String s = wechatApiService.setUserTag(tagUser,token);
                //输出结果 如果决心打大量标签这个输出就关了 如果想看那就打开
//                System.out.println("循环:"+i+"返回:"+s);
                //发送失败打印失败数组 可能原因有用户取消关注公众号  用户注销等原因 获取大部分可控报错 记录打失败的对象
                if(!s.contains("\"errmsg\":\"ok\"")){
                    if(s.contains("42001")){
                        System.err.println("token过期:-----------");
                        //重新获取赋值token 有调用限制 不要频繁调用 这里笔者的token为最大使用量2H自动更换一次
                        token=sendWeChatMsg.getToken();
                        s= wechatApiService.setUserTag(tagUser,token);
                        System.out.println("重新发送结果:"+s+tagUser);
                    }else if(s.contains("-1")){
                        System.err.println("系统繁忙:-----------");
                        s= wechatApiService.setUserTag(tagUser,token);
                        System.out.println("重新发送结果:"+s+tagUser);
                    }else if(s.contains("40001")){
                        //重新获取赋值token 有调用限制 不要频繁调用
                        System.err.println("token失效:-----------");
                        token=sendWeChatMsg.getToken();
                        s= wechatApiService.setUserTag(tagUser,token);
                        System.out.println("重新发送结果:"+s+tagUser);
                    }else{
                        System.err.println("循环:"+i+"**发送总数:"+size+"失败"+s+tagUser);

                    }//保存失败对象
                    TagUserVo tagUserVo = new TagUserVo();
                    tagUserVo.setErrMsg(s);
                    tagUserVo.setTagUser(tagUser);
                    arr.add(tagUserVo);
                }

                //置空数组 进行下一轮循环
                openids.clear();
                //最后有余数循环方式,保证所有人都打标签
            }else if(i==size){
                //存入数组 过多的判断就不需要了 最后不足50人
                tagUser.setOpenid_list(openids);
                String s = wechatApiService.setUserTag(tagUser,token);
                if(s.contains("42001")){
                    System.err.println("token过期:"+s);
                    token=sendWeChatMsg.getToken();
                    s = wechatApiService.setUserTag(tagUser,token);
                    System.out.println("重新发送结果:"+s);
                }
                System.out.println("循环:"+i+"**发送总数:"+size+"返回:"+s);
                if(!s.contains("ok")){
                    System.err.println("循环:"+i+"**发送总数:"+size+"失败"+s+tagUser);
                    TagUserVo tagUserVo = new TagUserVo();
                    tagUserVo.setErrMsg(s);
                    tagUserVo.setTagUser(tagUser);
                    arr.add(tagUserVo);
                }

            }
            //记录次数
            i++;
        }
        //打标签完毕标志 打印出失败对象
        System.out.println(tagNum+"完成"+arr.size());
        for (TagUserVo userVo : arr) {
            System.out.println(userVo);
        }

        return token;
    }

在这里插入图片描述

2 HTTP发送

URL

https://api.weixin.qq.com/cgi-bin/tags/members/batchtagging?access_token=
    /**
     * 批量设置用户标签最多20个标签50个人
     *
     * @param tagUser
     * @return
     */
    public String setUserTag(TagUser tagUser,String token) {
        String url = "https://api.weixin.qq.com/cgi-bin/tags/members/batchtagging?access_token=" + token;
        String result = null;
        try {
            result = new HttpsClient().post("utf-8", SendWeChatMsg.CONTENT_TYPE, url, JSON.toJSONString(tagUser), "");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

如果没有post请求,或者需要代理发送看我的之前的文章
java/HttpClient:get、post 设置代理(java.net.UnknownHostException)

查看结果

URL GET

https://api.weixin.qq.com/cgi-bin/tags/get?access_token=

通过这个URL可以查看你的所有标签,以及标签下的人员数量,数据大差不差就行

常见报错

微信开发-错误码大全
常见报错就是TOKEN失效这个问题,你需要在你获取的时候加入时间判断,一般来说打标签15万人需要15-20分钟。80W1H自己可以估算。平均一秒100个。还有刚才说的用户取消关注,注销问题

token过期:{"errcode":42001,"errmsg":"access_token expired rid: 5fa10fb0-1be041ee-606f43de"}
token ===38_lw-QvIZSS2WWtHGdajmmgCOeSRQdtgytHk9oyh3xR7NPwL0kE-oUYkPnt0gnU-pp8-qcy5WeGyYBZ8iwDiyYUC3lHLQtIVtolFxUJ1GNPlurz-FTxHXiSC6OI4qULlHNObXgoKYp6AQmFKcFOOWfCIAWWE
expired_dt ===2020-11-03 17:33:06
{
    "errcode": 42001,
    "errmsg": "access_token expired rid: 5fa10104-42e1470f-777e51c7"
}

在这里插入图片描述
发送结果节选

token ===38_iJQN4mQ3qtFogyKo26NnoGqSx5ryQKnrAnk1l4eCaflNjVvfYu3DF4HsKnzMCbvU59zLnvkv6yjNEjaJMl4DE3L0K-HXrefqK5m4p-g6nNHxitQ3FmzIPkRccul_dl5Waw_iET2EAX1RS5FHSFQeCGAYLW
expired_dt ===2020-11-04 05:38:15
发送总数:115816
循环:115816**发送总数:115816返回:{"errcode":0,"errmsg":"ok"}
4408完成0
结束4408136 2020-11-04 04:23:26
开始4412 138 2020-11-04 04:23:26
发送总数:96479
token ===38_iJQN4mQ3qtFogyKo26NnoGqSx5ryQKnrAnk1l4eCaflNjVvfYu3DF4HsKnzMCbvU59zLnvkv6yjNEjaJMl4DE3L0K-HXrefqK5m4p-g6nNHxitQ3FmzIPkRccul_dl5Waw_iET2EAX1RS5FHSFQeCGAYLW
expired_dt ===2020-11-04 05:38:15
循环:96479**发送总数:96479返回:{"errcode":0,"errmsg":"ok"}
4412完成0
结束4412138 2020-11-04 04:39:33
开始4413 139 2020-11-04 04:39:33
token ===38_iJQN4mQ3qtFogyKo26NnoGqSx5ryQKnrAnk1l4eCaflNjVvfYu3DF4HsKnzMCbvU59zLnvkv6yjNEjaJMl4DE3L0K-HXrefqK5m4p-g6nNHxitQ3FmzIPkRccul_dl5Waw_iET2EAX1RS5FHSFQeCGAYLW
expired_dt ===2020-11-04 05:38:15
发送总数:196738
循环:196738**发送总数:196738返回:{"errcode":0,"errmsg":"ok"}
4413完成0
结束4413139 2020-11-04 05:12:08
开始4414 140 2020-11-04 05:12:08
发送总数:115434
token ===38_6Mhp2024RglXq9lTfwf0IZu8tLvHc5GwR0I-0bMOjc3MVCS9CHdUIY5-8T5XnEElVfhQBUqGxXCHv8MJ_sNzoI2Xd8_eDmP7gPekotzAWp2stCLDz8c17sL19EbwaztHZGQuWjMsei5P20EwBLMdCAAQAB
expired_dt ===2020-11-04 07:08:58
循环:115434**发送总数:115434返回:{"errcode":0,"errmsg":"ok"}
4414完成0
结束4414140 2020-11-04 05:31:11
开始4415 141 2020-11-04 05:31:11
token ===38_6Mhp2024RglXq9lTfwf0IZu8tLvHc5GwR0I-0bMOjc3MVCS9CHdUIY5-8T5XnEElVfhQBUqGxXCHv8MJ_sNzoI2Xd8_eDmP7gPekotzAWp2stCLDz8c17sL19EbwaztHZGQuWjMsei5P20EwBLMdCAAQAB
expired_dt ===2020-11-04 07:08:58
发送总数:52278
循环:52278**发送总数:52278返回:{"errcode":0,"errmsg":"ok"}
4415完成0
结束4415141 2020-11-04 05:39:50
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值