首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中使用slackbot?

如何在python中使用slackbot?
EN

Stack Overflow用户
提问于 2018-01-05 21:56:10
回答 2查看 2.3K关注 0票数 2

我正在尝试为我的小组建立一个slackbot,我尝试了样本代码和其他一些东西,但它不发送消息给小组。

首先,我尝试了通过终端

代码语言:javascript
复制
export SLACK_API_TOKEN="my_token_id"

然后

代码语言:javascript
复制
from slackclient import SlackClient
import os

slack_token = os.environ["SLACK_API_TOKEN"]
sc = SlackClient(slack_token)

sc.api_call(
  "chat.postMessage",
  channel="#random",
  text="Hello from Python! :tada:",
  thread_ts="283.5127(dummy_id)",
  reply_broadcast=False
)

print(sc)

#<slackclient.client.SlackClient object at 0x109b77ba8>

但在松弛组中没有消息。

我尝试使用以下代码:

代码语言:javascript
复制
from slackclient import SlackClient
import os
slack_token = os.environ['SLACK_API_TOKEN']
sc = SlackClient(slack_token)
print(sc.api_call("channels.list"))

它的重新调整:

代码语言:javascript
复制
{'error': 'invalid_auth', 'ok': False}

我没有得到我做错了什么,访问令牌是正确的,我想通过机器人发布一些消息,那么我如何在slack上创建一个机器人,并使用该机器人我可以通过python发送消息?

EN

回答 2

Stack Overflow用户

发布于 2018-01-05 23:12:08

当我用php & symfony实现一个slack bot时,我也遇到了类似的问题。正确地创建和配置松弛的应用程序、机器人和OAuth权限并不那么简单。

如果你需要的话,我在这篇博文中解释了所有这些配置:https://blog.eleven-labs.com/en/en/replace-erp-by-slack-bot-with-dialogflow-and-symfony/

此外,我用PHP编写的代码与解析Slack请求和post到其API所需的代码非常相似。

摘要,TL;DR:

  • 转到https://api.slack.com/apps并单击“”创建新应用程序“”。
  • 在此应用程序配置中,转到左侧菜单“”机器人用户“”或从“”基本信息“”>“”添加特性和功能“”>“”机器人“”。
  • 仍在此应用程序配置中,转到“”OAuth&Permissions“”菜单并允许范围“”chat:write:bot“”,从代码中复制“”OAuth Access token“”的值“”
  • “”,使用以前的令牌值调用带有“”Authorization“”标头的“”chat.postMessage“”API方法。<代码>H210<代码>F211
票数 1
EN

Stack Overflow用户

发布于 2018-02-27 03:37:18

这是从网络上找到的一些示例构建的:liza daly - brobot : github.comHow to Build Your First Slack Bot with Python : fullstackpython.com

当然不是最好的实现,但它可以作为(我认为)的适当答案

代码语言:javascript
复制
import random
import time
import re
from slackclient import SlackClient
bot_id = None
slack_token = 'xoxb-no.more.mister.nice.gui'
sc = SlackClient(slack_token)

# constants

RTM_READ_DELAY = 1 # 1 second delay between reading from RTM
DEFAULT_RESPONSE = "greetings: 'hello', 'hi', 'greetings', 'sup', 'what's     up' / commands: 'do'"
DEFAULT_COMMAND = "do"
MENTION_REGEX = "^<@(|[WU].+?)>(.*)"

def parse_bot_commands(slack_events):
    """
    parses a list of events coming from the slack rtm api to find bot commands
    :param slack_events:
    :return:
"""
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 == bot_id:
            return message, event["channel"]
return None, None
def parse_direct_mention(message_text):
"""
finds direct message and returns user id
:param message_text:
:return:
"""
matches = re.search(MENTION_REGEX, message_text)
# the first group contains the user name, the second group contains
# the remaining message

return (matches.group(1), matches.group(2).strip()) if matches else (None, None)
def handle_command(command, channel):
"""
    executes bot command if the command is known
:param command:
:param channel:
:return:
"""
GREETING_KEYWORDS = ("hello", "hi", "greetings", "sup", "what's up",)
GREETING_RESPONSES = ["'sup brah", "hey", "*headnod*", "didjageddathingahsencha?"]

# default response is help text for the user
default_response = "Not sure what you mean. Try *{}*.".format(DEFAULT_RESPONSE)

# finds and executes the given command, filling the response
response = None

#implement more commands below this line
if command in GREETING_KEYWORDS:
    response = random.choice(GREETING_RESPONSES)
else:
    if command.startswith(DEFAULT_COMMAND):
        response = "Sure...write some more code and I'll do that"

# Sends the response back to the channel
sc.api_call(
    "chat.postMessage",
    channel="#the_danger_room",
    as_user="true:",
    text=response or default_response)

if __name__ == "__main__":
if sc.rtm_connect(with_team_state=False):
    print("Connected and running!")

    #call web api method auth.test to get bot usre id
    bot_id = sc.api_call("auth.test")["user_id"]
    while True:
        command, channel = parse_bot_commands(sc.rtm_read())
        if command:
            handle_command(command, channel)
        time.sleep(RTM_READ_DELAY)
    else:
        print("Connection failed. Exception traceback printed above.")
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48115068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档