1. 程式人生 > >微信公眾平臺 獲取使用者列表

微信公眾平臺 獲取使用者列表

微信公眾平臺技術文件獲取使用者列表

一、介面說明

公眾號可通過本介面來獲取帳號的關注者列表,關注者列表由一串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個數據,如果想多次獲取就要使用迴圈不斷的去獲取。微信的關注使用者列表有一個好的排列順序,是按照關注時間的先後進行排序的,如果一個使用者取消關注,再新增關注,這個使用者在獲取微信使用者列表中的位置是不變的,所以不用擔心我們獲取微信使用者時排列順序會有所不同。