关于微信公众平台模拟登陆(无源码)

写于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的好像不用保存,只要在一个程序里貌似对象本身会保存。

下节更精彩:获取消息和发送消息。其实你要是会了我上面教的这两招,本身也能够分析了,根本不要看下面一篇。

相关文章
相关标签/搜索