微信的模擬登錄及獲取好友列表

最近沒事寫了個微信模擬登錄的代碼,測試能夠到今天2013年11月4日爲止是能夠登錄的 html

登錄是用的jsoup實現的,一個簡單又強大的工具。不懂的能夠@紅薯站長去 java

Connection.Response response = Jsoup.connect("https://mp.weixin.qq.com/") json

                .userAgent("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0")
                .method(Connection.Method.GET).timeout(0)
                .execute();


        response = Jsoup.connect("https://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN").ignoreContentType(true)
                .userAgent("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0")
                .referrer("https://mp.weixin.qq.com/")
                .data("username", username)
                .data("pwd", DigestUtils.md5Hex(password))
                .data("f", "json")
                .data("imgcode", "")
                .cookies(response.cookies())
                .method(Connection.Method.POST)
                .execute();

        System.out.println(response.body()); tomcat

        cookies=response.cookies();//保存,之後得用 微信

這裏返回的結果裏面ErrMsg裏面的地址很重要,它就是返回的302狀態要重定向的地址。最重要的是裏面包含了一個token.因此要保存一下 cookie

TOKEN = getQueryParam(homePage).get("token");

getQueryParam方法我就不貼出來了,很是簡單,你能夠用如今的httpclient,jetty或者tomcat裏面的類實現,也能夠本身寫一個字符串處理的,方法不少,可是目的只有一個,我想要獲得token的值。由於之後的url都要加上它。 工具

登錄以後固然是獲取好友列表了,我把前面的cookie用一個變量cookies保存起來了。下面用一下 測試

List<WeixinUser> userList=new ArrayList<WeixinUser>();
        String FANS_URL = "https://mp.weixin.qq.com/cgi-bin/contactmanage?t=user/index&token="
                + TOKEN + "&lang=zh_CN&pagesize=10&pageidx=0&type=0&groupid=0";


        WebClient wc = new WebClient();
        wc.getBrowserVersion().setUserAgent("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0");


        wc.addRequestHeader("Referer", "https://mp.weixin.qq.com/cgi-bin/settingpage?t=setting/index&action=index&token=" + TOKEN + "&lang=zh_CN");
        wc.getOptions().setJavaScriptEnabled(true);
        wc.getOptions().setCssEnabled(true);
        wc.setJavaScriptEngine(new JavaScriptEngine(wc));
        wc.getOptions().setThrowExceptionOnScriptError(false);
        wc.getOptions().setTimeout(60000);
        CookieManager cm = new CookieManager();
        cm.setCookiesEnabled(true);
        for (Map.Entry<String, String> cookie : this.cookies.entrySet()) {
            Cookie c = new Cookie("mp.weixin.qq.com", cookie.getKey(), cookie.getValue());
            cm.addCookie(c);
        }
        wc.setCookieManager(cm);
        HtmlPage page = wc.getPage(FANS_URL);
        Document document = Jsoup.parse(page.asXml());
        Element elem = document.getElementById("userGroups");
        Elements items = elem.getElementsByAttributeValueContaining("class", "user_info");
        for (Element item : items) {
            WeixinUser user = new WeixinUser();
            Element child=item.select("a[data-fakeid][class*=remark_name]").first();
            user.setFakeId(child.attr("data-fakeid"));
            user.setRemarkName(child.text());
            userList.add(user);
        }
        return userList;
this


爲何這裏又用htmlunit了呢?由於騰訊實在是太賤了,用戶列表那裏經過js輸出的,因此你得讓它的js運行,而後拿結果。OK 到了這裏剩下的事你想要作什麼就看你的了。
url

還有一點,不要用低版本的jdk 至少是1.6_45的,由於這個SSLFactory的實現有了些變化,1.6.10的就不行。sun包裏的東西 常常換,難怪sun對外聲名不要在本身的程序中直接引用sun.xxxx的包,由於你不知道你用的那個類在下個版本中是什麼樣,甚至還有沒有都不肯定。

相關文章
相關標籤/搜索