转载

slack上的小黄鸡 - SlackBot

前言

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 - 

我们使用slack的特性

  1. 可以把消息私聊发给自己
  2. 可以使用带图的方式接收结果(支持canvas, 以下会看到例图)

模块用途

继承自小黄鸡的模块们, 但是都做了对应的修改:

  1. 空气插件
  2. wikipedia
  3. 地震了
  4. 糗百
  5. orz

新加的模块们:

地图插件 - 你可以输入我想从哪去哪, 会给你个路线(步行/开车/公交)

slack上的小黄鸡 - SlackBot slack上的小黄鸡 - SlackBot

天气插件 - 使用了百度api, 获得城市的天气情况

slack上的小黄鸡 - SlackBot

北京公交插件 - 可以查询北京公交线路, 获取实时的到某站的信息(有些线路站点不准)

slack上的小黄鸡 - SlackBot slack上的小黄鸡 - SlackBot

美食插件 - 使用大众点评网api, 获取附近餐饮信息, 评分, 电话地址,距离等等

slack上的小黄鸡 - SlackBot

技术活动插件 - 从segmentfault/csdn/车库咖啡/活动行获得最近的活动列表

slack上的小黄鸡 - SlackBot

Github_issue插件 - 获得你个人或者组织下未处理的Pull requests列表

slack上的小黄鸡 - SlackBot

电影信息插件 - 列出最近上映和即将上映的电影信息

slack上的小黄鸡 - SlackBot

pycoders插件 - 获得 订阅数据

slack上的小黄鸡 - SlackBot

pythonweekly插件 - 获得 订阅数据

slack上的小黄鸡 - SlackBot

头条插件 - 获得今日头条新闻

slack上的小黄鸡 - SlackBot

travel插件 - 旅游推荐/景点介绍

slack上的小黄鸡 - SlackBot slack上的小黄鸡 - SlackBot

v2ex feed插件 - 获得一些节点的最新feed

slack上的小黄鸡 - SlackBot

help插件 - 列出所有插件的帮助信息

slack上的小黄鸡 - SlackBot

最主要的是小黄鸡(simsim)

slack上的小黄鸡 - SlackBot

也可以直接发到个人的slackbot channel里:

slack上的小黄鸡 - SlackBot slack上的小黄鸡 - SlackBot

配置slack

去你的slack组织的services页面. 比如我们是 https://pythoncn.slack.com/services/new. 找到 Outgoing WebHooks :

slack上的小黄鸡 - SlackBot

点击 Add+ 并确认到新建页面:

slack上的小黄鸡 - SlackBot

channel 可以选择any,也可以指定单独一个. Trigger Word(s) 可以不填, 那就是所有的记录都会走. 也可以找关键词/字, 用逗号隔开. url 就是你控制的回调的地址. 本图中的是我们用的herokuapp地址: https://slack-bot2.herokuapp.com/slack_callback

你还可以自定义icon的图标和名字:

slack上的小黄鸡 - SlackBot

实现原理

我还是抄袭了 小黄鸡 的插件思想. 但是完全脱离和小黄鸡的代码关系. 只留下了几个原有的插件并更新. plugins 目录下有一些插件. 系统会按照plugins/ init .py里面的__all__的列表顺序, 挨个插件对比是否符合. 符合即停止. 都不符合最后会使用simsim模块

具体的插件编写可以参看项目的 插件编写

一些trick

  1. 假如你没有设置 Trigger Word . 你要保证你的回复可以被停止, 否者你的回复会被当成下一次的输入. 这样就死循环了. 比如我们使用一个函数, 只要文本用 ! 开头就不会回调. 表示这个是一个正常的,不想被out-going的记录.
  2. 这里的天气图片是一个html5的data image. 还有豆瓣电影的海报图片做了防盗链, 不能被slack识别和正常显示. 我的用法是upload到slack. 获得返回的url.然后在生成附件.
  3. direct message其实是被限定了post的长度. 太长的话会报414. 需要对长数据切分. slack_bot已经实现了
正文到此结束
Loading...