大家所熟知的智能聊天机器人,比如: 微软小冰、Apple Siri、Google Now、IBM Watson等。微信自动回复、微信服务号里的客服Bot也都算是简单的实例。
开源的ChatOps机器人:
1. Hubot:CoffeeScipt编写
2. Lita:Ruby编写
3. Errbot:Python编写
So, What is ChatOps? And How do I Get Started?
12+ Frameworks to Build ChatOps Bots
Hubot是由Github开发的开源聊天机器人,基于Node.js采用CoffeeScript编写。
Hubot https://hubot.github.com/
Hubot Scripts https://github.com/hubot-scripts
Hubot Control https://github.com/spajus/hubot-control
可以借助Hubot开发Chatbot来自动化的完成想要一切自动化任务,比如:
-运维自动化(编译部署代码、重启机器,监控服务器运行情况,自动修复Bug等)
-外部服务交互(管理Redmine、集成Jenkins、监视Zabbix等)
-定时获取天气预报
-随机订餐
-聊天机器人等等。
官方文档里有详细的使用说明, https://hubot.github.com/docs/,这里只做一个摘要。
Hubot Scripts里有大量的现成脚本可以用,也是自己编写脚本的最好sample。
(一)安装
运行Hubot需要以下软件支持:
- Node.js
- Redis 默认存贮数据
- CoffeeScript
- Yeoman
- generator-hubot 生成Hubot骨架工程
引用
C:\Users\rensanning>node -v
v0.12.8
C:\Users\rensanning>npm -v
2.14.9
C:\Users\rensanning>npm install -g yo generator-hubot
C:\Users\rensanning>npm list -g generator-hubot yo
(二)创建自己的bot
引用
C:\Users\rensanning>cd d:/
D:\>mkdir hubotsample
D:\>cd hubotsample
D:\hubotsample>yo hubot
? Owner RenSanNing <
[email protected]>
? Bot name okbot
? Description A sample hubot
? Bot adapter campfire
项目结构:
- bin/ 运行脚本
- node_modules 应用的包文件
- scripts 存放自定义脚本
- external-scripts.json 应用的外部脚本
- hubot-scripts.json *** 该文件已经无用,可以删除
- package.json 项目全局配置信息
(三)运行bot
采用默认的shell adapter
引用
D:\hubotsample>bin\hubot -a shell
引用
okbot> help
usage:
history
exit, \q - close shell and exit
help, \? - print this usage
clear, \c - clear the terminal screen
引用
okbot> okbot help
okbot> Shell: okbot adapter - Reply with the adapter
okbot animate me <query> - The same thing as `image me`, except adds a few parameters to try to return an animated GIF instead.
okbot echo <text> - Reply back with <text>
okbot help - Displays all of the help commands that Hubot knows about.
okbot help <query> - Displays all help commands that match <query>.
okbot image me <query> - The Original. Queries Google Images for <query> and returns a random top result.
okbot map me <query> - Returns a map view of the area returned by `query`.
okbot mustache me <url|query> - Adds a mustache to the specified URL or query result.
okbot ping - Reply with pong
okbot pug bomb N - get N pugs
okbot pug me - Receive a pug
okbot the rules - Make sure hubot still knows the rules.
okbot time - Reply with current time
okbot translate me <phrase> - Searches for a translation for the <phrase> and then prints that bad boy out.
okbot translate me from <source> into <target> <phrase> - Translates <phrase> from <source> into <target>. Both <source> and <target> are optional
ship it - Display a motivation squirrel
okbot ping
okbot> PONG
okbot echo 你好!
okbot> 你好!
okbot time
okbot> Server time is: Fri Sep 30 2016 11:05:24 GMT+0800 (中国 (标准时间))
***所有的输入都会被记录在.hubot_history文件里。
(四)编写脚本
编写的自定义脚本要放在scripts中,可以是.coffee或.js文件。
scripts/hello.coffee
# Description:
# This is a test.
#
# Commands:
# okbot helo - Reply with world!
module.exports = (robot) ->
robot.respond /hello/i, (msg) ->
msg.send "world!"
引用
okbot hello
okbot> world!
因为Hubot要解析脚本文件,提供help帮助,所以脚本文件开头的注释是规范的,
第一行必须是注释“# Description:”(其他的可以没有),否则会有警告:
引用
hello.coffee is using deprecated documentation syntax
Hubot同时也支持js,比如:
scripts/hello2.js
// Description:
// This is a test2.
// Commands:
// okbot helo - Reply with world!
module.exports = function(robot) {
robot.respond(/hi/i, function(msg){
msg.send("world2!");
});
}
引用
okbot hi
okbot> world2!
Respond vs Hear
- respond只监听直接发送给机器人的消息,需要指定机器人名称
- hear可以监听任何消息
引用
MYHUBOT xxx
myhubot xxx
@myhubot xxx
myhubot: xxx
Send vs Reply
- send会将消息发送给所有人
- reply会将消息回复给指定的人
Random
msg对象有一个random方法,可以从之后的数组对象中随机提取一个元素
引用
msg.send msg.random arrayObject
hubot Scripts Explained
http://theprogrammingbutler.com/blog/archives/2011/10/28/hubot-scripts-explained/
(五)安装脚本
Hubot 有一大堆现成的脚本,可以集成各种服务。
引用
将package-name添加到external-scripts.json
引用
"hubot-plusplus"
引用
okbot> ruby++
okbot> ruby has 1 point
okbot> java--
okbot> java has -1 points
(六)hubot-script实例
定时脚本
scripts/cron.coffee
cronJob = require('cron').CronJob
module.exports = (robot) ->
send = (room, msg) ->
response = new robot.Response(robot, {user : {id : -1, name : room}, text : "none", done : false}, [])
response.send msg
new cronJob('0 * * * * *', () ->
currentTime = new Date
send '#your-channel-name', "current time is #{currentTime.getHours()}:#{currentTime.getMinutes()}."
).start()
引用
D:\hubotsample>npm install cron --save
D:\hubotsample>bin\hubot -a shell
http请求
scripts/googleGEO.coffee
module.exports = (robot) ->
robot.hear /location (.*)/, (msg) ->
request = robot.http("https://maps.googleapis.com/maps/api/geocode/json")
.query(address: msg.match[1])
.get()
request (err, res, body) ->
json = JSON.parse body
location = json['results'][0]['geometry']['location']
msg.send "#{location['lat']}, #{location['lng']}"
引用
okbot> location Beijing
okbot> 39.904211, 116.407395
抓取数据(request, cheerio)
scripts/title.coffee
request = require 'request'
cheerio = require 'cheerio'
module.exports = (robot) ->
robot.respond /title (.*)/i, (msg) ->
url = msg.match[1]
options =
url: url
timeout: 2000
headers: {'user-agent': 'node title fetcher'}
request options, (error, response, body) ->
$ = cheerio.load body
title = $('title').text().replace(/\n/g, '')
msg.send(title)
引用
D:\hubotsample>npm install --save request
D:\hubotsample>npm install --save cheerio
D:\hubotsample>bin\hubot -a shell
okbot> okbot title http://github.com
okbot> How people build software · GitHub
okbot> okbot title http://www.google.com
okbot> Google
http应答(httpd)
scripts/version.coffee
module.exports = (robot) ->
robot.router.get "/version", (req, res) ->
res.end robot.version
访问http://localhost:8080/version。
默认端口是8080,可以修改环境变量:export PORT=8080
Hubot大量依赖环境变量来配置脚本,所以一般都做一个启动脚本:
引用
#!/bin/sh
export HUBOT_ENV_TEST_VAR=""
bin/hubot -a twitter -n testbot
引用
@echo off
SET HUBOT_ENV_TEST_VAR=""
bin\hubot.cmd -a twitter -n testbot
脚本中的使用:
引用
TEST_VAR = process.env.HUBOT_ENV_TEST_VAR
捕获所有未处理信息
scripts/catchAll.coffee
module.exports = (robot) ->
robot.catchAll (res) ->
res.send "Nothing Found:#{res.message.text}"
hubotスクリプトの書き方とサンプル集
http://blog.fumiz.me/2012/08/05/hubot-irc-bot-script/
编写 Hubot Scripts
http://scarletsky.github.io/2016/05/02/write-your-own-hubot-scripts/
(七)配置Adapters
hubot默认提供两种adapter:shell、campfile
shell用于开发调试,campfile以外的Chat Service也都有开源的实现。
微信adapter: https://github.com/KasperDeng/Hubot-WeChat
主要机制是hack网页版微信协议,先用手机登录微信帐号,然后模拟网页版微信登录,这样就可以接受微信消息了。
- npm install hubot-weixin --save
- 手机端登录微信
- 打开网页微信:web.weixin.qq.com
- 手机扫描登录
- 控制台查看如下信息 /node_modules/hubot-weixin/config.yaml
cookie: Uin: Sid: Skey: DeviceID:
- bin\hubot.cmd -n bot -l / -a weixin
参考:
正在吃掉世界的Bot:它从哪里来,会到哪里去?
Hubot:来自GitHub的聊天机器人
GitHub社謹製! bot開発・実行フレームワーク「Hubot」
TDD Hubot scripts with gulp+mocha
在Skype中使用Hubot
http://qiita.com/bouzuya/items/c7d0ad80c357aab6b696