chatops

【ChatOps系列】ChatOps简介

要说 ChatOps 就不得不说 DevOps,DevOps 是来源于 Development 和 Operations 的一个组合词,顾名思义,是一系列过程、方法与系统的统称,旨在促进开发、测试和运维人员之间的沟通与协作。简单来说,是通过引入一系列的「工具」,通过三种不同角色的开发成员间的「协作」而实现的一种「自动化」的工作模式。这种工作方式带来的好处显而易见:

  • 实现持续快速交付
  • 能够降低人力成本

但很大程度上,DevOps 更多是指开发群体之间的一种协作模式(通常也在开发人员中实施),随着全行业的发展和人力成本的攀升,在团队所有角色间贯通的升级版「DevOps」逐渐登场,也就是我们将要重点介绍的 ChatOps。

devops

ChatOps介绍

ChatOps 的历史相对短暂,2013 年 GitHub 内部最早开始推行 ChatOps,希望能以聊天的方式更容易更快速的去完成 DevOps 承载的工作。

ChatOps 以聊天室,即沟通平台为中心,通过一系列的机器人去对接后台的各种服务,工作人员只需要在聊天窗口中与机器人对话,即可与后台服务进行交互,整个工作的展开就像是使唤一个智能助手那样简单自然。

chatops_devops

ChatOps 站在巨人的肩膀上发展,也为工作带来了显而易见的好处:

  • 公开透明。所有的工作消息都在同一个聊天平台中沉淀并公开给所有相关成员,消除沟通壁垒,工作历史有迹可循,团队合作更加顺畅。
  • 上下文共享。减少因工作台切换等对消息的截断,保证消息的完整性,让工作承接有序,各角色,各工具都成为完成工作流中的一环,打造真正流畅的工作体验。
  • 移动友好。只需要在前台与预设好的机器人对话即可完成与后台工具、系统的交互,在移动环境下无需再与众多复杂的工具直接对接,大大提升移动办公的可行性。
  • DevOps 文化打造。用与机器人对话这种简单的方式降低 DevOps 的接受门槛,让这种自动化办公的理念更容易的扩展到团队的每一个角落。

chatops

ChatOps 主要由三个部分构成:聊天室(控制中心)、机器人(连接中心)、基础设施,基础设施主要是支撑我们业务运行的各种服务与工具,在构建 ChatOps 时主要需要选择聊天室和机器人,国外早期的工作沟通工具 HipChat,新秀 Slack 都是作为 ChatOps 承载平台的好选择,在中文的环境下,则可以选择 BearyChat(倍洽)等等。

聊天室选择:

  • 功能完备
  • 操作交互友好
  • 多平台支持
  • API 丰富
  • 三方工具支持丰富
  • 机器人支持程度

机器人选择:

  • 功能完备
  • 易扩展(我们可能需要根据基础设施编写大量机器人扩展)
  • 编程语言熟悉(因为我们需要编写扩展)
  • 开源扩展丰富(可以极大减少开发工作量)

聊天室主要有:Slack、HipChat、BearyChat(倍洽)、Rocket.Chat、钉钉(机器人支持程度不够,不太支持)。机器人主要有:Hubot(javascript/CoffeeScript)、Lita(Ruby),Errbot(python)。

机器人我推荐使用 Hubot,后面所有的实验都使用 Hubot 展开。 GitHub 团队内部实现的 ChatOps 与一个叫做 Hubot 的机器人框架密切相关,Hubot 提供很多聊天机器人所需的基础设施,借助 Hubot 框架能比较方便的和自己编写的功能或自己的系统对接。目前,Hubot 已经发展出了较好的生态圈,有很多开源插件可以借用。

chatops

ChatOps实现

本系列专题主要讲两种实现,一种是基于 GitHub+Hubot+Slack 实现,一种基于开源体系的 GitLab + Hubot + Rocket.Chat,它们功能完善且有良好的扩展及丰富的API,只要爱倒腾一定会有意想不到的收获。

GitHub 体系:

  • slack 聊天室
  • Hubot 机器人
  • GitHub 代码管理
  • Travis CI 自动化测试
  • heaven 自动部署
  • hubot-deploy 连接 Hubot 与 heaven

GitLab 体系:

  • Recket.chat 聊天室
  • Hubot 机器人
  • GitLab 代码管理
  • GitLab CI 自动化测试
  • hubot-gitlab-deploy 自动化部署(计划重构中)
  • fabric-deploy-script 基于配置的 fabric 自动部署实现 (计划开源中)

本系列会介绍各种设计服务安装、配置,以及各种服务组件之间连接配置等,同时会涉及到项目配置管理、密钥管理等相关知识。

计划

本系列主要涉及 ChatOps 环境搭建、工具配置,以及项目的持续集成、持续部署的实现,持续部署过程会涉及到密钥管理、配置管理等等。

本系列计划一至两周一篇文章,每篇文章介绍一个点,两种体系都会讲到,大约20~30篇文章,优先讲解开源体系的 GitLab 篇。

在这期间会开发相关机器人脚本及相关服务组件,可以形成项目会发布在 GitHub 上,不能形成项目的会在文章中,最后所有实验相关代码均可在 GitHub 上 chatops_experiment 中获取。

测试中需要自动部署的项目会单独存储在一个账号/组织下面,具体详见每个章节。

Python 的 ChatOps 库:Opsdroid 和 Errbot

学习一下 Python 世界里最广泛使用的 ChatOps 库:每个都能做什么,如何使用。

ChatOps 是基于会话导向而进行的开发。其思路是你可以编写能够对聊天窗口中的某些输入进行回复的可执行代码。作为一个开发者,你能够用 ChatOps 从 Slack 合并拉取请求,自动从收到的 Facebook 消息中给某人分配支持工单,或者通过 IRC 检查开发状态。

在 Python 世界,最为广泛使用的 ChatOps 库是 Opsdroid 和 Errbot。在这个月的 Python 专栏,让我们一起聊聊使用它们是怎样的体验,它们各自适用于什么方面以及如何着手使用它们。

Opsdroid

Opsdroid 是一个相对年轻的(始于 2016)Python 开源聊天机器人库。它有着良好的开发文档,不错的教程,并且包含能够帮助你对接流行的聊天服务的插件。

它内置了什么

库本身并没有自带所有你需要上手的东西,但这是故意的。轻量级的框架鼓励你去运用它现有的连接器(Opsdroid 所谓的帮你接入聊天服务的插件)或者去编写你自己的,但是它并不会因自带你所不需要的连接器而自贬身价。你可以轻松使用现有的 Opsdroid 连接器来接入:

  • 命令行
  • Cisco Spark
  • Facebook
  • GitHub
  • Matrix
  • Slack
  • Telegram
  • Twitter
  • Websocket

Opsdroid 会调用使聊天机器人能够展现它们的“技能”的函数。这些技能其实是异步 Python 函数,并使用 Opsdroid 叫做“匹配器”的匹配装饰器。你可以设置你的 Opsdroid 项目,来使用同样从你设置文件所在的代码中的“技能”。你也可以从外面的公共或私人仓库调用这些“技能”。

你同样可以启用一些现存的 Opsdroid “技能”,包括 seen —— 它会告诉你聊天机器人上次是什么时候看到某个用户的,以及 weather —— 会将天气报告给用户。

最后,Opdroid 允许你使用现存的数据库模块设置数据库。现在 Opdroid 支持的数据库包括:

  • Mongo
  • Redis
  • SQLite

你可以在你的 Opdroid 项目中的 configuration.yaml 文件设置数据库、技能和连接器。

Opsdroid 的优势

Docker 支持:从一开始 Opsdroid 就打算在 Docker 中良好运行。在 Docker 中的指导是它 安装文档 中的一部分。使用 Opsdroid 和 Docker Compose 也很简单:将 Opsdroid 设置成一种服务,当你运行 docker-compose up 时,你的 Opsdroid 服务将会开启你的聊天机器人也将就绪。

version: "3"

services:
  opsdroid:
    container_name: opsdroid
    build:
      context: .
      dockerfile: Dockerfile

丰富的连接器: Opsdroid 支持九种像 Slack 和 Github 等从外部接入的服务连接器。你所要做的一切就是在你的设置文件中启用那些连接器,然后把必须的口令或者 API 密匙传过去。比如为了启用 Opsdroid 以在一个叫做 #updates 的 Slack 频道发帖,你需要将以下代码加入你设置文件的 connectors 部分:

- name: slack
    api-token: "this-is-my-token"
    default-room: "#updates"

在设置 Opsdroid 以接入 Slack 之前你需要添加一个机器人用户

如果你需要接入一个 Opsdroid 不支持的服务,在文档里有有添加你自己的连接器的教程。

相当不错的文档: 特别是对于一个在积极开发中的新兴库来说,Opsdroid 的文档十分有帮助。这些文档包括一篇带你创建几个不同的基本技能的教程。Opsdroid 在技能连接器数据库,以及匹配器方面的文档也十分清晰。

它所支持的技能和连接器的仓库为它的技能提供了富有帮助的示范代码。

自然语言处理: Opsdroid 的技能里面能使用正则表达式,但也同样提供了几个包括 Dialogflowluis.aiRecast.AI 以及 wit.ai 的 NLP API。

Opsdroid 可能的不足

Opsdroid 对它的一部分连接器还没有启用全部的特性。比如说,Slack API 允许你向你的消息添加颜色柱、图片以及其他的“附件”。Opsdroid Slack 连接器并没有启用“附件”特性,所以如果那些特性对你来说很重要的话,你需要编写一个自定义的 Slack 连接器。如果连接器缺少一个你需要的特性,Opsdroid 将欢迎你的贡献。文档中可以使用更多的例子,特别是对于预料到的使用场景。

示例用法

from opsdroid.matchers import match_regex
import random


@match_regex(r'hi|hello|hey|hallo')
async def hello(opsdroid, config, message):
    text = random.choice(["Hi {}", "Hello {}", "Hey {}"]).format(message.user)
    await message.respond(text)

hello/__init__.py

connectors:
  - name: websocket

skills:
  - name: hello
    repo: "https://github.com/<user_id>/hello-skill"

configuration.yaml

Errbot

Errbot 是一个功能齐全的开源聊天机器人。Errbot 发行于 2012 年,并且拥有人们从一个成熟的项目能期待的一切,包括良好的文档、优秀的教程以及许多帮你连入现有的流行聊天服务的插件。

它内置了什么

不像采用了较轻量级方式的 Opsdroid,Errbot 自带了你需要可靠地创建一个自定义机器人的一切东西。

Errbot 包括了对于本地 XMPP、IRC、Slack、Hipchat 以及 Telegram 服务的支持。它通过社区支持的后端列出了另外十种服务。

Errbot 的优势

良好的文档: Errbot 的文档成熟易读。

动态插件架构: Errbot 允许你通过和聊天机器人交谈安全地安装、卸载、更新、启用以及禁用插件。这使得开发和添加特性十分简便。感谢 Errbot 的颗粒性授权系统,出于安全意识这所有的一切都可以被锁闭。

当某个人输入 !help,Errbot 使用你的插件的文档字符串来为可获取的命令生成文档,这使得了解每行命令的作用更加简便。

内置的管理和安全特性: Errbot 允许你限制拥有管理员权限的用户列表,甚至细粒度访问控制。比如说你可以限制特定用户或聊天房间访问特定命令。

额外的插件框架: Errbot 支持钩子、回调、子命令、webhook、轮询以及其它更多特性。如果那些还不够,你甚至可以编写动态插件。当你需要基于在远程服务器上的可用命令来启用对应的聊天命令时,这个特性十分有用。

自带测试框架: Errbot 支持 pytest,同时也自带一些能使你简便测试插件的有用功能。它的“测试你的插件”的文档出于深思熟虑,并提供了足够的资料让你上手。

Errbot 可能的不足

以 “!” 开头: 默认情况下,Errbot 命令发出时以一个惊叹号打头(!help 以及 !hello)。一些人可能会喜欢这样,但是另一些人可能认为这让人烦恼。谢天谢地,这很容易关掉。

插件元数据 首先,Errbot 的 Hello World 插件示例看上去易于使用。然而我无法加载我的插件,直到我进一步阅读了教程并发现我还需要一个 .plug 文档,这是一个 Errbot 用来加载插件的文档。这可能比较吹毛求疵了,但是在我深挖文档之前,这对我来说都不是显而易见的。

示例用法

import random
from errbot import BotPlugin, botcmd

class Hello(BotPlugin):

    @botcmd
    def hello(self, msg, args):
        text = random.choice(["Hi {}", "Hello {}", "Hey {}"]).format(message.user)
        return text

hello.py

[Core]
Name = Hello
Module = hello

[Python]
Version = 2+

[Documentation]
Description = Example "Hello" plugin

hello.plug

你用过 Errbot 或 Opsdroid 吗?如果用过请留下关于你对于这些工具印象的留言。

开发Hubot聊天机器人

大家所熟知的智能聊天机器人,比如:微软小冰、Apple Siri、Google Now、IBM Watson等。微信自动回复、微信服务号里的客服Bot也都算是简单的实例。聊天机器人(Dialog System)主要实现方式有:基于人工模板(比如AIML)、基于搜索技术(比如ElasticSearch)、基于深度学习。从零实现这样的系统是很复杂的。

开源的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 <rensanning@gmail.com>
? Bot name okbot
? Description A sample hubot
? Bot adapter campfire

默认提供了campfire和shell的adapter,其他的需要通过npm下载hubot-<AdapterName>。
也可以通过参数直接生成:

引用
yo hubot –owner=rensanning@gmail.com –name=foobot –description=”Foo Bot” –adapter=shell

项目结构:

  • bin/ 运行脚本
  • node_modules 应用的包文件
  • scripts 存放自定义脚本
  • external-scripts.json 应用的外部脚本
  • hubot-scripts.json *** 该文件已经无用,可以删除
  • package.json 项目全局配置信息

(三)运行bot

引用
D:\hubotsample>bin\hubot -v
2.19.0
D:\hubotsample>bin\hubot -h
Usage hubot [options]

Available options:
-a, –adapter ADAPTER   The Adapter to use
-c, –create PATH       Create a deployable hubot
-d, –disable-httpd     Disable the HTTP server
-h, –help              Display the help information
-l, –alias ALIAS       Enable replacing the robot’s name with alias
-n, –name NAME         The name of the robot in chat
-r, –require PATH      Alternative scripts path
-t, –config-check      Test hubot’s config to make sure it won’t fail at startup
-v, –version           Displays the version of hubot installed

-a 指定Adapter(默认是shell)
-d 关闭HTTP服务(默认是开启的)
-c deprecated 使用yeoman

采用默认的shell adapter

引用
D:\hubotsample>bin\hubot

指定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

Js代码  收藏代码
  1. # Description:
  2. #   This is a test.
  3. #
  4. # Commands:
  5. #   okbot helo – Reply with world!
  6. module.exports = (robot) ->
  7.   robot.respond /hello/i, (msg) ->
  8.     msg.send “world!”

 

引用
okbot hello
okbot> world!

因为Hubot要解析脚本文件,提供help帮助,所以脚本文件开头的注释是规范的,
第一行必须是注释“# Description:”(其他的可以没有),否则会有警告:

引用
hello.coffee is using deprecated documentation syntax

Hubot同时也支持js,比如:
scripts/hello2.js

Js代码  收藏代码
  1. // Description:
  2. //   This is a test2.
  3. // Commands:
  4. //   okbot helo – Reply with world!
  5. module.exports = function(robot) {
  6.     robot.respond(/hi/i, function(msg){
  7.         msg.send(“world2!”);
  8.     });
  9. }

 

引用
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 有一大堆现成的脚本,可以集成各种服务。

引用
D:\hubotsample>npm search hubot-scripts github
D:\hubotsample>npm install –save hubot-plusplus
hubot-plusplus@1.3.0 node_modules\hubot-plusplus
├── underscore@1.8.3
├── clark@0.0.6
└── coffee-script@1.6.3

将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

Js代码  收藏代码
  1. cronJob = require(‘cron’).CronJob
  2. module.exports = (robot) ->
  3.   send = (room, msg) ->
  4.     response = new robot.Response(robot, {user : {id : -1, name : room}, text : “none”, done : false}, [])
  5.     response.send msg
  6.   new cronJob(‘0 * * * * *’, () ->
  7.     currentTime = new Date
  8.     send ‘#your-channel-name’“current time is #{currentTime.getHours()}:#{currentTime.getMinutes()}.”
  9.   ).start()

 

引用
D:\hubotsample>npm install cron –save
D:\hubotsample>bin\hubot -a shell

http请求
scripts/googleGEO.coffee

Js代码  收藏代码
  1. module.exports = (robot) ->
  2.   robot.hear /location (.*)/, (msg) ->
  3.     request = robot.http(“https://maps.googleapis.com/maps/api/geocode/json”)
  4.                    .query(address: msg.match[1])
  5.                    .get()
  6.     request (err, res, body) ->
  7.       json = JSON.parse body
  8.       location = json[‘results’][0][‘geometry’][‘location’]
  9.       msg.send “#{location[‘lat’]}, #{location[‘lng’]}”

 

引用
okbot> location Beijing
okbot> 39.904211, 116.407395

抓取数据(request, cheerio)
scripts/title.coffee

Js代码  收藏代码
  1. request = require ‘request’
  2. cheerio = require ‘cheerio’
  3. module.exports = (robot) ->
  4.   robot.respond /title (.*)/i, (msg) ->
  5.     url = msg.match[1]
  6.     options =
  7.       url: url
  8.       timeout: 2000
  9.       headers: {‘user-agent’‘node title fetcher’}
  10.     request options, (error, response, body) ->
  11.       $ = cheerio.load body
  12.       title = $(‘title’).text().replace(/\n/g, )
  13.       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

Js代码  收藏代码
  1. module.exports = (robot) ->
  2.   robot.router.get “/version”, (req, res) ->
  3.     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

Js代码  收藏代码
  1. module.exports = (robot) ->
  2.   robot.catchAll (res) ->
  3.     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/

(七)自定义Adapter
hubot默认提供两种adapter:shell、campfile
shell用于开发调试,campfile以外的Chat Service也都有开源的实现。

Adapter基本构成

新建文件 \node_modules\hubot\src\adapters\SampleAdapter.coffee

Js代码  收藏代码
  1. class SampleAdapter extends Adapter
  2.   send: (envelope, strings…) ->
  3.     @robot.logger.info “Send”
  4.   run: ->
  5.     @robot.logger.info “Run”
  6. exports.use = (robot) ->
  7.   new SampleAdapter robot

修改文件 \node_modules\hubot\src\robot.coffee

引用
HUBOT_DEFAULT_ADAPTERS = [
‘campfire’
‘SampleAdapter’
‘shell’
]

启动bot

引用
D:\hubotsample>bin\hubot -a SampleAdapter

* 所有的Adapter必须继承自Adapter
* Adapter中最重要的两个方法是send和run,其他方法比如emote、reply、topic、play等在特定场景下才需要。
* run方法是bot启动时执行
* send方法是回复信息时执行
* 父类 adapter.coffee 里有详细的方法说明 https://github.com/github/hubot/blob/master/src/adapter.coffee
* Adapter名必须是:src\adapters里的文件名 & robot.coffee的HUBOT_DEFAULT_ADAPTERS里定义的名 或者和 hubot-#{adapter} 一致

Chat服务的Adapter

Js代码  收藏代码
  1. {Adapter, TextMessage} = require ‘hubot’
  2. {EventEmitter} = require ‘events’
  3. class MyChatAdapter extends Adapter
  4.   send: (envelope, strings…) ->
  5.     @bot.send str for str in strings
  6.   run: ->
  7.     options =
  8.       token:   process.env.HUBOT_CHAT_TOKEN
  9.       rooms:   process.env.HUBOT_CHAT_ROOMS
  10.       account: process.env.HUBOT_CHAT_ACCOUNT
  11.     bot = new MyChatStreaming options, @robot
  12.     bot.on ‘message’, (userId, userData, message) ->
  13.       user = @robot.brain.userForId userId, userData
  14.       @receive new TextMessage user, message
  15.     bot.listen()
  16. exports.use = (robot) ->
  17.   new MyChatAdapter robot
  18. class MyChatStreaming extends EventEmitter
  19.   constructor: (options, @robot) ->
  20.     @token         = options.token
  21.     @rooms         = options.rooms.split(“,”)
  22.     @account       = options.account
  23.   send: (message) ->
  24.     # Send data to your chat service
  25.   listen: ->
  26.     # Get messge data from chat service
  27.     # @emit ‘message’, user, message

具体可以参考: https://github.com/github/hubot/blob/master/src/adapters/campfire.coffee

扩展robot的方法:
\node_modules\hubot\src\adapters\incircle.coffee

Java代码  收藏代码
  1. class TestXXX extends Adapter
  2.   constructor: (robot) ->
  3.     super robot
  4.     robot.hearXXX = (options, callback) ->
  5.       robot.listeners.push new TextListener(robot, “@XXXmessage”, options, callback)

\scripts\testbot.coffee

Java代码  收藏代码
  1. module.exports = (robot) ->
  2.   robot.hearXXX (msg) ->
  3.     msg.send “#{JSON.stringify msg}”

(八)微信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

【初心者向け】AWS+Hubot+Slackで自動返信するBOTの作り方(後半)

AWS+Hubot+Slackを使ってBOTを作る方法(後半)を投稿します:)

前半はこちら
http://qiita.com/ShirakawaYoshimaru/items/dc79b9548a43f9c6fe9f

構成はこんな感じ
(前半)1.EC2サーバー作成のための下準備
(前半)2.EC2サーバーを立てる
(後半)3.SlackのBOT設定
(後半)4.EC2サーバーに入ってHubotを作る
(後半)5.Tips


間違いやアドバイス等があったら気軽にコメントください><
では始めて行きます 🙂

3.SlackのBOT設定

Slackに追加するBOTは、最初にSlackに登録し、チャンネルに招待する必要があります。

3-1.BOTをSlackチームに登録する

このurlを開いてくか、
https://slack.com/apps

もしくは、
Slackのチーム名をクリックして、メニューを開いて「Apps & integrations」をクリックしてください。
Slack 2016-04-15 10-59-33.jpg

ブラウザでこんな画面が開きます。
検索バーに「Hubot」を入力して検索しましょう。Hubot導入画面に遷移できます 🙂
App Directory | Slack 2016-04-15 11-05-07.jpg

Hubot導入画面でHubotをインストール(追加)したいチームを選択します。
Hubot | Slack 2016-04-15 11-12-41.jpg

チームの選択ができたら、まずはBotの名前を入力します。
Botの名前は小文字/数字/ドット/アンダーバー/スラッシュしか使えないので注意です。
(大文字は使えません)
Hubot | tech_salon Slack 2016-04-15 11-18-45.jpg

次の画面に行くと、Hubotの詳細設定ができるようになります。
BOTのICONはこの画面で変更できます。
ここに後で使う API TOKEN があるので必ずメモっておきましょう。
TOKENをメモったら、画面下部にある Save Integrationボタン を押してBot情報を保存します。 (Save Integrationボタンを選択しても画面は特に変わりません)
Hubot | tech_salon Slack 2016-04-15 11-24-08.jpg

3-2.BOTをチームのチャンネルに招待する

BOTをチャンネルに招待しましょう。
Slackに戻り、画面右上のメニューボタンを選択して Team Directory を選択します。
Slack 2016-04-15 11-37-25.jpg

Teamに入っているメンバー全員の一覧が見れます。先ほど追加したBOTを選択しましょう。
Slack 2016-04-15 11-38-43.jpg

BOTの詳細が見れます。下矢印?マークを選択し、 Invite to a channel を選択します。
Slack 2016-04-15 11-39-20.jpg

どこのチャンネルに招待するか選択しましょう。#randomや#generalでもいいのですが、BOTの動作テストをすることを考えると、#bot みたいなテスト用チャンネルを作成してそこに招待する方が良いでしょう。
ちなみに招待先を間違えると管理者権限がない限りremoveできないので注意してください。
僕は今回#botチャンネルを作ってそこに招待しました。
Inviteボタンを選択すれば招待完了です。
Slack 2016-04-15 11-41-18.jpg

先ほどのBOT設定画面にもどり、所属チャンネル一覧に招待したチャンネルが表示されていればokです。
(間違えて#randomに招待してしまったので、スクショでは#randomと#botの二つに所属していることになっています)
Hubot | tech_salon Slack 2016-04-15 12-00-05.jpg

4.EC2サーバーに入ってHubotを作る

ここまでくれば後は簡単です!
やることは
4-1.EC2にssh接続(ログイン)する
4-2.必要なものをinstallする
4-3.Hubot作成
4-4.Hubot実行
4-5.動作確認テスト
になります 🙂
ある程度のUnixコマンドの知識は必要ですが、基本コピペでも大丈夫です 🙂

4-1.EC2にssh接続(ログイン)する

EC2へのssh接続は割と簡単です。
前半でEC2サーバーを建てる時にダウンロードしたpemファイルを使用するので用意しておきましょう。

ssh接続はこのコマンドでできます。
pemファイルのパスは自分の環境に合わせて変えてください。
userNameはEC2サーバーの場合「ec2-user」が用意されているのでそれを使います。
ipアドレスも自分のEC2サーバーに合わせて用意してください。

ssh接続コマンド
$ ssh -i pemファイルのパス userName@ipアドレス

EC2サーバーのipアドレスを確認しましょう。
AWSにログインして、EC2管理画面から自分のEC2を選択し、 パブリックIP をメモりましょう。パブリックIPを使ってssh接続します。
EC2 Management Console 2016-04-15 12-17-30.jpg

pemファイルのアクセス権限の設定が弱いとssh接続ができないのでアクセス権限を変えます。
ちなみにファイルパスを手入力するのは大変です。Finderからターミナルにファイルをドラック&ドロップすると勝手にファイルパスが記入されるので是非使ってみてください。
pemファイルのアクセス権限を強くする
$ chmod 400 pemのファイルパス

僕の場合こんな感じになりました。
shirakawayoshimaru1 — bash — 120×24 2016-04-15 12-21-31.jpg

それではターミナルを使って実践していきます。

ssh接続コマンド
$ ssh -i pemファイルのパス userName@ipアドレス

僕の環境ではこうなりました。
shirakawayoshimaru1 — bash — 120×24 2016-04-15 12-24-17.jpg

初めて接続するipアドレスには「本当にここに接続していいの?」的な確認がでるのでyesと入力しましょう。
shirakawayoshimaru1 — ssh — 120×24 2016-04-15 12-24-57.jpg

無事ssh接続ができた場合は、こんな感じになります。
shirakawayoshimaru1 — ec2-user@ip-172-16-0-10:~ — ssh — 120×24 2016-04-15 12-28-55.jpg

4-2.必要なものをinstallする

nodesとreisとnpm をインストールしてください。
コマンドを入力したらいろいろ聞かれますが全てyを入力してください。

$ sudo yum install nodejs redis npm --enablerepo=epel

次にcoffee-scriptとhubをインストールしてください。
コマンドを入力したらいろいろ聞かれますが全てyを入力してください。

$ sudo npm install -g coffee-script hubot yo generator-hubot

これで必要なものは全てinstallすることができました。

4-3.Hubot作成

まずはHubotの作業フォルダを作成しましょう。
これで「QiitaMaruBotフォルダ」を作成してその中に入れます。

$ mkdir QiitaMaruBot
$ cd QiitaMaruBot/

次にHubotを作成します。
Hubotの作成は簡単でこれだけです。

$ yo hubo

Owner:適当に入力
Bot Name: 小文字のみ
Description: 適当に入力
Bot Adapter: slackと入力

次にHubotにToken(SlackのHubot管理画面にあったやつ)を設定します。
xoxb-34928263845-fhogehogehogehogheohgehogeの部分は自分のTokenに変えてください。

$ export HUBOT_SLACK_TOKEN=xoxb-34928263845-fhogehogehogehogheohgehoge

以上でHubotの作成になります。

4-4.Hubot実行

ここではEC2サーバーの中でHubotが正常に動作しているか確認します。
Hubotに対して「ping」というメッセージを送った時に「pong」と帰って来れば成功です。

まずはHubotを実行します。
(QiitaMaruBot/bin/hubotコマンドを実行しています。)

$ ./bin/hubot

まだHerokuの設定をしていないのでエラーがでますが、気にせずEnterを押せば大丈夫です。
こんな感じになればok
shirakawayoshimaru1 — ec2-user@ip-172-16-0-10:~:QiitaMaruBot — ssh — 120×24 2016-04-15 12-46-18.jpg

後は、こんな感じでqiitamarubotにメッセージを送ってpongが帰って来ればokです。
qiitamarubotの部分は自分がつけたBOTの名前に適宜変えてください

qiitamarubot> qiitamarubot ping

こんな風に
shirakawayoshimaru1 — ec2-user@ip-172-16-0-10:~:QiitaMaruBot — ssh — 120×24 2016-04-15 12-47-37.jpg

これでHubot実行は終わりです。

正常に動作していればexitコマンドを実行してHubotを停止させます。

qiitamarubot> exit

4-5.動作確認テスト

実際にSlackのチャンネルに反応して、SlackのチャンネルにBOTが投稿できるか確認します。
まずはHubotをSlackと接続するコマンドを実行します。

$ ./bin/hubot --adapter slack

実行後にSlackの画面に行って、BOTがオンラインになっていればおkです。
Slack 2016-04-15 12-54-16.jpg

後はBotを招待したチャンネルに行って、「qiitamarubot ping」と打って「pong」が帰って来れば成功です。
Slack 2016-04-15 12-56-13.jpg

楽しいw

動作確認テストは以上になります。

5.Tips

Tipsでは、
5-1.ssh接続を終了した後でもBOTをオンラインにする方法
5-2.BOTを停止させる方法
を書きます。

5-1.ssh接続を終了した後でもBOTをオンラインにする方法

普通に./bin/hubot --adapter slackコマンドを打っただけだとssh接続を終了するときにBOTも終了してしまいます。
これではBOTとして不十分なのでssh接続を終了してもBOTタスクが実行され続けるようバックグラウンドでhubotを実行しましょう。
やり方は簡単で

$ nohup ./bin/hubot --adapter slack &

このコマンドを実行するだけです。
nohupと&をつけることでバックグラウンドでhubotが実行されます。

5-2.BOTを停止させる方法

nohupコマンドで実行したプロセスは明示的に終了させる必要があります。
やり方は簡単で、
1:プロセスのIDを調べる
2:プロセスをkillする
です。

まずはプロセスのIDを調べましょう。

$ ps aux | grep hubot

これで調べることができます。grepでhubotに関するプロセスのみを出力させます。

shirakawayoshimaru1 — ec2-user@ip-172-16-0-10:~:QiitaMaruBot — ssh — 112×24 2016-04-15 13-06-15.jpg
2つくらいプロセスがあると思うのですが、--adapter slackが付いている方のプロセスIDをメモります。

次にプロセスをkillさせます。

$ kill プロセスID

でkillできます。

これを実行することでhubotを停止させることができます。

以上!お疲れさまでした!!

参考url

yoでhubot作成時のエラーの対処

hubot構築に伴い、環境は AWS EC2 Amazon linux を選択しました。

構築は、下部の参考サイトにある通り、Amazon linuxの場合は、順々にインストールを進められました。

#mkdir ichigo
#cd ichigo
#yo hubot

が、yo hubot で下記エラーになりました。

Native thread-sleep not available.
This will result in much slower performance, but it will still work.
You should re-install spawn-sync or upgrade to the lastest version of node if possible.
Check /usr/lib/node_modules/yo/node_modules/yeoman-environment/node_modules/inquirer/node_modules/external-editor/node_modules/spawn-sync/error.log for more details
Native thread-sleep not available.
This will result in much slower performance, but it will still work.
You should re-install spawn-sync or upgrade to the lastest version of node if possible.
Check /usr/lib/node_modules/yo/node_modules/tabtab/node_modules/inquirer/node_modules/external-editor/node_modules/spawn-sync/error.log for more details

Error: EACCES, permission denied '/root/.config'
    at Object.fs.mkdirSync (fs.js:654:18)
    at sync (/usr/lib/node_modules/yo/node_modules/configstore/node_modules/mkdirp/index.js:71:13)
    at Function.sync (/usr/lib/node_modules/yo/node_modules/configstore/node_modules/mkdirp/index.js:77:24)
    at Object.create.all.get (/usr/lib/node_modules/yo/node_modules/configstore/index.js:38:13)
    at Object.Configstore (/usr/lib/node_modules/yo/node_modules/configstore/index.js:27:44)
    at new Insight (/usr/lib/node_modules/yo/node_modules/insight/lib/index.js:37:34)
    at Object.<anonymous> (/usr/lib/node_modules/yo/lib/cli.js:172:11)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)

エラーの原因は、rootユーザで行なっていた為でした。
ec2-user でやり直して、hubot構築完了となりました。
本来であれば、hubotユーザを作ってやるべきですね。