我正在使用新的slack 2.0python库开发slack bot。我不熟悉python装饰器,我怀疑这是我问题的一部分。在
这是我的密码。。。在
#!/opt/rh/rh-python36/root/usr/bin/python
import os
import slack
# instantiate Slack client
slack_token = os.environ['SLACK_BOT_TOKEN']
rtmclient = slack.RTMClient(token=slack_token)
webclient = slack.WebClient(token=slack_token)
# get the id of my user
bot_id = webclient.auth_test()['user_id']
print('Bot ID: {0}'.format(bot_id))
def get_user_info(user_id):
user_info = webclient.users_info(user=user_id)['ok']
return user_info
@slack.RTMClient.run_on(event='message')
def parse_message(**payload):
data = payload['data']
user_id = data['user']
print(get_user_info(user_id))
rtmclient.start()
它在启动时输出Bot ID(使用webclient
),但是当我再次调用webclient
时,它会以RuntimeError: This event loop is already running
崩溃。在
真正让我困惑的是,如果我注释掉第一个调用webclient.auth_test()
的行,我就没有任何问题。每次webclient.users_info()
发送数据时,我对webclient.users_info()
的调用都有效。在
#!/opt/rh/rh-python36/root/usr/bin/python
import os
import slack
# instantiate Slack client
slack_token = os.environ['SLACK_BOT_TOKEN']
rtmclient = slack.RTMClient(token=slack_token)
webclient = slack.WebClient(token=slack_token)
# get the id of my user
#bot_id = webclient.auth_test()['user_id']
#print('Bot ID: {0}'.format(bot_id))
def get_user_info(user_id):
user_info = webclient.users_info(user=user_id)['ok']
return user_info
@slack.RTMClient.run_on(event='message')
def parse_message(**payload):
data = payload['data']
user_id = data['user']
print(get_user_info(user_id))
rtmclient.start()
[root@slackbot-01 bin]# scl enable rh-python36 /root/slackbot/bin/slackbot.py
True
True
^C[root@slackbot-01 bin]#
我需要获取机器人id,这样我就可以确保它不会回复自己的消息。我不明白为什么在用修饰符获得parse message函数之外的bot id后,我的代码就不能工作了。在
我做错什么了?在
python事件循环对于编程库来说是一件棘手的事情,在SlackClient的2.0版本中,事件队列的管理方式存在一些问题。看起来2.1版做了一些改进,但它似乎是一个正在进行的工作,我仍然遇到这个问题。我希望将来会有更新使它更健壮。在
同时,文件顶部的以下代码(使用pip安装)通常会为我解决此问题:
请记住,这将改变应用程序其余部分处理事件队列的方式(如果这是一个因素)。在
如果您使用的是RTM,RTMClient会为您创建一个WebClient。当您处理事件时,它的句柄应该在有效负载中传递给您。您可以通过查找总是在RTM成功连接后调度的“open”事件并在“open”事件处理程序中进行查找来检查您的ID。在
相关问题 更多 >
编程相关推荐