上一章已经讲过如何用node.js发送微信消息了,,这一章为大家深入一点研究微信公众平台的机制.上一章的链接:http://cnodejs.org/topic/510889e9df9e9fcc58b69afe 首先我们要获取这个发送微信人的信息,当你用控制台查看微信的接口你会发现,要有一个Fakeid,那么我们首要要获取Fakeid,其他就好办了.首先我们先获取登录人的这个fakeid,防止后面还会用的.看了一下微信公众平台的所有api接口,,没有发现,那么我们只能去它的用户页面去拿,代码如下:
getFakeId: (options, fn) ->
request
.get('http://mp.weixin.qq.com/cgi-bin/userinfopage?t=wxm-setting&lang=zh_CN#')
.set('Cookie', options.cookie)
.end (res) ->
//这里是你的fakeid
//在拿到的结果里,实际上是一个页面的所有数据,那么我们只能用正则去匹配到所需的fakeid数据,下面是完整的代码:
getFakeId: (options, fn) ->
request
.get('http://mp.weixin.qq.com/cgi-bin/userinfopage?t=wxm-setting&lang=zh_CN#')
.set('Cookie', options.cookie)
.end (res) ->
fakeid = res.text.match(/FakeID : "(\d+)"/)[1]
fn null, fakeid
到了这一步,其实还没有成功,因为我们还没有拿到发送人的fakeid,不然怎么发微信消息给好友呢?于是,我们要去微信公众平台的用户管理页面拿到你所有的好友的fakeid,代码如下:
getFriendPage: (req, fn) ->
[@login](/user/login) (err, cookie)->
request
.get('http://mp.weixin.qq.com/cgi-bin/contactmanagepage?t=wxm-friend&lang=zh_CN&pagesize=&pageidx=0&type=0&groupid=0')
.set('Cookie', cookie)
.end (res) ->
//在这里res.text已经是用户管理页面的html代码了,但是并不会出来,一番查找后,发现是因为它里面的js在我们这里用是有跨域的问题的,知道问题就好办了,查找html它里面设置了document.domain:`document.domain = document.location.hostname.match(/[^\.]+\.com/)[0];`结果在控制台的输出是qq.com,看到这里,就证明我的判断是没有错误的.正则替换掉里面的hostname就ok了.完整代码如下:
getFriendPage: (req, fn) ->
[@login](/user/login) (err, cookie)->
request
.get('http://mp.weixin.qq.com/cgi-bin/contactmanagepage?t=wxm-friend&lang=zh_CN&pagesize=&pageidx=0&type=0&groupid=0')
.set('Cookie', cookie)
.end (res) ->
rs = res.text.replace(/document.location.hostname.match.*\[0\]/g, '"'+req.host+'"')
fn null, res.text
在这里,大家已经能拿到所有好友的fakeid了,但是不能用jsdom或者cheerio去拿,因为是整个页面加载后才出现好友的html的,至于解决方法我是用phantom.js解决的,具体代码我就不贴了,因为要涉及到安装什么的.因为研究微信公众平台时间也就几天,如果有更好的方法获取好友的fakeid请在下面留言. 到这一步,在这里已经拿到了fakeid了,我们可以去拿到这个微信好友的相关信息,在微信公众平台中,找到了如下接口,以下是代码:
getInfo: (fakeid, fn) ->
[@login](/user/login) (err, cookie) ->
request
.post(’http://mp.weixin.qq.com/cgi-bin/getcontactinfo?t=ajax-getcontactinfo&fakeid=‘+fakeid)
.type('form')
.set('Cookie', cookie)
.end (res) ->
fn null, JSON.parse res.text
调用代码打印以下结果:
{
FakeId: "xxxx",
NickName: "岳蒙",
ReMarkName: "",
Username: "xxxx",
Signature: "",
Country: "中国",
Province: "江西",
City: "南昌",
Sex: "1",
GroupID: "0",
Groups: [
{
GroupId: "0",
GroupName: "未分组"
},
{
GroupId: "1",
GroupName: "黑名单"
},
{
GroupId: "2",
GroupName: "星标组"
}
]
}
当然群发的话也挺简单的,我已经做好了就不发了,大家可以贴出自己的代码,互相讨论下. 微信发送到这里已经讲完,后面我会为大家准备一个node.js+express的OAuth2的一个认证流程的代码出来/
