Slack 是一个最近一年兴起的团队沟通协作平台. 程序员对工具其实是最有品位和要求的,相信国内很多公司和团队都在使用,豆瓣也算比较早在用. 相信用过的人会理解本文. 如果你还没有接触它, 尤其是对现有的团队沟通协作工具有些不满, 可以试一下.
本文就是介绍我们在最近不到20天里做出来的一个bot - slack_bot . 它的口号是: 立志成为一个可被调戏且有用的Bot
无论是运维还是开发, 某些时间都会收到一些邮件/提醒, 可能是固定的时间的定人任务跑出来的结果, 也可能是某个故障引起的问题邮件. 我们都很烦手头有好几个东西来接收这些消息, 而slack可以使用某些方法让这些问题集中起来.
比如很常用的, 使用 chat 或者 incoming-webhooks 接收消息. 做什么呢? 我可以把一些昨天的数据汇总或者汇总的地址在今天早上发到某个channel下, 这样想要看这个数据的人直接点进去就好了. 当然啦, 也可以直接发消息到某个人. 一个具体的例子: 豆瓣的同事都知道, 我们的测试环境时间过期就会被删除, 我在某段时间里面每天都有很多人在关注这个测试的地址, 但是经常被同事@, 说地址怎么找不到了, 那么我就要抽出精力再去创建一个. 后来一想, 索性跑个定时任务, 拉最新的代码, 走逻辑, 生成一个测试环境. 每天都会在channel里面发消息给对应关心这个消息的人. 一段时间以后, 我们的工作完成了, 同事都有点不适用, 哎, 怎么早上看不到那个消息了…
但是今天说的是什么呢? 我们的slack_bot主要借用 outgoing-webhooks . incoming表示把消息推到slack里面, outgoing其实就是当有人在某些符合的channel里面说了什么, 会跳到我们提供的回调地址, 根据内容返回对应符合的回复. 大家是不是有点懂了, 这就是小黄鸡的原理.
说到这里大家应该明白了. 其实slack给我们提供的很大得想象和实现的空间. 我立刻想起来做运维时候做的一些事情. 比如当时有时候要去机房, 路上没有网(2g上网太慢), 有时候想看个监控状态, 切个负载均衡, 重启个服务什么的, 后来做了一个东西, 就是给某些号码发某些特殊的短信内容就可以获得想要的结果, 执行想做的事情. 其实slack_bot只是一些爬虫的集合, 一些功能实现的例子. 在实际开发和工作中可以做很多更有意思的, 公司内部的插件. 和公司的业务相关, 和自己做的事情相关. 这样在路上就能用. 比如我的地图功能, 我可以在网络不好的时候找到行程的最好路线; 我用公交插件可以实时的看我要等的公交需要多久来, 我可以踩着点去站牌….
等不及的可以先拉到结尾看插件效果截图
小黄鸡很火的时候, 我还是一个perl运维…
小黄鸡其实调用的是 simsim 的接口. 大家都可以去注册一个key来玩,也可以用项目自带的.
其实就是post一个数据到simsim的api上, 他会返回你对应的小黄鸡的回复. 包括slack_bot. 都是一些插件, 挨个匹配, 都不符合就会使用simsim接口.
很多人听过甚至曾经用过 小黄鸡 . 你可以把本bot理解为 增加了很多 功能
, 只保留小黄鸡交流的基本逻辑
, 用于slack
channel里面的 小黄鸡
项目使用flask, 目前本项目是一个heroku应用. 地址是 https://slack-bot2.herokuapp.com/slack_callback 但是你 也可以直接裸跑
gunicorn wsgi:app localhost:5000 --timeout 240 --log-file -
继承自小黄鸡的模块们, 但是都做了对应的修改:
新加的模块们:
北京公交插件 - 可以查询北京公交线路, 获取实时的到某站的信息(有些线路站点不准)
美食插件 - 使用大众点评网api, 获取附近餐饮信息, 评分, 电话地址,距离等等
pycoders插件 - 获得
pythonweekly插件 - 获得
去你的slack组织的services页面. 比如我们是 https://pythoncn.slack.com/services/new. 找到 Outgoing WebHooks
:
点击 Add+
并确认到新建页面:
channel
可以选择any,也可以指定单独一个. Trigger Word(s)
可以不填, 那就是所有的记录都会走. 也可以找关键词/字, 用逗号隔开. url
就是你控制的回调的地址. 本图中的是我们用的herokuapp地址: https://slack-bot2.herokuapp.com/slack_callback
你还可以自定义icon的图标和名字:
我还是抄袭了 小黄鸡 的插件思想. 但是完全脱离和小黄鸡的代码关系. 只留下了几个原有的插件并更新. plugins 目录下有一些插件. 系统会按照plugins/ init .py里面的__all__的列表顺序, 挨个插件对比是否符合. 符合即停止. 都不符合最后会使用simsim模块
具体的插件编写可以参看项目的 插件编写
Trigger Word
. 你要保证你的回复可以被停止, 否者你的回复会被当成下一次的输入. 这样就死循环了. 比如我们使用一个函数, 只要文本用 !
开头就不会回调. 表示这个是一个正常的,不想被out-going的记录.