文前 。raspberry 翻牆路由器文章已跳票。因為准備在gitshell上面先發,帶markdown。
微信公共平台 最近比較火。
它自身有簡單的自動回復功能(判斷條件成立則發送相應的文字、素材圖像、圖文等)。
感覺有點搞頭,於是去找api。官方的不可能有。最簡單的方法就是用firebug。
http request 和 response 都取下來。慢慢看,看懂就不用看下文了,看不懂的也不用看下文了,好吧我又糾結了,那還寫個毛線啊。
首先是,cookies的處理。直接把firebug里面的cookies字符串以header發過去qq服務器就可以了。$f = new SaeFetchurl();
$f->setMethod("get");
$f->setHeader("Cookie"," YOUR COOKIE STRING ");
- 取消息timeline:
http://mp.weixin.qq.com/cgi-bin/getmessage?t=wxm-message&lang=zh_CN&count=50&timeline=1&day=0
得到的html從DATA.List.msgList
到
})(WXM, window)
截取下來,就是timeline的json數據了!!!
單條消息item解析:(一大堆有的沒有的,有用的如下)
item["type"] 1為文本信息 // 3為音頻對講
item["fakeId"] 不知道含義,但是回復消息的時候就用這個id就行!
item["content"] 發過來的消息的文本
item["id"] – 取某條音頻消息的mp3數據時候有用 - 發消息:
http://mp.weixin.qq.com/cgi-bin/singlesend?t=ajax-response&lang=zh_CN
$f = new SaeFetchurl();
$f->setMethod("post");
$f->setHeader("Cookie"," YOUR COOKIE STRING ");
$f->setPostData(
array(
"ajax"=> "true" ,
"content" => "要發送給用戶的消息正文" ,
"error" => "false",
"tofakeid"=>"用戶的fakeid(在上面的接口的json數據里面有)",
"type"=>"1",
)
);
$ret=$f->fetch("http://mp.weixin.qq.com/cgi-bin/singlesend?t=ajax-response&lang=zh_CN");
if($f->errno() == 0) echo $ret;
else echo $f->errmsg(); - 取消息音頻(mp3格式,額,嚴格來說是mp2.5….)
$f->fetch("http://mp.weixin.qq.com/cgi-bin/getvoicedata?uin=*******&skey=******&msgid=".消息id(見上文)."&fileid=0")
直接取,得到的數據直接可以存成mp3文件,不知道為何微信為什么要這么做。。。
下篇將會介紹如何實現機器人和用戶在微信公共平台直接用語音來聊天:
科大訊飛語音雲SDK(聽寫、識別)(把linux SDK做成服務器,json REST) +
微信公共平台(本文提到api) +
Aiml人工智能聊天(中文支持處理)
今天初來乍到cnode.js,也應該貢獻貢獻.看到微信公眾平台,開始有點興奮,能做個機器人玩玩,,隨后用Node.js寫了一個,覺得其實這沒什么意思.很快就覺得膩了,於是有了做發送微信接口的想法.首先要做的我們就要模擬公眾平台的登陸.對於微信的這些lib,當然不能直接寫在routes里面,,那要怎么辦呢?沒錯,就要封裝起來,方便復用.你可以打開控制台看到公眾平台的登錄請求,還有所需的參數,其中密碼它是用它本身的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)->//在這里你已經成功獲取cookie了
但是經過分析我想你會發現,這里的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
在這里,我們已經完成登錄的操作了,接下來,我們要做的是進行發送,在發送的時候,要把這個cookie設置在請求的地址中,接下來的代碼比較簡單:(注意:這里面的fakeid是微信公眾平台的id,我們可以用控制台去微信公眾平台的用戶管理中查看,如何獲取用戶好友的fakeid,接下來一章我會講)
sender:(options, fn)-> msg = options.msg fakeid = options.fakeid unless msg fn error:'missing msg'returnunless 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
這里,我們已經能完全發送了,因為返回的結果是一個json,所要最好先JSON.parse一下,里面的成功判斷大家可以加上,返回的接口有個叫ret的參數,0為發送成功
{ ret:"0", msg:"ok"}
下一章,我會為大家深入講解怎么發送信息給好友,及獲取微信頭像等等技術
sender目前只能實現文字text的發送,但這並不完善,也可以實現圖文的發送,但是卻必須要上傳一張封面圖片,上傳后需要在發送圖文信息的時候把返回結果中的formId
拿到,http://mp.weixin.qq.com/cgi-bin/uploadmaterial?cgi=uploadmaterial&type=2&t=iframe-uploadfile&lang=zh_CN&formId=1
其中的參數type
是上傳的類型,語音和視頻是0,formId為null.上傳封面圖片接口如下:
uploadmaterial:(fn)->@login(err, cookie)-> request .post('http://mp.weixin.qq.com/cgi-bin/uploadmaterial?cgi=uploadmaterial&type=2&t=iframe-uploadfile&lang=zh_CN&formId=1').type('form').set('Cookie', cookie).end(res)-> results = JSON.parse(res.text).match(/formId, '(\d+)'/)[2] fn null, results
成功后,可以進行圖文消息的發送了.
send_appmsg:(options, fn)->@login(err, cookie)-> psotParams = error :false count :1AppMsgId:null title0 : options.title digest0 :'正文內容'# content0 : '<p>te<img src="http://www.e-research-solutions.com/system/cms/themes/default/img/top_l.png" /></p><p><span style="color:red">測試標題</span></p>' content0 : options.msg fileid0 :'10000001'#此處的id即為封面圖片的id preusername : options.username ajax :1 request .post('http://mp.weixin.qq.com/cgi-bin/operate_appmsg?sub=preview&t=ajax-appmsg-preview').type('form').set('Cookie', cookie).send(psotParams).end(res)-> results = JSON.parse res.text fn null, results['msg']