python创建slack bot

2024-03-26 11:40
文章标签 python 创建 slack bot

本文主要是介绍python创建slack bot,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

搭建环境:这边使用的是Python3

(1)使用vistualenv 创建一个与其他python项目隔离的环境

virtualenv starterbot

(2)激活virtualenv

source starterbot/bin/activate

(3)安装slackclient

Slack构建的官方API帮助程序库可以发送和接收来自Slack频道的消息

pip3 install slackclient

(4)登录slack官网,注册一个账号,戳账号注册 

(5)注册之后来到  戳slackAPI   选择 start building->create a slack app

还需要创建一个Slack App来为你的机器人接收一个API令牌。使用xxx(按照喜好取名)作为你的应用程序名称。如果你登录了多个工作区,请从下拉列表中选择一个开发工作区



(6)填入app的名字,和之前注册slack加入的workspace


(7)create App之后,进入app的配置页面


(8)我们希望我们的Starter Bot像您团队中的任何其他用户一样出现 - 它将参与渠道,小组和DM中的对话。在Slack App中,这被称为bot用户,我们通过在“功能”部分下选择“Bot Users”来设置它。点击“Add a Bot User”后,您应该选择一个显示名称,选择一个默认的用户名,并通过点击“添加Bot用户”保存您的选择


(9)“Add Bot User”之后,回到 Settings->Install App 把应用程序安装到我们的开发工作区中。一旦安装了该应用程序,它将显示一个bot用户oauth访问令牌以作为bot用户进行身份验证


(10)将秘密令牌作为环境变量导出。回到终端中,导出Slack令牌,名称为SLACK_BOT_TOKEN

export SLACK_BOT_TOKEN='your bot user access token here'

现在我们被授权使用Slack RTM和Web API作为bot用户

开始编码

(1)创建一个名为flowerBot.py的文件,文件内先引入四个库

import os
import time
import re
from slackclient import SlackClient

(2)实例化SlackClient并使用刚才export出来的SLACK_BOT_TOKEN

#创建一个SlackClient的实例,并获取之前export出来的SLACK_BOT_TOKEN
slack_client = SlackClient(os.environ.get('SLACK_BOT_TOKEN'))#在bot启动之后,会获得一个userId,先初始化
starterbot_id = None#以下常量备用
RTM_READ_DELAY = 1    #RTM实时通讯,读完消息后,一秒延迟
EXAMPLE_COMMAND = "do"
MENTION_REGEX = "^<@(|[WU].+?)>(.*)"    # @xxx 使用到的正则表达式

(3)书写main函数

if __name__ == "__main__":#使用rtm_connect方法,启动bot;一旦连接成功后,会调用web api方法 (auth.test)去找到bot的user ID#每个bot在当前的app内都有属于自己的user ID,存储这个user ID 会帮助程序理解是谁在一个会话里提到了他if slack_client.rtm_connect(with_team_state=False):print("Starter Bot connected and running!")starterbot_id = slack_client.api_call("auth.test")["user_id"]while True:#对于每个读取的事件,该parse_bot_commands()函数确定事件是否包含Bot的命令。如果是,那么command将包含一个值,#该handle_command()函数决定如何处理该命令command, channel = parse_bot_commands(slack_client.rtm_read())if command:handle_command(command, channel)time.sleep(RTM_READ_DELAY)else:print("Connection failed. Exception traceback printed above.")

(4)写方法

parse_bot_commands()函数从Slack获取事件并确定它们是否是指向Starter Bot的命令。我们的机器人会遇到很多 事件类型,但为了查找命令我们只想考虑 消息事件消息事件也有子类型,但是我们想要查找的命令没有定义任何子类型。该函数通过检查这些属性过滤出无趣的事件。现在我们知道该事件代表了带有一些文本的消息,但我们想要了解文本中是否提到了Starter Bot。parse_direct_mention() 函数将从消息文本开始提到,然后我们将它与我们之前存储的Starter Bot的用户ID进行比较。如果它们相同,那么我们知道这是一个bot命令,并返回带有通道ID的命令文本。

parse_direct_mentions()函数使用正则表达式来确定消息开头是否提及用户它返回用户ID和剩余的消息(None, None如果没有发现任何提及)。

最后一个功能handle_command()就是在将来您将添加Starter Bot的所有有趣命令,幽默和个性。目前,它只有一个示例命令:do如果该命令以已知命令开始,则它将具有适当的响应。如果不是,则使用默认响应。通过调用chat.postMessage通道Web API方法将响应发送回Slack 


def parse_bot_commands(slack_events):"""解析来自Slack RTM API的事件列表以查找bot命令,如果找到了bot命令,则此函数返回一个命令和通道的元组,如果未找到,则此函数返回无。"""for event in slack_events:if event["type"] == "message" and not "subtype" in event:user_id, message = parse_direct_mention(event["text"])if user_id == starterbot_id:return message, event["channel"]return None, Nonedef parse_direct_mention(message_text):"""在消息文本中查找直接提及(在开头提及)并返回提到的用户ID。如果没有直接提及,则返回None"""matches = re.search(MENTION_REGEX, message_text)# 所述第一组包含的用户名,该第二组包含其余消息print('matches.group(1)', matches.group(1))print('matches.group(2).strip()', matches.group(2).strip())return (matches.group(1), matches.group(2).strip()) if matches else (None, None)def handle_command(command, channel):"""如果命令已知,则执行机器人命令"""# 默认响应是用户的帮助文本default_response = "Not sure what you mean. Try *{}*.".format(EXAMPLE_COMMAND)# 查找并执行给定的命令,填充响应response = None# 这是您开始执行更多命令的地方!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 or default_response)

(5)整体

以上自己拼一下吧,哈哈哈

运行这个python文件,出现 Starter Bot connected and running! 说明就成功了

原文参照:https://www.fullstackpython.com/blog/build-first-slack-bot-python.html



这篇关于python创建slack bot的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/848388

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',