使用Twilio构建SlackBot

文章目录
  1. Results
  2. Points
    1. 使用virtualenv 虚拟环境
    2. Ngrok的使用
    3. twilio的控制台配置
    4. 代码核心机制
    5. 总结

前段时间学习了Python的一个Web框架:Flask, 感觉很简洁(相对于Django)。正巧有一篇关于Flask的推送,使用Flask建立一个Slack的bot,感觉很有意思。就开始按照文章搭建了一次,顺手练习Flask;按照文章基本可以搭建完成;下面记录学习到的几个地方,细节部分不再赘述,原文中很清晰。 推送原文链接:How to Build an SMS Slack Bot in Python

Results

Slack用户可以通过手机短信来发送和接收Slack的消息, 基于Slack APITwilio SMS API来完成的。 其中Slack是一款在国外很流行的团队协作工具(可以代替qq,微信等),并且提供了大量的优秀API, 可以与很多工具比如github等结合起来,非常方便. twilio可以提供短信电话等服务.

Points

使用virtualenv 虚拟环境

在使用python开发的时候, 由于有众多的第三方库,不同的项目使用的库版本可能有差异,这种情况下,使用虚拟环境是最佳的选择,每个项目一个环境,互不影响。这里面virtualenv+pip是一个很好的选择. - 安装virtualenv

1
$ sudo pip install virtualenv
- 创建虚拟环境
1
$ virtualenv twiliobot
- 激活环境
1
$ source twiliobot/bin/activate

然后就可以在该环境下开发了,再使用pip安装库的时候, 直接pip install package即可,无需sudo.

Ngrok的使用

Ngrok的使用基本属于最大收获了。Ngrok俗称内网穿透利器, 也就是说可以通过外网来访问本地的部署的项目, 在展示或者调试一些项目的时候,还是很方便的。就不用费劲专门部署到服务器只为了看下效果。 安装很方便, 直接去官网下载二进制文件即可: ngrok, 注册一下会有更多的使用权限,比如外网ssh链接本机。 但是Ngrok服务器在国外有些时候比较慢,可以在自己的VPS上面基于开源的Ngrok,以及自己的域名,来搭建自己的Ngrok服务器。 下载了之后直接解压,会有个二进制文件, 直接执行就行, 比如在本文中,由于Flask使用的5000端口, 执行如下命令:

1
$ ./ngrok http 5000
如果产生下面的结果,则说明成功 其中的Frowarding两项则表示外网的域名,可以访问本机的localhost:5000, 具体的用处下面会有说明。 Ngrok还有很多用处,后面在自己搭建服务器的时候,在详细记录一下。

twilio的控制台配置

在文中提到了将上面使用Ngrok生成的外网链接配置到twilio的Message钩子里面,但是找了半天下面地址找不到: 之后找到了链接如下:

1
https://www.twilio.com/console/phone-numbers/dashboard
这样就可以设置了.

代码核心机制

实现上述的功能核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import os
from flask import Flask, request, Response
from slackclient import SlackClient
from twilio import twiml
from twilio.rest import TwilioRestClient

SLACK_WEBHOOK_SECRET = os.environ.get('SLACK_WEBHOOK_SECRET', None)
TWILIO_NUMBER = os.environ.get('TWILIO_NUMBER', None)
USER_NUMBER = os.environ.get('USER_NUMBER', None)

app = Flask(__name__)
slack_client = SlackClient(os.environ.get('SLACK_TOKEN', None))
twilio_client = TwilioRestClient()


@app.route('/twilio', methods=['POST'])
def twilio_post():
    response = twiml.Response()
    if request.form['From'] == USER_NUMBER:
        message = request.form['Body']
        slack_client.api_call("chat.postMessage", channel="#general",
                              text=message, username='twiliobot',
                              icon_emoji=':robot_face:')
    return Response(response.toxml(), mimetype="text/xml"), 200

if __name__ == '__main__':
    app.run(debug=True)
其中的TWILIO_NUMBER 是在注册了twilio账户之后,申请的一个号码。而USER_NUMBER则是用户的手机号码。 上述实现的是其中一个功能,就是USER_NUMBERTWILIO_NUMBER发送一条文本短信,那么slack上的#general会有消息收到. 其中原理很简单,就是TWILIO收到消息之后, 会触发上面设置的Webhook中的income message 的钩子,就是发送POST请求到ngrok产成的链接,这里就是为什么需要用ngrok产生外网链接的原因,因为需要twilio访问到,从而路由到本地的twilio_post函数,再有slackclient`发送指定消息即可。

总结

这个东西很有意思,而且借助twilio和slack的众多的api,可以达到很高的扩展性. 可以收发信息,做一些小应用什么的, 本文大致记录一下, 以后使用方便点。