获取微信公众号所有订阅用户,并批量获取用户基本信息

获取微信公众号所有订阅用户,并批量获取用户基本信息

public void syncSubscribe() {String appId = ApiConstants.PUBLIC_ACCOUNT_APP_ID;// 所有订阅用户List<String> openIdList = getUserList(appId);// 一个批次只能查100条数据,将List按100的长度进行拆分List<List<String>> partitionList = org.apache.commons.collections4.ListUtil.partition(openIdList, 100);for (List<String> list : partitionList) {R<List<JSONObject>> result = getUserInfoList(appId, list);if (result.isSuccess()) {List<LkWxXxx> wxList = new ArrayList<>();for (JSONObject t : result.getData()) {if (t.containsKey("unionid")) {String openid = t.getStr("openid");String unionid = t.getStr("unionid");Long subscribeTime = t.getLong("subscribe_time");LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(subscribeTime),ZoneId.systemDefault());wxList.add(LkWxXxx.builder().openid(openid).unionid(unionid).subscribeTime(localDateTime).build());}}// TODO doShings}}
}public static List<String> getUserList(String appId) {List<String> userList = new ArrayList<>();String nextOpenid = "";boolean hasMore = true;while (hasMore) {String url = String.format("https://api.weixin.qq.com/cgi-bin/user/get?access_token=%s&next_openid=%s",getStableAccessToken(appId), nextOpenid);String result = HttpUtil.get(url); //hutool工具类JSONObject userListObj = JSONUtil.parseObj(result); //hutool工具类if (userListObj.containsKey("data")) {userList.addAll(userListObj.getJSONObject("data").getJSONArray("openid").toList(String.class));}nextOpenid = userListObj.getStr("next_openid");hasMore = StrUtil.isNotEmpty(nextOpenid);}return userList;
}public static R<List<JSONObject>> getUserInfoList(String appId, List<String> openIdList) {try {JSONObject openIdBody = new JSONObject().set("user_list", toMapList(openIdList, t -> new JSONObject().set("openid", t)));String result = HttpUtil.post(StrUtil.format("https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token={}", getStableAccessToken(appId)),JSONUtil.toJsonStr(openIdBody));JSONObject userInfoBatchGet = JSONUtil.parseObj(result);if (userInfoBatchGet.containsKey("user_info_list")) {return R.ok(userInfoBatchGet.getBeanList("user_info_list", JSONObject.class));}} catch (Exception e) {e.printStackTrace();}return R.fail();
}public static <E, T> List<T> toMapList(Collection<E> collection, Function<E, T> function) {if (CollUtil.isEmpty(collection)) return CollUtil.newArrayList();return collection.stream().map(function).filter(Objects::nonNull).collect(Collectors.toList());
}
/**
* 获取公众号普通的AccessToken
*/
public static String getStableAccessToken(String appId) {if (StrUtil.isEmpty(appId)) return "";String url = "https://api.weixin.qq.com/cgi-bin/token";Map<String, Object> request = new HashMap<>(3);request.put("grant_type", "client_credential");request.put("appid", appId);request.put("secret", ApiConstants.getAppSecret(appId));try {String result = HttpUtil.get(url, request, 30000);accessToken = JSONUtil.parseObj(result).getStr("access_token", "");if (StrUtil.isNotEmpty(accessToken)) {return accessToken;}} catch (Exception e) {log.info("getAccessToken Exception:{}", e.getMessage());}return "";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/38594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue项目创建+eslint+Prettier+git提交规范(commitizen+hooks+husk)

# 步骤 1、使用 vue-cli 创建项目 这一小节我们需要创建一个 vue3 的项目&#xff0c;而创建项目的方式依然是通过 vue-cli 进行创建。 不过这里有一点大家需要注意&#xff0c;因为我们需要使用最新的模板&#xff0c;所以请保证你的 vue-cli 的版本在 4.5.13 以上&#xff…

Debian linux忘记root密码如何重置

重启电脑, 到下图再按 e 键 在页面中可以看到有个ro的行&#xff0c;在ro行的尾部&#xff0c;添加 rw init/bin/bas 3. ctrl X 启动系统&#xff0c;最后会进入命令行模式 4. 重设root密码&#xff0c;输入命令 passwd root&#xff0c;按照提示输入新密码并确认 5. 重启系…

基于Python的自动化测试框架-Pytest总结-第一弹基础

Pytest总结第一弹基础 入门知识点安装pytest运行pytest测试用例发现规则执行方式命令行执行参数 配置发现规则 如何编写测试Case基础案例断言语句的使用pytest.fail() 和 Exceptions自定义断言函数异常测试测试类形式 pytest的Fixture使用Fixture入门案例使用fixture的Setup、T…

昇思25天学习打卡营第8天|模型训练

昇思25天学习打卡营第8天|模型训练 前言模型训练构建数据集定义神经网络模型定义超参、损失函数和优化器超参损失函数优化器 训练与评估 个人任务打卡&#xff08;读者请忽略&#xff09;个人理解与总结 前言 非常感谢华为昇思大模型平台和CSDN邀请体验昇思大模型&#xff01;从…

linux中如何启动python虚拟环境

找到python虚拟环境所在目录 执行下面的命令即可 source auth_python/bin/activate

2024自然语言处理期末回忆

2024.6.19考 总体来说&#xff0c;很离谱&#xff0c;那么多ppt&#xff0c;考之前以为肯定会考算法&#xff0c;看了好久的算法&#xff0c;结果考了很多概念题。 就是说&#xff0c;这门课很抽象&#xff0c;能不选就别选了。 1.&#xff08;1&#xff09;什么是预训练词向…

【遇坑笔记】Node.js 开发环境与配置 Visual Studio Code

【遇坑笔记】Node.js 开发环境与配置 Visual Studio Code 前言node.js开发环境配置解决pnpm 不是内部或外部命令的问题&#xff08;pnpm安装教程&#xff09; 解决 pnpm : 无法加载文件 C:\Program Files\nodejs\pnpm.ps1&#xff0c;因为在此系统上禁止运行脚本。 前言 最近部…

【代码随想录】【算法训练营】【第49天】 [300]最长递增子序列 [674]最长连续递增序列 [718]最长重复子数组

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 49&#xff0c;周二&#xff0c;坚持不了一点~ 题目详情 [300] 最长递增子序列 题目描述 300 最长递增子序列 解题思路 前提&#xff1a;最大递增子序列的长度 思路&#xff1a;动态规划 d…

基于X86+FPGA的精密加工检测设备解决方案

应用场景 随着我国高新技术的发展和国防现代化发展&#xff0c;航空、航天等领域需 要的大型光电子器件&#xff0c;微型电子机械、 光 电信息等领域需要的微型器件&#xff0c;还有一些复杂零件的加工需求日益增加&#xff0c;这些都需要借助精密甚至超精密的加工检测设备 客…

esp12实现的网络时钟校准

网络时间的获取是通过向第三方服务器发送GET请求获取并解析出来的。 在本篇博客中&#xff0c;网络时间的获取是一种自动的行为&#xff0c;当系统成功连接WiFi获取到网络天气后&#xff0c;系统将自动获取并解析得到时间和日期&#xff0c;为了减少误差每两分钟左右进行一次校…

clock时钟周期

clock时钟周期 #include <iostream> #include <ctime>int main() {clock_t start clock(); // 获取开始时间的时钟周期数// 模拟一些工作for (long long i 0; i < 10000000000; i);clock_t end clock(); // 获取结束时间的时钟周期数std::cout << &q…

web平台—apache

web平台—apache 1. 学apache前需要知道的知识点2. apache详解2.1 概述2.2 工作模式2.3 启动apache网站整体流程2.4 相关文件保存位置2.5 配置文件详解 3. apache配置实验实验1&#xff1a;设置apache的目录别名实验2&#xff1a;apache的用户认证实验3&#xff1a;虚拟主机 (重…

江门MES制造执行系统:助力工厂实现智能化管理

江门MES制造执行系统(MES)在工厂实现智能化管理方面发挥着重要作用&#xff0c;以下是它的一些助力方面&#xff1a; 实时监控与控制&#xff1a;江门MES系统可以实时监控生产过程中的各个环节&#xff0c;包括设备状态、生产进度、质量指标等&#xff0c;帮助工厂管理人员及时…

【linux】(8)文件搜索grep

grep 用于在文件中搜索指定的模式&#xff08;字符串或正则表达式&#xff09;&#xff0c;并输出匹配的行。 基本用法 grep [options] pattern [file...]常用选项 基本搜索 grep pattern filename例子&#xff1a;搜索文件 example.txt 中包含字符串 hello 的行。 grep &quo…

【vueUse库Animation模块各函数简介及使用方法】

vueUse库是一个专门为Vue打造的工具库,提供了丰富的功能,包括监听页面元素的各种行为以及调用浏览器提供的各种能力等。其中的Browser模块包含了一些实用的函数,以下是这些函数的简介和使用方法: vueUse库Sensors模块各函数简介及使用方法 vueUseAnimation函数1. useInter…

Linux相关初步运用

常用命令 Cd Ls Unzip Unrar x Mv Pwd rz sz rm -rf /root/logs/game#删除文件夹 rm -f /root/logs/game/nohup.log#删除文件 #返回上级目录cd.. #目录创建 mkdir 路径添加 Vim ~/.bash_profile #python环境变量的添加 Export PYTHONPATH$PYTHONPATH:/home/us…

ImageJ图片之间的相减操作

在ImageJ中进行图片相减的操作可以按照以下步骤进行&#xff1a; 打开两张图片&#xff1a; 首先&#xff0c;你需要在ImageJ中打开两张你想要进行相减操作的图片。这两张图片应该具有相同的尺寸和色彩深度&#xff0c;以确保相减操作能够正确进行。进入Image Calculator&…

选择合适的SSL证书:性价比最优选择指南

当我们谈论HTTPS证书时&#xff0c;主要涉及的是SSL/TLS证书&#xff0c;这些证书用于在服务器与客户端之间建立安全的加密连接。证书的价格差异主要由以下几个因素决定&#xff1a; 1. 验证类型 SSL/TLS证书按验证级别分为三种类型&#xff1a;DV&#xff08;域名验证&#…

LW-DETR: A Transformer Replacement to YOLO for Real-Time Detection

LW-DETR: A Transformer Replacement to YOLO for Real-Time Detection 论文链接&#xff1a;http://arxiv.org/abs/2406.03459 代码链接&#xff1a;https://github.com/Atten4Vis/LW-DETR 一、摘要 介绍了一种轻量级检测变换器LWDETR&#xff0c;它在实时物体检测方面超越…

CF1981D Turtle and Multiplication 题解

Turtle and Multiplication 传送门 Turtle just learned how to multiply two integers in his math class, and he was very excited. Then Piggy gave him an integer n n n , and asked him to construct a sequence a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1​,…