智能绑定微信公众号功能是如何实现的

来源:互联网 发布:nginx listen 编辑:程序博客网 时间:2024/06/05 09:24
简单来说就是由程序模拟登陆到微信公众平台,抓取需要的内容(鉴权参数)后,回填到自己的系统中,来完成一种智能化的、无需用户干扰的功能,以提高用户体验。

基本思路:
  1. 通过用户提供的用户名、密码模拟登陆到公众平台
  2. 登陆后转到特定的页面来获取需要的内容
  3. 获取到内容后回填到系统,完成绑定

知道基本思路了,下面开始正式动工,在开始之前需要有一个前提:你是个程序猿(或者至少懂一门开发语言)。


需要用到哪些东西(以下以JAVA为例):

  1. Eclipse(开发工具)、JDK
  2. apache-httpclient及相关依赖包(模拟登陆、抓取内容)
  3. jsoup及相关依赖包(HTML解析神器)
  4. fast-json(解析登陆返回参数)
  5. firebug(firefox插件,用于跟踪登陆地址及登陆参数)

要模拟登陆,首先我们要知道登陆的地址以及登陆参数是什么,下图是用firebug跟踪到的数据


注意参数部分的“pwd”(密码),这不是我的密码啊(估计也没人把密码设置成这样吧?),那这是肿么了?

这其实是微信在登陆时把密码用javascript进行了加密,然后才进行参数传递(加密可另开一个问题,这里不做展开),有经验的人看到这个加密的密码后或许能大概猜出这是采用什么算法加密的,好像是MD5?于是我将原始密码加密后与其对比,果然是一样一样的,就是MD5!


好了,登陆地址、参数都清楚了,下面就是用httpclient模拟登陆

public String loginGetToken(String username, String pwd) throws Exception {// 登陆地址String loginUrl = "https://mp.weixin.qq.com/cgi-bin/login" +"?lang=zh_CN&username=%s&pwd=%s&imgcode=&f=json";loginUrl = String.format(loginUrl, username, EncryptUtils.toMD5Hex(pwd.getBytes()));PostMethod loginMethod = new PostMethod(loginUrl);// 这里要加引用,否则会报错 Referer errorloginMethod.addRequestHeader("Referer", "https://mp.weixin.qq.com/");httpClient.executeMethod(loginMethod);String resp = loginMethod.getResponseBodyAsString();loginMethod.releaseConnection();JSONObject respJson = JSON.parseObject(resp);// 从登陆成功的返回消息中提取token,备用String redirect = respJson.getString("redirect_url");String token = null;for (String s : redirect.split("&")) {if (s.startsWith("token")) {token = s.split("=")[1];break;}}return token;}

登陆成功后,会获取到token,而通过token就可以随意访问公众号的任何页面了。


下面通过上一步中获取的token来访问获取鉴权参数的页面以获取鉴权参数

public String[] getDevParams(String token) throws Exception {// 鉴权参数的页面地址String devUrl = "https://mp.weixin.qq.com/advanced/" +"advanced?action=dev&t=advanced/dev&token=%s&lang=zh_CN";devUrl = String.format(devUrl, token);GetMethod devMethod = new GetMethod(devUrl);httpClient.executeMethod(devMethod);// 抓取页面内容String resp = devMethod.getResponseBodyAsString();devMethod.releaseConnection();// 从返回的内容中提取鉴权参数Document html = Jsoup.parse(resp);Element developer_info = html.select(".developer_info").get(1);Elements frm_input_box = developer_info.select(".frm_input_box");String appid = frm_input_box.get(0).text();String appsecret = frm_input_box.get(0).text();return new String[] { appid, appsecret };}

至此,我们已经获取到需要的内容了,下一步就是将鉴权参数回填到系统中,完成绑定。

0 0
原创粉丝点击