微信公眾平臺 獲取使用者列表
阿新 • • 發佈:2019-01-06
微信公眾平臺技術文件:獲取使用者列表
一、介面說明
公眾號可通過本介面來獲取帳號的關注者列表,關注者列表由一串OpenID(加密後的微訊號,每個使用者對每個公眾號的OpenID是唯一的)組成。一次拉取呼叫最多拉取10000個關注者的OpenID,可以通過多次拉取的方式來滿足需求。
二、介面呼叫
1 介面呼叫請求說明
(1)http請求方式: GET(請使用https協議)
https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID
(2)請求引數
引數 | 是否必須 | 說明 |
---|---|---|
access_token | 是 | 呼叫介面憑證 |
next_openid | 是 | 第一個拉取的OPENID,不填預設從頭開始拉取 |
2 介面呼叫返回說明
(1)正確時返回JSON資料包
{"total":2,"count":2,"data":{"openid":["","OPENID1","OPENID2"]},"next_openid":"NEXT_OPENID"}
(2)返回引數
引數 | 說明 |
---|---|
total | 關注該公眾賬號的總使用者數 |
count | 拉取的OPENID個數,最大值為10000 |
data | 列表資料,OPENID的列表 |
next_openid | 拉取列表的最後一個使用者的OPENID |
附:關注者數量超過10000時
當公眾號關注者數量超過10000時,可通過填寫next_openid的值,從而多次拉取列表的方式來滿足需求。
具體而言,就是在呼叫介面時,將上一次呼叫得到的返回中的next_openid值,作為下一次呼叫中的next_openid值。
示例如下:
公眾賬號A擁有23000個關注的人,想通過拉取關注介面獲取所有關注的人,那麼分別請求url如下:https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN 返回結果:
{
"total" :23000,
"count":10000,
"data":{"
openid":[
"OPENID1",
"OPENID2",
...,
"OPENID10000"
]
},
"next_openid":"OPENID10000"
}https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID1返回結果:
{
"total":23000,
"count":10000,
"data":{
"openid":[
"OPENID10001",
"OPENID10002",
...,
"OPENID20000"
]
},
"next_openid":"OPENID20000"
}https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID2返回結果(關注者列表已返回完時,返回next_openid為空):
{
"total":23000,
"count":3000,
"data":{"
"openid":[
"OPENID20001",
"OPENID20002",
...,
"OPENID23000"
]
},
"next_openid":"OPENID23000"
}
三、java介面開發
注:此介面開發使用spring的RestTemplate方法進行http請求,如果不使用此方法可以使用其他http請求工具或方法進行http的請求。此方法僅供參考!
1 返回引數物件WeixinUserList
/**
* 類描述:微信公眾平臺使用者openId列表資訊
* 開發人員:wangqiulin
* 開發時間:2017-9-5
*/
public class WeixinUserList {
private Integer total;//關注該公眾賬號的總使用者數
private Integer count;//拉取的OPENID個數,最大值為10000
private WxOpenidInfo data;//列表資料,OPENID的列表
private String next_openid;//拉取列表的最後一個使用者的OPENID
private int errcode;//錯誤編碼
private String errmsg="ok";//錯誤提示
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
public Integer getCount() {
return count;
}
public void setCount(Integer count) {
this.count = count;
}
public String getNext_openid() {
return next_openid;
}
public void setNext_openid(String next_openid) {
this.next_openid = next_openid;
}
public WxOpenidInfo getData() {
return data;
}
public void setData(WxOpenidInfo data) {
this.data = data;
}
public int getErrcode() {
return errcode;
}
public void setErrcode(int errcode) {
this.errcode = errcode;
}
public String getErrmsg() {
return errmsg;
}
public void setErrmsg(String errmsg) {
this.errmsg = errmsg;
}
}
openidList集合物件
import java.util.List;
public class WxOpenidInfo {
private List<String> openid;
public List<String> getOpenid() {
return openid;
}
public void setOpenid(List<String> openid) {
this.openid = openid;
}
}
2 介面方法
將獲取到的openid集合寫入txt檔案,寫入資料庫也類似
public WeixinUserList getUserOpenIdList(String nextOpenid, String accessToken) {
//使用者openid列表資訊
WeixinUserList openIdListInfo = null;
synchronized(this){
try {
//迴圈獲取使用者openid列表
do{
//微信公眾號獲取使用者列表資訊介面地址
String requestUrl = null;
if(StringUtils.isBlank(nextOpenid)){
requestUrl = new StringBuffer().append("https://api.weixin.qq.com/cgi-bin/user/get?access_token=").append(accessToken).toString();
}else {
requestUrl = new StringBuffer().append("https://api.weixin.qq.com/cgi-bin/user/get?access_token=")
.append(accessToken).append("&next_openid=").append(nextOpenid).toString();
}
openIdListInfo = restTemplate.getForObject(requestUrl, WeixinUserList.class);
if(openIdListInfo != null && openIdListInfo.getErrcode() == 0){
//獲取使用者openid列表物件
WxOpenidInfo wxOpenidInfo = openIdListInfo.getData();
if(wxOpenidInfo != null){
List<String> openids = wxOpenidInfo.getOpenid();
if(openids != null && openids.size() > 0){
//生成資料的表頭
StringBuffer text = new StringBuffer();
for (String openid : openids) {
//生成資料的內容
text.append(openid+"\r\n");
}
//寫入txt檔案中
writeTxtFile(text.toString());
}
//拉取列表的最後一個使用者的OPENID
nextOpenid = openIdListInfo.getNext_openid();
}
}else {
openIdListInfo.setErrcode(40000);
openIdListInfo.setErrmsg("獲取關注使用者列表失敗");
return openIdListInfo ;
}
}
while (openIdListInfo.getCount() == 10000);
} catch (Exception e) {
LOG.error("獲取使用者列表失敗",e);
openIdListInfo .setErrcode(40000);
openIdListInfo .setErrmsg("獲取使用者列表失敗");
return openIdListInfo ;
}
}
return openIdListInfo;
}
將獲取的openid列表寫入txt檔案
/**
* 寫檔案
*/
public void writeTxtFile(String content) throws IOException{
//指定檔案路徑和名稱
String path = "D:/openidList.txt";
File filename = new File(path);
if (!filename.exists()) {
filename.createNewFile();
LOG.info(filename + "已建立!");
}
//先讀取原有檔案內容,然後進行寫入操作
RandomAccessFile randomAccessFile = null;
try {
randomAccessFile = new RandomAccessFile(filename, "rw");
// 檔案長度,位元組數
long fileLength = randomAccessFile.length();
// 將寫檔案指標移到檔案尾。
randomAccessFile.seek(fileLength);
randomAccessFile.writeBytes(content);
} catch (IOException e1) {
e1.printStackTrace();
} finally {
if (randomAccessFile != null) {
try {
randomAccessFile.close();
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
}
java介面方法說明:
因為微信關注使用者列表每次請求介面只能獲取10000個數據,如果想多次獲取就要使用迴圈不斷的去獲取。微信的關注使用者列表有一個好的排列順序,是按照關注時間的先後進行排序的,如果一個使用者取消關注,再新增關注,這個使用者在獲取微信使用者列表中的位置是不變的,所以不用擔心我們獲取微信使用者時排列順序會有所不同。