後退,我要開始變身了...
之前在微博上看到網友分享微信網頁版協議做的一個機器人的程序,覺得挺有意思,就參照分享作者整理的協議及源碼自己也做了個微信機器人
效果如圖:
程序下載地址:
文件名稱:F:\wxRobot\wxRobot.zip
文件大小:64272819 字節
修改時間:2016年6月10日 16:47:12
MD5 :EDF879C9EB5B1FAD9677C8075C0D3791
SHA1 :839CB1CA2EEDACC7F3DA86D77DB2A803F52E7683
CRC32 :DAB4B517
鏈接:https://pan.baidu.com/s/1jHCEbcU 密碼:bjxh
把自己賬號變為機器人的主要思路就是在收到想要自動回復的用戶信息時,將該信息轉發給機器人(也就是小冰),再將回收到的消息轉發給原目標用戶。
1 public static void main(String[] args) { 2 3 WxRobotApp wxRobotApp = new WxRobotApp(); 4 5 wxRobotApp.putThing("deviceId", "e" + System.currentTimeMillis()); 6 7 wxRobotApp.showFrame(); 8 9 // 1、2、3步驟合並,獲取到最新可用二維碼 10 wxRobotApp.prepareQRCode(); 11 12 // 4.確認後登陸,獲取後續請求必要參數 13 Map<String, Object> cookieResult = WxFun.getCookie(wxRobotApp.getThing("redirect").toString()); 14 Map<String, Object> baseRequest = new HashMap<>(); 15 Map<String, Object> bodyInnerParams = new HashMap<>(); 16 bodyInnerParams.put("Uin", cookieResult.get("wxuin")); 17 bodyInnerParams.put("Sid", cookieResult.get("wxsid")); 18 bodyInnerParams.put("Skey", cookieResult.get("skey")); 19 bodyInnerParams.put("DeviceId", wxRobotApp.getThing("deviceId")); 20 baseRequest.put("BaseRequest", bodyInnerParams); 21 wxRobotApp.putThing("baseRequest", baseRequest); 22 wxRobotApp.putThing("pass_ticket", cookieResult.get("pass_ticket")); 23 // 5.初始化微信 24 Map<String, Object> initData = WxFun.init((Map<String, Object>) wxRobotApp.getThing("baseRequest")); 25 Map user = (Map) initData.get("User"); 26 Map syncKey = (Map) initData.get("SyncKey"); 27 wxRobotApp.putThing("user", user); 28 wxRobotApp.putThing("userId", user.get("UserName")); 29 wxRobotApp.putThing("syncKey", syncKey); 30 logger.debug("[歡迎] " + user.get("NickName").toString()); 31 wxRobotApp.putThing("curUserName", user.get("NickName").toString()); 32 // 6 done 獲取聯系人,並將聯系人信息填入聯系人列表 33 Vector vector = WxFun.getContactList((Map<String, Object>) wxRobotApp.getThing("baseRequest")); 34 wxRobotApp.initContactList(vector); 35 for (Object uStr : vector) { 36 String[] uInfo = uStr.toString().split(splitFlag); 37 wxRobotApp.putThing("u_" + uInfo[1], uInfo[0]); 38 if (uInfo[0].equals(xiaoIceName)) { 39 xiaoIceId = uInfo[1]; 40 } 41 } 42 wxRobotApp.putThing("u_" + user.get("UserName").toString(), user.get("NickName").toString()); 43 // 7 啟動消息監聽 44 wxRobotApp.messageListener(); 45 }
主要代碼在啟動的main方法中都有體現
1.獲取微信網頁版登陸的二維碼
wxRobotApp.prepareQRCode();
這裡采取了超時重試的策略,在二維碼請求30秒過期後重新生成一個新的二維碼
2.確認登陸後,微信會返回一個redirect url跳轉,將需要的參數進行填充後,發送請求到這個跳轉url,並同時記錄下跳轉後返回的cookie,以在後續請求中帶上這個cookie值
public class WxLoginCookieJar implements CookieJar { // 只保存此地址返回的cookie,用作後續請求的cookie private String loginUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage"; private List<Cookie> cookies; @Override public void saveFromResponse(HttpUrl url, List<Cookie> cookies) { if (url.url().toString().contains(loginUrl)) { this.cookies = cookies; } } @Override public List<Cookie> loadForRequest(HttpUrl url) { return cookies != null ? cookies : new ArrayList<>(); } }
這裡對cookie的處理是,自定義了一個okhttp對cookie處理接口的實現類,在匹配到指定url後保存這個url返回的cookie,並在後續請求中帶上這個cookie
3.根據協議帶上相關參數請求初始化微信的url
4.根據獲取聯系人接口獲取到賬號中的聯系人
5.開啟監聽新消息線程
6.實現發送微信消息的接口
源碼地址在:https://git.oschina.net/xiayudashan/wxRobot.git