利用公眾平臺模擬登錄發(fā)送微信消息給指定用戶
看到微信公眾平臺,開始有點興奮,能做個機器人玩玩,隨后用Node.js寫了一個,覺得其實這沒什么意思,很快就覺得膩了,于是有了做發(fā)送微信接口的想法。首先要做的我們就要模擬公眾平臺的登陸。對于微信的這些lib,當然不能直接寫在routes里面,那要怎么辦呢?沒錯,就要封裝起來,方便復用。
你可以打開控制臺看到公眾平臺的登錄請求,還有所需的參數(shù),其中密碼它是用它本身的md5進行加密的,那么我們需要做的只是將它copy過來放在一個 helpers/wx/md5.js文件里就可以直接用了,以下是微信公眾平臺解析后格式化的js提交代碼:
- submit: function() {
- if (!n()) return;
- var e = d.getVal();
- t.post("/cgi-bin/login?lang=zh_CN", {
- username: e.account,
- pwd1: t.md5(e.password.substr(0, 15)),
- pwd2: t.md5(e.password),
- imgcode: f.data("isHide") ? "": e.verify,
- register: e.isRegister,
- f: "json"
- },
我們要建立一個login的方法:
- request = require 'superagent'
- require __basename + '/helpers/wx/md5'
- config = require __basename + '/config/config'
- module.exports =
- login: (fn) ->
- wx_usr = config.wx.user
- wx_pwd = md5 config.wx.pwd.substr(0, 16)
- request
- .post('http://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN')
- .type('form')
- .send(
- username: wx_usr
- pwd: wx_pwd
- imgcode : ''
- f : 'json'
- register : 0
- )
- .end (res) ->
- //在這里你已經(jīng)成功獲取cookie了
但是經(jīng)過分析我想你會發(fā)現(xiàn),這里的cookie其實并非你想要的cookie,因為它包含一些沒用的信息Path=,我們設置cookie的時候,事實上 是不能用直接設置這樣的cookie,應該是一個cookie里面不應該有其他的東西,而分號后面的path應該將它去掉,這里是返回的結果:
- [
- "mp_user=xxxxxx; Path=/",
- "mp_sid=NlJ2Tm5hb1NXRGxOU3V1MzF2a25tSFVWRHhTNkhwek1nMXlEOVZzMnZMUG1lZ29nSkdENGt3WlgwUjBJZnhydndYNkZSd0ZsaHRHdEozSHBIa3QwT3FWTmdXc3RxVFhYUDBCR3dnWkxIRWVvRlZObG15UC83SzU1aEZPZWpocU8=; Path=/"
- ]
以下是完整的login代碼:
- login: (fn) ->
- wx_usr = config.wx.user
- wx_pwd = md5 config.wx.pwd
- request
- .post('http://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN')
- .type('form')
- .send(
- username: wx_usr
- pwd1: wx_pwd
- pwd2: wx_pwd
- imgcode : ''
- f : 'json'
- )
- .end (res) ->
- cookie = ''
- for rs in res.header['set-cookie']
- cookie += rs.replace(/Path=\//g, '')
- fn null, cookie
在這里,我們已經(jīng)完成登錄的操作了,接下來,我們要做的是進行發(fā)送,在發(fā)送的時候,要把這個cookie設置在請求的地址中,接下來的代碼比較簡單:
- sender: (options, fn) ->
- msg = options.msg
- fakeid = options.fakeid
- unless msg
- fn error: 'missing msg'
- return
- unless fakeid
- fn error: 'missing fakeid'
- return
- psotParams =
- type: 1
- content: msg
- error: false
- tofakeid : fakeid
- ajax : 1
- request
- .post('http://mp.weixin.qq.com/cgi-bin/singlesend?t=ajax-response&lang=zh_CN')
- .type('form')
- .send(psotParams)
- .set('Cookie', options.cookie)
- .end (res) ->
- fn null, JSON.parse res.text
這里,我們已經(jīng)能完全發(fā)送了,因為返回的結果是一個json,所要最好先JSON.parse一下,里面的成功判斷大家可以加上,返回的接口有個叫ret的參數(shù),0為發(fā)送成功。
- {
- ret: "0",
- msg: "ok"
- }