js版微信聊天機器人——wechat-robot

Github: https://github.com/doterlin/wechat-robotnode

基於phantomjs和web端微信開發的聊天機器人。使用的微信帳號(即充當機器人的帳號)爲我的帳號,可自定義指令。python

效果

能夠指定一個微信帳號:
撩妹jquery

自定義指令不會交給AI處理:
自定義指令git

獨樂樂不如衆樂樂,能夠指定到羣聊上:
微信羣github

在後臺程序查看log:web

命令行輸出

使用場景

  • 微信智能回覆,監控,統計等ajax

  • 便捷查詢正則表達式

  • 娛(liao)樂(mei)npm

如何使用

1.安裝環境

下載好源碼並安裝如下環境:json

1.node.js
2.phantomjs
3.casperjs

2.配置

找到並配置好/config/const.js

//機器人名字
var ROBOT_NAME = "小強";

module.exports = {
    //微信web版地址
    'URL'          : 'https://wx.qq.com/',

    //機器人名字
    'ROBOT_NAME'   : ROBOT_NAME,
    
    //圖靈機器人apiKey和api地址
    //AI部分使用的是第三方機器人圖靈(http://www.tuling123.com/)
    //這裏只是示例,請你們自行到圖靈官網註冊並替換掉apikey免費版限5000次調用/天。有條件的同窗能夠付費支持下好產品
    'TURING_APIKEY': '99fecec3424d416898b91b0998e2b26a',
    'TURING_URL'   : 'http://www.tuling123.com/openapi/api',

    //鎖定的微信號備註,注意是備註;若是是羣聊則填羣聊名稱便可。
    //填寫的名稱請預先在手機微信上搜索確認搜索結果是否出如今第一個
    'TARGET_NICK'  : '二十投小分隊',

    //啓動時打招呼消息
    'HELLO_WORLD'  : '[閃電]' + ROBOT_NAME + '[閃電]已啓動...',

}

3.運行和登陸微信

安裝依賴和運行命令:

npm install
capserjs index.js

若是提示python找不到之類的話請安裝一下python並保證其能運行在全局

掃碼登陸微信
運行後看到以下提示時則掃一下彈出來的二維碼:

正在加載二維碼...
已保存二維碼,路徑:"static/img/qr.jpg".
正在使用默認軟件打開二維碼,請用手機微信掃一掃確認登陸 (若沒有請手動打開)

請在一分鐘內使用手機掃碼並確認登陸。出現登陸成功發送歡迎語提示後便可。這樣就完成了使用步驟。下面的章節是介紹如何去擴展功能。

指令和AI

在這以前你可能須要兩個方法:

message.send()

//路徑:src/utils/message.js
//回覆消息的方法message.send
//使用如:
var message = require('/src/utils/message');
...
casper.then(function(){
   message.send(this, '你好');
})

ajax() / ajax.get() / ajax.post() / ajax.getJSON()

//路徑:src/utils/ajax.js
//在聊天器調ajax的方法
//使用如:
var  ajax= require('/src/utils/ajax');
...
casper.then(function(){
   ajax(this, "http://example.com/getInfo", 'get', {uid: 123}, function(res){
        console.log(JSON.stringify(res));
    });
  
   //或者
   ajax.get(this, "http://example.com/getInfo", {uid: 123}, function(res){
        console.log(JSON.stringify(res));
    });

   //jsonp
   ajax.getJSON(this, "http://example.com/getInfo?calback=?", {uid: 123}, function(res){
        console.log(JSON.stringify(res));
   });
})

你能夠根據須要按如下方面擴充機器人的功能:

編寫指令
//你能夠寫一些指令而不是交給AI處理
//指令分爲精確匹配指令和模糊匹配指令

//-------------------------------------------------------------------
//精確匹配
//精確指令在`/src/directive/exact.js`下編寫。
//key是指令名稱,值是一個方法,接受參數msgContent(用戶發送的消息)和casperIns(casper實例),如:
//當對方發送'關閉'指令時程序提示並退出。
module.exports = {
    '關閉': function (msgContent, casperIns) {
        message.send(casperIns, '[玫瑰]感謝您的使用[玫瑰]\n\r([閃電]須要開啓請在控制檯啓動程序[閃電])');
        casperIns.echo('微信發出關閉口令,程序退出。')
        return casperIns.exit();
    }
}

//-------------------------------------------------------------------
//模糊匹配
//模糊匹配指令在`/src/directive/fuzzy.js`下編寫。
//接收參數前兩個同精確指令,第三個是當前的正則表達式;
//指令可單獨防在src/directive/explain下方便維護,如weather.js:
//匹配'地名 + 天氣',調用天氣api
var weather = require('./explain/weather');
module.exports = {
    '/天氣/g': weather 
}
//weather.js實現以下:
var ajax = require('../../utils/ajax');
var message = require('../../utils/message');

var formatWeather = function(local, weather) {
    //此方法對返回的json格式化,詳情請查看源碼
}

var weather = function(msgContent, casperIns, regex) {
    var local = msgContent.replace(/ |天氣/, '');
    var resource = 'http://wthrcdn.etouch.cn/weather_mini?city=' + encodeURIComponent(local);

    ajax.get(casperIns, resource, {}, function(res){
        var weather = JSON.parse(res);
        if (weather.status == 1000) {
            message.send(casperIns, formatWeather(local, weather));
        } else {
            message.send(casperIns, '未查找到相關天氣信息。請嘗試輸入格式如"廣州天氣"。')
        }
    });
   
}
module.exports = weather;
//-------------------------------------------------------------------
完善AI

這個我目前也沒研究。

調試

調試代碼時可將capserjs配置選像中的logLevel字段設爲info將會顯示更多phantomjslog,更多配置請移步casperjs文檔。

//路徑:config/casper.js
module.exports =  {
    clientScripts:  [
        'static/js/jquery.js'
    ],
    pageSettings: {
        loadImages: true,
        userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.14 Safari/537.36',
    },
    logLevel: "info", //here
    viewportSize: {width: 1300, height: 900},
    verbose: true,
    waitTimeout: 1000 * 60 * 60 * 24 * 365,
    onWaitTimeout: function(){
        console.log( 'waitFor*方法超時...' )
    }
}

另外,在執行各個步驟時會把瀏覽器截圖保存到/static/img,方便查看瀏覽器渲染狀況。好比每獲取到一條新消息時會截圖並覆蓋爲lastNewMsgContent.png

二次開發若方便請Fork貢獻給本Github,共同完善項目!

版本預告

下一版本更新但不限於如下內容:

1.支持綁定多個微信賬號
2.UI化控制檯(node.js web同步命令log及部分操做)3.支持圖片識別和回覆(如鬥圖)4.更多實用指令

相關文章
相關標籤/搜索