關於微信公衆平臺模擬登陸(無源碼)

寫於2015年7月7日的話:這個模擬的問題我好久沒研究了(2年了),都不知道微信公衆號的網站有沒有修改過,研究這個我感受最大的做用就是能主動給關注者發送消息,其它的貌似沒什麼意思,不如用接口。若是堅持仍要模擬登陸,多試幾回(失敗的話),就算公衆平臺改也改動不大的。主要注意cookies和發送的東西(token什麼的),由於沒理由瀏覽器發送那些給服務器能行,可是我發一樣的東西給服務器不行的前端

2015年7月7日結束 java

===================================================     jquery

第一次寫技術博客,一直逛開源中國,感受愧對你們,只索取沒付出。先用無源碼篩選掉一部分浮躁的讀者,不過說句實話,代碼這東西最好本身寫,沒什麼技術難點,我學C#才兩年。 web

    由於是模擬網頁登陸,因此須要對http多少有些瞭解,一年前我正在看百度百科的HTTP協議,經理看見了問我:看這個幹嗎(由於咱們公司是一個作WEB應用的小公司,因此通常也真的用不着這些)?我呵呵一笑。建議你們無論學什麼語音,儘可能多去接觸一些底層的東西,總有一天有用的。這個須要對web前端其實就是JS要有必定的瞭解,最好是開發過web項目,並接觸了項目中至少一小半的前臺的東西。 chrome

//@@@@@@@@@@@@@@@      廢話結束        @@@@@@@@@@@@@@@@@ 編程

準備好工具:一、編程環境(廢話),我一開始的時候只是玩玩,就用的VBScript。。。後來是C#
                 二、開發人員工具(IE上是這麼叫的啦,chrome上叫開發者工具,firefox上應該是用firebug插件吧)
                 三、(可選)記事本,由於應該是要記點東西的。 json

從登陸開始講起好了,先拋開編程軟件,拿出瀏覽器(這裏我選擇的是IE9,chrome的開發者工具我不會用)和記事本。IE打開登陸界面(圖我就不放了),而後按F12,轉到腳本標籤頁,咱們要找的是登陸那塊的JS代碼,好根據你們豐富的經驗,判斷出那個名字很長的先後有個勾的JS文件是包含登陸代碼的,咱們選擇查看它。沒有經驗的朋友們也不要慌,右邊有個搜索框,你去搜下「登錄」或者「login」,而後慢慢找也是能夠的嘛。(我前文和下文說的都是IE9,其它瀏覽器我不知道,請你們本身對應) 瀏覽器

選擇了這個JS文件後,可能你看到的是一坨壓縮過的代碼,點擊上圖長的紅框左邊的那個錘子和不知道什麼東西交叉在一塊兒的那個按鈕,在下拉菜單裏選擇「格式化JavaScript」。而後咱們翻翻代碼,找到這一段代碼: 服務器


t.post("/cgi-bin/login?lang=zh_CN",{
                username:e.account,pwd:t.md5(e.password.substr(0,16)),imgcode:c.data("isHide")?"":e.verify,f:"json"
            }
            ,function(t){
                var n=t.ErrCode+"",i;
                u.hasClass("checkbox_checked")?WXM.Helpers.setCookie("remember_acct",e.account,30):WXM.Helpers.setCookie("remember_acct","EXPIRED",-1);
                switch(n){
                    case"-1":i="系統錯誤,請稍候再試。";
                    break;
                    case"-2":i="賬號或密碼錯誤。";
                    break;
                    case"-3":i="您輸入的賬號或者密碼不正確,請從新輸入。";
                    break;
                    case"-4":i="不存在該賬戶。";
                    break;
                    case"-5":i="您目前處於訪問受限狀態。";
                    break;
                    case"-6":i="請輸入圖中的驗證碼",r();
                    return;
                    case"-7":i="此賬號已綁定私人微信號,不可用於公衆平臺登陸。";
                    break;
                    case"-8":i="郵箱已存在。";
                    break;
                    case"-32":i="您輸入的驗證碼不正確,請從新輸入",r();
                    break;
                    case"-200":i="因頻繁提交虛假資料,該賬號被拒絕登陸。";
                    break;
                    case"-94":i="請使用郵箱登錄。";
                    break;
                    case"10":i="該公衆會議號已通過期,沒法再登陸使用。";
                    break;
                    case"65201":case"65202":i="成功登錄,正在跳轉...",location.href=t.ErrMsg;
                    return;
                    case"0":i="成功登錄,正在跳轉...",location.href=t.ErrMsg;
                    return;
                    default:i="未知的返回。";
                    return
                }
                s.trigger("Response",[n,i])
            }
            ,"json")

第一句裏的t,咱們猜他是jquery好了,其實並不重要,關鍵是後面的post,網址是這個「/cgi-bin/login?lang=zh_CN」,加上主機地址就是「https://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN」,也就是說咱們要像這個網址post這些個東西過去:username:e.account,pwd:t.md5(e.password.substr(0,16)),imgcode:c.data("isHide")?"":e.verify,f:"json"。簡單分析一下,就四個東西username用戶名、pwd密碼(MD5加密)、imgcode驗證碼、f格式是json。 微信

咱們能夠看到驗證碼能夠是三目運算,要是驗證碼圖片是隱藏的,就傳"",要是顯示着就傳驗證碼。我一開始想着傳一個"",它總是返回-6,看上面的代碼可知是「請輸入圖中的驗證碼」,開源社區裏有一個開源的項目,java寫的,他的作法是失敗了再試,多試幾回,不知道試幾回能成功,應該不多的次數吧,算是一種成功的案例吧,你們能夠試試循環不停的登陸(@廖凱)。當時我就是死腦筋,它讓我輸入驗證碼我就輸入驗證碼好了,在「開發人員工具」能夠看到登陸代碼的上面一點點是下載驗證碼圖片的

r=function(){
        h.val(""),p.attr("src","/cgi-bin/verifycode?username="+m.getVal().account+"&r="+ +(new Date))
    }

能夠很簡單的看到網址是 https://mp.weixin.qq.com /cgi-bin/verifycode?username=你的賬號&r=一個日期毫秒數(名字是我亂起的,至關於一個隨機數)。咱們先獲取驗證碼,而後把它和賬號密碼一塊兒發回去,返回的結果應該仍是-6,這是怎麼回事呢?(不得不注一下:我說的是幾個月前的,那是後微信公衆平臺仍是HTTP的不是HTTPS的,期間網站變更過,我說的東西不必定對,可是出來的結果必定是對的,好比你把賬號和密碼發過去一次就成功了,也沒發驗證碼。我接下來講的是極端的狀況,即:賬號密碼驗證碼都發了仍是-6,若是你一次就成功了,下面的請跳過)

接下來要講到IE9開發人員工具的另外一個功能(至關於抓包),在「網絡」選項卡里有一個按鈕叫「開始捕獲」,點了它以後,這個網頁發的接的全部的消息都內被記錄下來。
我來試試看登陸,此次我不會輸入正確的賬號密碼,由於正確的話它會調到另外一個頁面,捕獲的內容會被重置掉(由於又是一個新的頁面了)。

雙擊這個記錄,而後能夠看到下面的

還有請求正文,我就不截圖了:username=賬號&pwd=32位小寫MD5加密以後的密碼&imgcode=驗證碼&f=json。
咱們反過來思考,咱們明明什麼都發了,作的和IE同樣,這些值都post過去了,爲啥服務器還說咱們錯呢?咱們看那張請求標頭的圖,它上面每個咱們都分析一下,咱們全都照着抄好了,咱們把HttpRequest的屬性都是設一下,我總結了一下,主要是Content-Type、User-Agent、Content-Length和cookie。前面三個都是固定的值,那麼cookie從哪來呢?看那張捕獲列表截圖,login下面那個記錄,咱們登陸失敗後它去獲取驗證碼了,咱們去看一下它的詳細信息

咱們能夠看到,在下載到圖片的同時,接收到了一個cookie,反正咱們的目的就是要模擬IE(模擬瀏覽器),因此咱們每次請求資源的時候,都把cookie保存下來,在下次請求的時候傳回去好了,也別管它須要不須要。

這樣post消息的話應該就能成功了。成功消息應該是這樣的:

{
    "Ret": 302,
    "ErrMsg": "/cgi-bin/indexpage?t=wxm-index&lang=zh_CN&token=1511255160",//這個token很重要
    "ShowVerifyCode": 0,
    "ErrCode": 0
}

若是不成功,本身多試試,看看上述的這些有哪些漏了。社區裏我見過一位同志用ASP寫的,我看了他po出來的全部代碼也沒有發現任何問題。。。。這種東西只有本身試,之前還好,能用wireshark抓包看的,如今是HTTPS的,抓出來的都是亂碼,很差對比了。

小結一下:

模擬登陸的步驟能夠是:不停的向   https://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN    post   username:賬號,pwd:t.md5(密碼.substr(0,16)),imgcode:"",f:"json",
或者先獲取驗證碼(同時保存cookie),而後發送賬號密碼驗證碼(帶上cookie)。關於收發cookie,C#我推薦用CookieContainer,VB的好像不用保存,只要在一個程序裏貌似對象本身會保存。

下節更精彩:獲取消息和發送消息。其實你要是會了我上面教的這兩招,本身也能夠分析了,根本不要看下面一篇。

相關文章
相關標籤/搜索