前言
微信公众号给用户打标签
打开链接,准备第一步,无标签情况下,知道需要打那个标签直接从打标签那开始看
参考文档:微信标签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