「Slack」如何用 Slack 和 Kubernetes 构建一个聊天机器人?| 附代码( 三 )


但是 , 在ChatOps的背景下 , 经典的应用程序允许我们使用WebSockets连接到Slack 。 我们的聊天机器人服务器将对Slack端点使用HTTP GET调用 。Slack服务器将保持连接打开并向我们的聊天机器人流更新 。
这意味着我们不需要在DevOps基础架构上打开传入的端点 。 相反 , 我们将使用传出连接 。
由于ChatOps服务器通常会以提升的权限运行 , 因此很难向外界端口开放 。 通过使用经典的App和websockets连接 , 我们为网络犯罪分子关闭了另一个攻击角度 。
服务器将支持4个命令:
set-app为用户设置应用程序 。 因此 , 我们不必在每次使用其他命令时都提供应用程序名称 。 一种简单的安全访问方法是仅允许管理员用户执行此命令 。
get-app为用户获取应用程序 。
logs和describe用来检索所选应用程序的窗格上的日志和信息 。
要存储选定的应用程序 , 我们将在db.py模块中使用嵌入式sqllite3数据库 。
主事件循环如下所示:
@RTMClient.run_on(event="message") # subscribe to 'message' events
def process_command(**payload):
data = http://news.hoteastday.com/a/payload['data']
web_client = payload['web_client']
print(payload)
# ignore service messages, like joining a channel
is_service = 'subtype' in data and data['subtype'] is not None
if not is_service and 'text' in data:
channel_id = data['channel']
thread_ts = data['ts']
user = data['user']
text = data['text'] # get data from the event
tokens = text.split # split it up by space characters
me = tokens[0] # user id of the cht bot
# object to track the conversation state
conv = Conversation(web_client, channel_id, user)
if len(tokens) > 1:
print(tokens)
# first token is my userid, second will be the command e.g. logs
command = tokens[1]
print('received command ' + command)
if command in commands:
# get the actual command executor
command_func = commands[command]
try:
args = tokens[slice(2, len(tokens))]
# execute the command
result = command_func(conv, args)
if result is not None:
# and return the value from the
# command back to the user
conv.msg(result)
except Exception as e:
conv.msg(str(e))
else:
# show welcome message
web_client.chat_postMessage(
conv.msg(welcome.format(user=user, me=me))
)
else:
# show welcome message
conv.msg(welcome.format(user=user, me=me)
它使用@ RTMClient.run_on(event =” message”)进行注释 , 每次在当前聊天中发送消息时 , Python Slack客户端都会调用该方法 。
为了确保我们没有收到自己的消息 , 也没有服务消息(“…已经加入了对话”) , 我们使用这一行代码:
is_service = ‘subtype’ in data and data[‘subtype’] is not None 收到消息后 , 我们将其转换为令牌并获取每个命令的实际处理程序 , 然后单个命令将解析传入的参数 。 例如 。set-app命令会将应用程序存储在用户数据库中 , 以供用户使用 。 为了实现这一点 , 我们使用os.popen(cmd):
def logs(pod, namespace):
cmd = f'kubectl logs {pod} --namespace={namespace}'
print(f'Executing {cmd}')
stream = os.popen(cmd)


推荐阅读