A chatbot developed based on
phantomjs
and WeChat on the web. The WeChat account used (that is, the account that acts as a robot) is a personal account and can be customized with instructions.
You can specify a WeChat account:
Custom instructions will not be handed over to AI for processing:
Having fun alone is not as good as having fun together. You can assign it to the group chat:
Check the log in the background program:
- WeChat intelligent reply, monitoring, statistics, etc.
- Convenient query
- Entertainment(liao)le(mei)
Download source code:
git clone https://github.com/doterlin/wechat-robot.git
Install the following environment:
1.node.js
2.phantomjs
3.casperjs
Find and configure /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 + '[闪电]已启动...',
}
Install dependencies and run commands:
npm install
casperjs index.js
If you are prompted that python找不到
, please install python and ensure that it can run globally.
Scan the QR code to log in to WeChat After running, when you see the following prompt, scan the QR code that pops up:
正在加载二维码...
已保存二维码,路径:"static/img/qr.jpg".
正在使用默认软件打开二维码,请用手机微信扫一扫确认登录 (若没有请手动打开)
Please use your mobile phone to scan the QR code and confirm login一分钟内
. After登录成功
and发送欢迎语
it is enough. This completes the usage steps. The following chapters introduce how to extend the functionality.
Before doing this you may need two methods:
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));
});
})
You can expand the functions of the robot in the following aspects as needed:
//你可以写一些指令而不是交给AI处理
//指令分为精确匹配指令和模糊匹配指令
//-------------------------------------------------------------------
//精确匹配
//精确指令在`/src/directive/exact.js`下编写。
//key是指令名称,值是一个方法,接受参数msgContent(用户发送的消息)和casperIns(casper实例),如:
//当对方发送'关闭'指令时程序提示并退出。
module.exports = {
'关闭': function (msgContent, casperIns) {
message.send(casperIns, '[玫瑰]感谢您的使用[玫瑰]nr([闪电]需要开启请在控制台启动程序[闪电])');
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;
//-------------------------------------------------------------------
I haven't researched this yet.
When debugging the code, you can set the logLevel
field in the capserjs
configuration selection to info
to display more phantomjs
logs. For more configurations, please visit the casperjs documentation.
//路径: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*方法超时...' )
}
}
In addition, browser screenshots will be saved to /static/img
when executing each step to facilitate viewing of browser rendering. For example, every time a new message is obtained, a screenshot will be taken and overwritten as lastNewMsgContent.png
.
Welcome to submit PR for secondary development and work together to improve the project!
Copyright (c) 2020 doterlin
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge , publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.