标签 Slack 下的文章

Zulip 是一个开源的协作平台,它把自己定位为一个更好的 Slack 替代品。让我们来了解一下。

当涉及到你的工作时,消息和协作平台有很大的不同。

虽然有几个选择,但 Slack 是许多组织使用的一个流行选择。但是,可以自托管的 Slack 的开源替代方案如何呢?

Zulip 就是这样一个软件。

Zulip:开源的协作消息应用

如果你想多了解,我必须提到还有更多的 Slack 开源替代品

但在这里,我重点介绍 Zulip。

Zulip 是一个自由而开源的消息应用,有付费托管选项和自托管的能力。

它旨在提供与 Slack 类似的体验,同时努力帮助你利用话题提高对话的有效性。

与 Slack 中的频道相比,Zulip 聊天添加了话题(类似标签),以快速过滤与你有关的对话。

Zulip 的特点

你可以通过 Zulip 获得大部分的基本功能。这里列出主要的亮点,你可以发现:

  • 支持 Markdown
  • 频道的主题
  • 支持拖放文件
  • 代码块
  • 集成 GitHub 来跟踪问题
  • 支持电子邮件通知
  • 自托管选项
  • 信息编辑
  • 集成 GIPHY
  • 用 Zoom、Jitsi 或 BigBlueButton 进行视频通话

除了上述功能外,你可以预期得到你通常在 Slack 和其他方面得到的基本选项。

此外,如果你愿意,你还可以将它与 Matrix 和 IRC 整合。

在我简短的测试使用中,其用户界面对于有效的沟通来说是足够好的。然而,我没能找到任何黑暗模式或改变主题的能力。

它看起来比 Slack 更简单直白,这样可以改善用户体验方面的问题。

在 Linux 中安装 Zulip

Zulip 在其官方网站上以 AppImage 文件的形式提供。如果你需要帮助,可以参考我们关于 在 Linux 中使用 AppImage 的指南。

它也有一个 Snap 包。所以,你可以在任何一个 Linux 发行版上使用它们中的任何一个。

你也可以使用 APT 通过终端为基于 Ubuntu/Debian 的发行版安装它。如果你想这样做,请看它的 官方说明

Zulip 可用于 Windows、Mac 和 Linux。你也应该发现它可用于 Android 和 iOS 手机。

你可以在网络、桌面和智能手机上使用 Zulip,所以可以把它当做 Slack 的合适替代品。

你试过了吗?你用什么消息平台来进行工作协作?欢迎在评论中分享你的想法。


via: https://itsfoss.com/zulip/

作者:Ankush Das 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Mattermost,作为 Slack 的开源替代品,获得了 5000 万美元的 B 轮融资。这个消息极其令人振奋。

Slack 是一个基于云的团队内部沟通协作软件。企业、初创企业、甚至全球化的开源项目都在使用 Slack 进行同事及项目成员间的沟通。

Slack 在 2019 年 6 月的估值为 200 亿美元,由此可见其在科技行业的巨大影响,当然也就有更多产品想与之竞争。

5000 万美元开源项目

就我个人而言,我并不知道 MatterMost 这个产品。但 VentureBeat 对这则新闻的报道,激发了我的好奇心。这次融资由 Y Combinator 的 Continuity 与一家新的投资方 BattleVentures 领投,现有投资者 Redpoint 和 S28 Captial 共同跟投。

公告中,他们也提到:

今天的公告中,Mattermost 成为了 YC 有史以来规模最大的 B 轮投资项目,更重要的是,它是 YC 迄今为止投资额最高的开源项目。

下面是摘自 VentureBeat 的报道,你可以从中了解到一些细节:

本次资本注入,是继 2017 年 2 月的种子轮 350 万融资和今年 2 月份的 2000 万 A 轮融资之后进行的,并使得这家总部位于美国加州 帕罗奥图 Palo Alto 的公司融资总额达到了约 7000 万美元。

如果你对他们的规划感兴趣,可以阅读官方公告

尽管听起来很不错,但可能你并不知道 Mattermost 是什么。所以我们先来作个简单了解:

Mattermost 快览

Mattermost

前面已经提到,Mattermost 是 Slack 的开源替代品。

乍一看,它几乎照搬了 Slack 的界面外观,没错,这就是关键所在,你将拥有你可以轻松使用的软件的开源解决方案。

它甚至集成了一些流行的 DevOps 工具,如 Git、自动机器人和 CI/CD。除了这些功能外,它还关注安全性和隐私。

同样,和 Slack 类似,它支持和多种应用程序与服务的集成。

听起来很有前景?我也这么认为。

定价:企业版和团队版

如果你希望由 Mattermost 托管该服务(或获得优先支持),应选择其企业版。但如果你不想使用付费托管,可以下载团队版,并将其安装到基于 Linux 的云服务器或 VPS 服务器上。

当然,我们不会在此进行深入探究。我确想在此提及的是,企业版并不昂贵。

总结

MatterMost 无疑相当出色,有了 5000 万巨额资金的注入,对于那些正在寻求安全的并能提供高效团队协作支持的开源通讯平台的用户,Mattermost 很可能成为开源社区重要的部分。

你觉得这条新闻怎么样?对你来说有价值吗?你是否已了解 Mattermost 是 Slack 的替代品?

请在下面的评论中给出你的想法。


via: https://itsfoss.com/mattermost-funding/

作者:Ankush Das 选题:lujun9972 译者:wahailin 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

作为一个被数以百万计用户使用的企业级软件平台,Slack 可以让各种规模的团队和企业有效地沟通。Slack 通过在一个单一集成环境中与其它软件工具无缝衔接,为一个组织内的通讯、信息和项目提供了一个易于接触的档案馆。尽管自从诞生后 Slack 就在过去四年中快速成长,但是他们负责该平台的 Windows、MacOS 和 Linux 桌面的工程师团队仅由四人组成。我们采访了这个团队的主任工程师 Felix Rieseberg(他负责追踪上月首次发布的 Slack snap,LCTT 译注:原文发布于 2018.2),来了解更多有关该公司对于 Linux 社区的态度,以及他们决定构建一个 snap 软件包的原因。

你们能告诉我们更多关于已发布的 Slack snap 的信息吗?

作为发布给 Linux 社区的一种新形式,我们上月发布了我们的第一个 snap。在企业界,我们发现人们更倾向于以一种相对于个人消费者来说较慢的速度来采用新科技,因此我们将会在未来继续提供 .deb 形式的软件包。

你们觉得 Linux 社区会对 Slack 有多大的兴趣呢?

我很高兴在所有的平台上人们都对 Slack 的兴趣越来越大。因此,很难说来自 Linux 社区的兴趣和我们大体上所见到的兴趣有什么区别。当然,不管用户们在什么平台上面工作,满足他们对我们都是很重要的。我们有一个专门负责 Linux 的测试工程师,并且我们同时也会尽全力提供最好的用户体验。

只是我们发现总体相对于 Windows 来说,为 Linux 搭建 snap 略微有点难度,因为我们是在一个较难以预测的平台上工作——而这正是 Linux 社区之光照耀的领域。在汇报程序缺陷以及寻找程序崩溃原因方面,我们有相当多极有帮助的用户。

你们是如何得知 snap 的?

Canonical 公司的 Martin Wimpress 接触了我,并向我解释了 snap 的概念。说实话尽管我也用 Ubuntu 但最初我还是迟疑的,因为它看起来像需要搭建与维护的另一套标准。然而,一当我了解到其中的好处之后,我确信这是一笔值得的投入。

snap 的什么方面吸引了你们并使你们决定投入其中?

毫无疑问,我们决定搭建 snap 最重要的原因是它的更新特性。在 Slack 上我们大量运用了网页技术,这些技术反过来也使得我们提供大量的特性——比如将 YouTube 视频或者 Spotify 播放列表集成在 Slack 中。与浏览器十分相似,这意味着我们需要频繁更新应用。

在 MacOS 和 Windows 上,我们已经有了一个专门的自动更新器,甚至无需用户关注更新。任何形式的中断都是一种我们需要避免的烦恼,哪怕是为了更新。因此通过 snap 自动化的更新就显得更加无缝和便捷。

相比于其它形式的打包方式,构建 snap 感觉如何?将它与现有的设施和流程集成在一起有多简便呢?

就 Linux 而言,我们尚未尝试其它的“新”打包方式,但我们迟早会的。鉴于我们的大多数用户都使用 Ubuntu,snap 是一个自然的选择。同时 snap 在其它发行版上同样也可以使用,这也是一个巨大的加分项。Canonical 正将 snap 做到跨发行版,而不是仅仅集中在 Ubuntu 上,这一点我认为是很好的。

搭建 snap 极其简单,我们有一个创建安装器和软件包的统一流程,我们的 snap 创建过程就是从一个 .deb 软件包炮制出一个 snap。对于其它技术而言,有时候我们为了支持构建链而先打造一个内部工具。但是 snapcraft 工具正是我们需要的东西。在整个过程中 Canonical 的团队非常有帮助,因为我们一路上确实碰到了一些问题。

你们觉得 snap 商店是如何改变用户们寻找、安装你们软件的方式的呢?

Slack 真正的独特之处在于人们不仅仅是碰巧发现它,他们从别的地方知道它并积极地试图找到它。因此尽管我们已经有了相当高的觉悟,我希望对于我们的用户来说,在商店中可以获得 snap 能够让安装过程变得简单一点。

我们总是尽力为用户服务。当我们觉得它比其他安装方式更好,我们就会向用户更多推荐它。

通过使用 snap 而不是为其它发行版打包,你期待或者已经看到的节省是什么?

我们希望 snap 可以给予我们的用户更多的便利,并确保他们能够更加喜欢使用 Slack。在我们看来,鉴于用户们不必被困在之前的版本,这自然而然地解决了许多问题,因此 snap 可以让我们在客户支持方面节约时间。snap 对我们来说也是一个额外的加分项,因为我们能有一个可供搭建的平台,而不是替换我们现有的东西。

如果存在的话,你们正使用或者准备使用边缘 (edge)、测试 (beta)、候选 (candidate)、稳定 (stable) 中的哪种发行频道?

我们开发中专门使用边缘 (edge) 频道以与 Canonical 团队合作。为 Linux 打造的 Slack 总体仍处于测试 (beta) 频道中。但是长远来看,拥有不同频道的选择十分有意思,同时能够提早一点为感兴趣的客户发布版本也肯定是有好处的。

你们如何认为将软件打包成一个 snap 能够帮助用户?你们从用户那边得到了什么反馈吗?

对我们的用户来说一个很大的好处是安装和更新总体来说都会变得简便一点。长远来看,问题是“那些安装 snap 的用户是不是比其它用户少碰到一些困难?”,我十分期望 snap 自带的依赖关系能够使其变成可能。

你们对刚使用 snap 的新用户们有什么建议或知识呢?

我会推荐从 Debian 软件包来着手搭建你们的 snap ——那出乎意料得简单。这同样也缩小了范围,避免变得不堪重负。这只需要投入相当少的时间,并且很大可能是一笔值得的投入。同样如果你们可以的话,尽量试着找到 Canonical 的人员来协作——他们拥有了不起的工程师。

对于开发来说,你们在什么地方看到了最大的机遇?

我们现在正一步步来,先是让人们接受 snap,再从那里开始搭建。正在使用 snap 的人们将会感到更加稳健,因为他们将会得益于最新的更新。


via: https://insights.ubuntu.com/2018/02/06/building-slack-for-the-linux-community-and-adopting-snaps/

作者:Sarah 译者:tomjlw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

一个获得关于慢查询、意外错误和其它重要日志通知的简单 Go 秘诀。

我的 Slack 机器人提示我一个运行了很长时间 SQL 查询。我应该尽快解决它。

我们不能管理我们无法去测量的东西。每个后台应用程序都需要我们去监视它在数据库上的性能。如果一个特定的查询随着数据量增长变慢,你必须在它变得太慢之前去优化它。

由于 Slack 已经成为我们工作的中心,它也在改变我们监视系统的方式。 虽然我们已经有非常不错的监视工具,如果在系统中任何东西有正在恶化的趋势,让 Slack 机器人告诉我们,也是非常棒的主意。比如,一个太长时间才完成的 SQL 查询,或者,在一个特定的 Go 包中发生一个致命的错误。

在这篇博客文章中,我们将告诉你,通过使用已经支持这些特性的一个简单的日志系统一个已存在的数据库库(database library) 怎么去设置来达到这个目的。

使用记录器

logger 是一个为 Go 库和应用程序使用设计的小型库。在这个例子中我们使用了它的三个重要的特性:

  • 它为测量性能提供了一个简单的定时器。
  • 支持复杂的输出过滤器,因此,你可以从指定的包中选择日志。例如,你可以告诉记录器仅从数据库包中输出,并且仅输出超过 500 ms 的定时器日志。
  • 它有一个 Slack 钩子,因此,你可以过滤并将日志输入到 Slack。

让我们看一下在这个例子中,怎么去使用定时器,稍后我们也将去使用过滤器:

package main

import (
    "github.com/azer/logger"
    "time"
)

var (
  users = logger.New("users")
  database = logger.New("database")
)

func main () {
  users.Info("Hi!")

  timer := database.Timer()
  time.Sleep(time.Millisecond * 250) // sleep 250ms
  timer.End("Connected to database")

  users.Error("Failed to create a new user.", logger.Attrs{
    "e-mail": "[email protected]",
  })

  database.Info("Just a random log.")

  fmt.Println("Bye.")
}

运行这个程序没有输出:

$ go run example-01.go
Bye

记录器是缺省静默的,因此,它可以在库的内部使用。我们简单地通过一个环境变量去查看日志:

例如:

$ LOG=database@timer go run example-01.go
01:08:54.997 database(250.095587ms): Connected to database.
Bye

上面的示例我们使用了 database@timer 过滤器去查看 database 包中输出的定时器日志。你也可以试一下其它的过滤器,比如:

  • LOG=*: 所有日志
  • LOG=users@error,database: 所有来自 users 的错误日志,所有来自 database 的所有日志
  • LOG=*@timer,database@info: 来自所有包的定时器日志和错误日志,以及来自 database 的所有日志
  • LOG=*,users@mute: 除了 users 之外的所有日志

发送日志到 Slack

控制台日志是用于开发环境的,但是我们需要产品提供一个友好的界面。感谢 slack-hook, 我们可以很容易地在上面的示例中,使用 Slack 去整合它:

import (
  "github.com/azer/logger"
  "github.com/azer/logger-slack-hook"
)

func init () {
  logger.Hook(&slackhook.Writer{
    WebHookURL: "https://hooks.slack.com/services/...",
    Channel: "slow-queries",
    Username: "Query Person",
    Filter: func (log *logger.Log) bool {
      return log.Package == "database" && log.Level == "TIMER" && log.Elapsed >= 200
    }
  })
}

我们来解释一下,在上面的示例中我们做了什么:

  • 行 #5: 设置入站 webhook url。这个 URL 链接在这里
  • 行 #6: 选择流日志的入口通道。
  • 行 #7: 显示的发送者的用户名。
  • 行 #11: 使用流过滤器,仅输出时间超过 200 ms 的定时器日志。

希望这个示例能给你提供一个大概的思路。如果你有更多的问题,去看这个 记录器的文档。

一个真实的示例: CRUD

crud 是一个用于 Go 的数据库的 ORM 式的类库,它有一个隐藏特性是内部日志系统使用 logger 。这可以让我们很容易地去监视正在运行的 SQL 查询。

查询

这有一个通过给定的 e-mail 去返回用户名的简单查询:

func GetUserNameByEmail (email string) (string, error) {
  var name string
  if err := DB.Read(&name, "SELECT name FROM user WHERE email=?", email); err != nil {
    return "", err
  }

  return name, nil
}

好吧,这个太短了, 感觉好像缺少了什么,让我们增加全部的上下文:

import (
  "github.com/azer/crud"
  _ "github.com/go-sql-driver/mysql"
  "os"
)

var db *crud.DB

func main () {
  var err error

  DB, err = crud.Connect("mysql", os.Getenv("DATABASE_URL"))
  if err != nil {
    panic(err)
  }

  username, err := GetUserNameByEmail("[email protected]")
  if err != nil {
    panic(err)
  }

  fmt.Println("Your username is: ", username)
}

因此,我们有一个通过环境变量 DATABASE_URL 连接到 MySQL 数据库的 crud 实例。如果我们运行这个程序,将看到有一行输出:

$ DATABASE_URL=root:123456@/testdb go run example.go
Your username is: azer

正如我前面提到的,日志是 缺省静默的。让我们看一下 crud 的内部日志:

$ LOG=crud go run example.go
22:56:29.691 crud(0): SQL Query Executed: SELECT username FROM user WHERE email='[email protected]'
Your username is: azer

这很简单,并且足够我们去查看在我们的开发环境中查询是怎么执行的。

CRUD 和 Slack 整合

记录器是为配置管理应用程序级的“内部日志系统”而设计的。这意味着,你可以通过在你的应用程序级配置记录器,让 crud 的日志流入 Slack :

import (
  "github.com/azer/logger"
  "github.com/azer/logger-slack-hook"
)

func init () {
  logger.Hook(&slackhook.Writer{
    WebHookURL: "https://hooks.slack.com/services/...",
    Channel: "slow-queries",
    Username: "Query Person",
    Filter: func (log *logger.Log) bool {
      return log.Package == "mysql" && log.Level == "TIMER" && log.Elapsed >= 250
    }
  })
}

在上面的代码中:

  • 我们导入了 loggerlogger-slack-hook 库。
  • 我们配置记录器日志流入 Slack。这个配置覆盖了代码库中 记录器 所有的用法, 包括第三方依赖。
  • 我们使用了流过滤器,仅输出 MySQL 包中超过 250 ms 的定时器日志。

这种使用方法可以被扩展,而不仅是慢查询报告。我个人使用它去跟踪指定包中的重要错误, 也用于统计一些类似新用户登入或生成支付的日志。

在这篇文章中提到的包

告诉我们 如果你有任何的问题或建议。


via: http://azer.bike/journal/monitoring-slow-sql-queries-via-slack/

作者:Azer Koçulu 译者:qhwdw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

貌似每个人都听说过 Slack,它是一款跨平台的,可以使你时刻保持与他人同步的团队沟通应用。它革新了用户讨论和规划项目的方式,显而易见,它升级了 email 的沟通功能。

我在一个非常小的写作团队工作,不管是通过手机还是电脑,我从未在使用 Slack 过程中遇到过沟通问题。若想与任何规模的团队保持同步,继续使用 Slack 仍然不失为不错的方式。

既然如此,为什么我们还要讨论今天的话题?Ryver 被人们认为是下一个热点,相比 Slack,Ryver 提供了升级版的服务。Ryver 完全免费,它的团队正在奋力争取更大的市场份额。

是否 Ryver 已经强大到可以扮演 Slack 杀手的角色?这两种旗鼓相当的消息应用究竟有何不同?

欲知详情,请阅读下文。

为什么用 Ryver ?

既然 Slack 能用为什么还要折腾呢?Ryver 的开发者对 Slack 的功能滚瓜烂熟,他们希望 Ryver 改进的服务足以让你移情别恋。他们承诺 Ryver 提供完全免费的团队沟通服务,并且不会在任何一个环节隐形收费。

谢天谢地,他们用高质量产品兑现了自己的承诺。

额外的内容是关键所在,他们承诺去掉一些你在 Slack 免费账号上面遇到的限制。无限的存储空间是一个加分点,除此之外,在许多其他方面 Ryver 也更加开放。如果存储空间限制对你来说是个痛点,不防试试 Ryver。

这是一个简单易用的系统,所有的功能都可以一键搞定。这种设计哲学使 Apple 大获成功。当你开始使用它之后,也不会遭遇成长的烦恼。

会话分为私聊和公示,这意味着团队平台和私人用途有明确的界限。它应该有助于避免将任何尴尬的广而告之给你的同事,这些问题我在使用 Slack 期间都遇到过。

Ryver 支持与大量现成的 App 的集成,并在大多数平台上有原生应用程序。

在需要时,你可以添加访客而无需增加费用,如果你经常和外部客户打交道,这将是一个非常有用的功能。访客可以增加更多的访客,这种流动性的元素是无法从其他更流行的消息应用中看到的。

考虑到 Ryver 是一个为迎合不同需求而产生的完全不同的服务。如果你需要一个账户来处理几个客户,Ryver 值得一试。

问题是它是如何做到免费的呢? 简单的答案是高级用户将为你的使用付了费。 就像 Spotify 和其他应用一样,有一小部分人为我们其他人支付了费用。 这里有一个直接链接到他们的下载页面的地址,如果有兴趣就去试一试吧。

你应该切换到 Ryver 吗?

像我一样在小团队使用 Slack 的体验还是非常棒,但是 Ryver 可以给予的更多。一个完全免费的团队沟通应用的想法不可谓不宏伟,更何况它工作的十分完美。

同时使用这两种消息应用也无可厚非,但是如果你不愿意为一个白金 Slack 账户付费,一定要尝试一下竞争对手的服务。你可能会发现,两者各擅胜场,这取决于你需要什么。

最重要的是,Ryver 是一个极棒的免费替代品,它不仅仅是一个 Slack 克隆。他们清楚地知道他们想要实现什么,他们有一个可以在拥挤不堪的市场提供不同的东西的不错的产品。

但是,如果将来持续缺乏资金,Ryver 有可能消失。 它可能会让你的团队和讨论陷入混乱。 目前一切还好,但是如果你计划把更大的业务委托给这个新贵还是需要三思而行。

如果你厌倦了 Slack 对免费帐户的限制,你会对 Ryver 印象深刻。 要了解更多,请访问其网站以获取有关服务的信息。


via: https://www.maketecheasier.com/why-use-ryver-instead-of-slack/

作者:James Milin-Ashmore 译者:firstadream 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

聊天机器人(Bot) 是一种像 Slack 一样的实用的互动聊天服务方式。如果你之前从来没有建立过聊天机器人,那么这篇文章提供了一个简单的入门指南,告诉你如何用 Python 结合 Slack API 建立你第一个聊天机器人。

我们通过搭建你的开发环境, 获得一个 Slack API 的聊天机器人令牌,并用 Pyhon 开发一个简单聊天机器人。

我们所需的工具

我们的聊天机器人我们将它称作为“StarterBot”,它需要 Python 和 Slack API。要运行我们的 Python 代码,我们需要:

当你在本教程中进行构建时,Slack API 文档 是很有用的。

本教程中所有的代码都放在 slack-starterbot 公共库里,并以 MIT 许可证开源。

搭建我们的环境

我们现在已经知道我们的项目需要什么样的工具,因此让我们来搭建我们所的开发环境吧。首先到终端上(或者 Windows 上的命令提示符)并且切换到你想要存储这个项目的目录。在那个目录里,创建一个新的 virtualenv 以便和其他的 Python 项目相隔离我们的应用程序依赖关系。

virtualenv starterbot

激活 virtualenv:

source starterbot/bin/activate

你的提示符现在应该看起来如截图:

已经激活的 starterbot 的 virtualenv的命令提示符

这个官方的 slack 客户端 API 帮助库是由 Slack 建立的,它可以通过 Slack 通道发送和接收消息。通过这个 pip 命令安装 slackclient 库:

pip install slackclient

pip 命令完成时,你应该看到类似这样的输出,并返回提示符。

在已经激活的 virtualenv 用 pip 安装 slackclient 的输出

我们也需要为我们的 Slack 项目获得一个访问令牌,以便我们的聊天机器人可以用它来连接到 Slack API。

Slack 实时消息传递(RTM)API

Slack 允许程序通过一个 Web API 来访问他们的消息传递通道。去这个 Slack Web API 页面 注册建立你自己的 Slack 项目。你也可以登录一个你拥有管理权限的已有账号。

使用 Web API页面的右上角登录按钮

登录后你会到达 聊天机器人用户页面

定制聊天机器人用户页面

给你的聊天机器人起名为“starterbot”然后点击 “Add bot integration” 按钮。

添加一个bot integration 并起名为“starterbot”

这个页面将重新加载,你将看到一个新生成的访问令牌。你还可以将标志改成你自己设计的。例如我给的这个“Full Stack Python”标志。

为你的新 Slack 聊天机器人复制和粘贴访问令牌

在页面底部点击“Save Integration”按钮。你的聊天机器人现在已经准备好连接 Slack API。

Python 开发人员的一个常见的做法是以环境变量输出秘密令牌。输出的 Slack 令牌名字为SLACK_BOT_TOKEN

export SLACK_BOT_TOKEN='你的 slack 令牌粘帖在这里'

好了,我们现在得到了将这个 Slack API 用作聊天机器人的授权。

我们建立聊天机器人还需要更多信息:我们的聊天机器人的 ID。接下来我们将会写一个简短的脚本,从 Slack API 获得该 ID。

获得我们聊天机器人的 ID

这是最后写一些 Python 代码的时候了! 我们编写一个简短的 Python 脚本获得 StarterBot 的 ID 来热身一下。这个 ID 基于 Slack 项目而不同。

我们需要该 ID,当解析从 Slack RTM 上发给 StarterBot 的消息时,它用于对我们的应用验明正身。我们的脚本也会测试我们 SLACK_BOT_TOKEN 环境变量是否设置正确。

建立一个命名为 printbotid.py 的新文件,并且填入下面的代码:

import os
from slackclient import SlackClient

BOT_NAME = 'starterbot'

slack_client = SlackClient(os.environ.get('SLACK_BOT_TOKEN'))

if __name__ == "__main__":
    api_call = slack_client.api_call("users.list")
    if api_call.get('ok'):
        # retrieve all users so we can find our bot
        users = api_call.get('members')
        for user in users:
            if 'name' in user and user.get('name') == BOT_NAME:
                print("Bot ID for '" + user['name'] + "' is " + user.get('id'))
    else:
        print("could not find bot user with the name " + BOT_NAME)

我们的代码导入 SlackClient,并用我们设置的环境变量 SLACK_BOT_TOKEN 实例化它。 当该脚本通过 python 命令执行时,我们通过会访问 Slack API 列出所有的 Slack 用户并且获得匹配一个名字为“satrterbot”的 ID。

这个获得聊天机器人的 ID 的脚本我们仅需要运行一次。

python print_bot_id.py

当它运行为我们提供了聊天机器人的 ID 时,脚本会打印出简单的一行输出。

在你的 Slack 项目中用 Python 脚本打印 Slack 聊天机器人的 ID

复制这个脚本打印出的唯一 ID。并将该 ID 作为一个环境变量 BOT_ID 输出。

(starterbot)$ export BOT_ID='bot id returned by script'

这个脚本仅仅需要运行一次来获得聊天机器人的 ID。 我们现在可以在我们的运行 StarterBot 的 Python应用程序中使用这个 ID 。

编码我们的 StarterBot

现在我们拥有了写我们的 StarterBot 代码所需的一切。 创建一个新文件命名为 starterbot.py ,它包括以下代码。

import os
import time
from slackclient import SlackClient

osSlackClient 的导入我们看起来很熟悉,因为我们已经在 theprintbotid.py 中用过它们了。

通过我们导入的依赖包,我们可以使用它们获得环境变量值,并实例化 Slack 客户端。

# starterbot 的 ID 作为一个环境变量
BOT_ID = os.environ.get("BOT_ID")

# 常量
AT_BOT = "<@" + BOT_ID + ">:"
EXAMPLE_COMMAND = "do"

# 实例化 Slack 和 Twilio 客户端
slack_client = SlackClient(os.environ.get('SLACK_BOT_TOKEN'))

该代码通过我们以输出的环境变量 SLACK_BOT_TOKEN 实例化SlackClient` 客户端。

if __name__ == "__main__":
    READ_WEBSOCKET_DELAY = 1 # 1 从 firehose 读取延迟 1 秒
    if slack_client.rtm_connect():
        print("StarterBot connected and running!")
        while True:
            command, channel = parse_slack_output(slack_client.rtm_read())
            if command and channel:
                handle_command(command, channel)
            time.sleep(READ_WEBSOCKET_DELAY)
    else:
        print("Connection failed. Invalid Slack token or bot ID?")

Slack 客户端会连接到 Slack RTM API WebSocket,然后当解析来自 firehose 的消息时会不断循环。如果有任何发给 StarterBot 的消息,那么一个被称作 handle_command 的函数会决定做什么。

接下来添加两个函数来解析 Slack 的输出并处理命令。

def handle_command(command, channel):
    """
        Receives commands directed at the bot and determines if they
        are valid commands. If so, then acts on the commands. If not,
        returns back what it needs for clarification.
    """
    response = "Not sure what you mean. Use the *" + EXAMPLE_COMMAND + \
               "* command with numbers, delimited by spaces."
    if command.startswith(EXAMPLE_COMMAND):
        response = "Sure...write some more code then I can do that!"
    slack_client.api_call("chat.postMessage", channel=channel,
                          text=response, as_user=True)

def parse_slack_output(slack_rtm_output):
    """
        The Slack Real Time Messaging API is an events firehose.
        this parsing function returns None unless a message is
        directed at the Bot, based on its ID.
    """
    output_list = slack_rtm_output
    if output_list and len(output_list) > 0:
        for output in output_list:
            if output and 'text' in output and AT_BOT in output['text']:
                # 返回 @ 之后的文本,删除空格
                return output['text'].split(AT_BOT)[1].strip().lower(), \
                       output['channel']
    return None, None

parse_slack_output 函数从 Slack 接受信息,并且如果它们是发给我们的 StarterBot 时会作出判断。消息以一个给我们的聊天机器人 ID 的直接命令开始,然后交由我们的代码处理。目前只是通过 Slack 管道发布一个消息回去告诉用户去多写一些 Python 代码!

这是整个程序组合在一起的样子 (你也可以 在 GitHub 中查看该文件):

import os
import time
from slackclient import SlackClient

# starterbot 的 ID 作为一个环境变量
BOT_ID = os.environ.get("BOT_ID")

# 常量
AT_BOT = "<@" + BOT_ID + ">:"
EXAMPLE_COMMAND = "do"

# 实例化 Slack 和 Twilio 客户端
slack_client = SlackClient(os.environ.get('SLACK_BOT_TOKEN'))

def handle_command(command, channel):
    """
        Receives commands directed at the bot and determines if they
        are valid commands. If so, then acts on the commands. If not,
        returns back what it needs for clarification.
    """
    response = "Not sure what you mean. Use the *" + EXAMPLE_COMMAND + \
               "* command with numbers, delimited by spaces."
    if command.startswith(EXAMPLE_COMMAND):
        response = "Sure...write some more code then I can do that!"
    slack_client.api_call("chat.postMessage", channel=channel,
                          text=response, as_user=True)

def parse_slack_output(slack_rtm_output):
    """
        The Slack Real Time Messaging API is an events firehose.
        this parsing function returns None unless a message is
        directed at the Bot, based on its ID.
    """
    output_list = slack_rtm_output
    if output_list and len(output_list) > 0:
        for output in output_list:
            if output and 'text' in output and AT_BOT in output['text']:
                # 返回 @ 之后的文本,删除空格
                return output['text'].split(AT_BOT)[1].strip().lower(), \
                       output['channel']
    return None, None

if __name__ == "__main__":
    READ_WEBSOCKET_DELAY = 1 # 1 second delay between reading from firehose
    if slack_client.rtm_connect():
        print("StarterBot connected and running!")
        while True:
            command, channel = parse_slack_output(slack_client.rtm_read())
            if command and channel:
                handle_command(command, channel)
            time.sleep(READ_WEBSOCKET_DELAY)
    else:
        print("Connection failed. Invalid Slack token or bot ID?")

现在我们的代码已经有了,我们可以通过 python starterbot.py 来运行我们 StarterBot 的代码了。

当 StarterBot 开始运行而且连接到 API 的输出通道

在 Slack 中创建新通道,并且把 StarterBot 邀请进来,或者把 StarterBot 邀请进一个已经存在的通道中。

在 Slack 界面创建一个新通道并且邀请 StarterBot

现在在你的通道中给 StarterBot 发命令。

在你的 Slack 通道里给你的 StarterBot 发命令

如果你从聊天机器人得到的响应中遇见问题,你可能需要做一个修改。正如上面所写的这个教程,其中一行 AT_BOT = "<@" + BOT_ID + ">:",在“@starter”(你给你自己的聊天机器人起的名字)后需要一个冒号。从 AT_BOT 字符串后面移除:。Slack 似乎需要在@ 一个人名后加一个冒号,但这好像是有些不协调的。

结束

好吧,你现在已经获得一个简易的聊天机器人,你可以在代码中很多地方加入你想要创建的任何特性。

我们能够使用 Slack RTM API 和 Python 完成很多功能。看看通过这些文章你还可以学习到什么:

有问题? 通过 Twitter 联系我 @fullstackpython@mattmakai。 我在 GitHub 上的用户名是 mattmakai

这篇文章感兴趣? Fork 这个 GitHub 上的页面吧。


via: https://www.fullstackpython.com/blog/build-first-slack-bot-python.html

作者:Matt Makai 译者:jiajia9llinuxer 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出aa