微信公众号关注用户的信息拉取
微信關注用戶的詳細信息均保存在騰訊的微信服務器內。因此,若想獲得公眾號的關注用戶的詳細信息,必須通過相應的接口進行調用。而接口規定一次拉取只能拉取一萬條openid,當用戶較多時我們需要循環調用接口進行拉取操作。
首先我們需要獲得accesstoken,這是微信接口調用憑證。
// 獲取微信access_tokenString accessToken = WxBase.getToken();// 跨域請求需在服務器端設置響應頭response.setHeader("Access-Control-Allow-origin", "*");JSONArray user_info_list = new JSONArray();// 拉取完全部用戶之后存儲,也是本方法的最終返回對象。JSONArray current_info_list = new JSONArray();// 每次獲取之后存儲的單元JSONArray openidList = new JSONArray();// 作為批量獲取用戶信息方法batchGetUserInfo的參數String nextOpenId = "";int counter = 0;int total = 0;int count = 0;do {// 利用do-while循環可以解決粉絲數超過一萬或者不足一萬的情況,避免代碼冗余。// 取openid列表JSONObject userJsonObject = WxUser.getUserList(accessToken, nextOpenId);// total為全部用戶,count為本次拉取的用戶條數total = userJsonObject.getIntValue("total");// 比如是20000count = userJsonObject.getIntValue("count");// 10000counter += count;// 10000nextOpenId = userJsonObject.getString("next_openid");JSONObject dataJsonObject = JSONObject.parseObject(userJsonObject.getString("data"));JSONArray openidArray = JSON.parseArray(dataJsonObject.getString("openid"));Iterator<Object> iterator = openidArray.iterator();while (iterator.hasNext()) {String openid = (String) iterator.next();JSONObject jo = new JSONObject();jo.put("openid", openid);jo.put("lang", "zh-CN");// TODO:暫時先默認是簡體中文,后續可能會做判斷openidList.add(jo);}current_info_list = WxUser.batchGetUserInfo(openidList, accessToken);user_info_list.addAll(current_info_list);// 全部放入另一個jsonarray中。} while (total != counter);// 當累加器沒有達到最大值則繼續循環,如果累加器已經達到最大粉絲數,則停止獲取用戶信息。log.info(user_info_list);要獲得詳細的用戶信息,還需要先行調用獲取關注用戶的openid列表,因為獲得用戶詳細信息的接口需要我們傳入這個列表,因此是兩次接口調用,如果還是不太明白,就去微信公眾開發手冊中查看:微信公眾平臺
另外還有微信硬件接口開發的連接地址:http://iot.weixin.qq.com/wiki/new/index.html?page=3-4-1
在獲取到的關注用戶詳細信息中,用戶的關注時間是一串數字,這時我們就需要進行重新格式化一下,同樣需要用到循環語句:
????????// 將取出的用戶列表中的subscribe_time循環格式化Iterator<Object> iterator = user_info_list.iterator();JSONArray userList = new JSONArray();// 處理subscribeTime時需要用到的變量JSONObject userJo = new JSONObject();Long time = 0L;DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String subscribeTime = "";while (iterator.hasNext()) {// 取出每個用戶并轉換為JsonObject便于操作userJo = (JSONObject) iterator.next();// 取出用戶關注時間轉化為Long型time = Long.parseLong(userJo.getString("subscribe_time"));// 格式化subscribeTime = df.format(new Date(time * 1000L));// 放回用戶對象中userJo.put("subscribe_time", subscribeTime);// 放回current_info_list中。userList.add(userJo);}return userList;至此,我們通過后臺Java語句獲得了存儲于微信服務器上的關注者基本信息。
接下來是前端的顯示工作。
由于如今h5的流行,以及spring boot的使用,可以將項目壓縮為一個jar包直接放到服務器上運行,而jsp在打包的過程中會非常麻煩,因此我們只能使用jQuery將數據通過動態創建<tr>標簽的方式進行展示:
jQuery(document).ready(function() {var url = "http://localhost:8080//wxgz/wxuser/alluser";$.post(url,function(data, status) {var thArr = $(".tr-thead").children();for (var i = 0; i < data.length; i++) {//這里是動態添加tr的過程。if (i > 0) {var tr = $("tbody").append("<tr class='gradeC'></tr>");for (var j = 0; j < thArr.length; j++) {var field = $(".tr-thead").children("th:eq(" + j + ")").text();tr.append("<td>" + eval("data[i]." + field) + "</td>");}} else {for (var j = 0; j < thArr.length; j++) {//循環取出th值,指定需要從data[i]中需要取哪個屬性。var field = $(".tr-thead").children("th:eq(" + j + ")").text();$(".gradeX").children("td:eq(" + j + ")").text(eval("data[i]." + field)); //這條語句會把之前的顯示覆蓋掉。}}}}); });以上jQuery代碼雖然看似不多,但是卻讓我這個對前端知識不甚了解的人花了好久,而且中間也出現過一次關鍵問題上的錯誤,即后臺傳過來的結果的確是個數組,這個數組中的每個元素包含一個關注者的基本信息,每個基本信息是通過鍵值對的json形式進行編排的,關注者與關注者之間是數組元素的關系,但是每個關注者中的基本信息并非是數組關系,我們并不能通過循環取出,而只能通過key進行讀取。而<th>中我們已經寫死了表頭,因此這里我并沒有按照后臺返回值的自然順序進行排序,而是對<th>標簽中的值進行順序取,再通過這個獲得的值在后臺返回值中進行關注者信息的取出。
此處應當留意eval(“xxxx”)的使用。
總結
以上是生活随笔為你收集整理的微信公众号关注用户的信息拉取的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Markdown简明使用
- 下一篇: 玄学········为什么在eclips