Reputation: 53
I'm not sure how much detail to provide, but I'll try to put everything that I feel is relevant.
I have a slash command that I do some logic with through AWS Lambda and API Gateway. I'm using the python slackclient module and through that I'm sending messages back into slack with the WebClient. To clarify, I'm using the new bot token system Slack has come up with, not the classic bot
one.
From my understanding, using a webhook to send messages in all channels in a workspace is very painful, as a webhook is provided per channel. Thus I'm using the WebClient to interface with Slack and send messages in public channels. The problem I'm facing is that unless I add my app to a channel, the command doesn't work. The Cloudwatch logs show me that the events are coming in just fine, as I see the event fine. I also see the following log by using sys.exc_info()
:
(<class 'slack.errors.SlackApiError'>, SlackApiError("The request to the Slack API failed.\nThe server responded with: {'ok': False, 'error': 'not_in_channel'}"), <traceback object at 0x7ff4a0dc32c0>)
Based on that, it looks to me like sending a message back into channels I've not added this app into doesn't seem to work, but I'm not sure what OAuth permissions/scopes would be needed for this. I've enabled the following scopes for the bot token:
channels:read
chat:write
commands
As per my understanding, I don't need to add any user scopes, since I want my app/bot itself to respond, and not respond on behalf of a user.
In short, my desired behaviour is to add this app to my workspace and immediately be have it reply to a slash command regardless of which public channel the slash command has been invoked from.
The current behaviour is that the app is able to get event data from all public channels when the slash command is invoked from any of them, yet it's unable to send messages in channels the command is invoked in unless it is in the channel.
Any help given would be much appreciated!
Upvotes: 3
Views: 5739
Reputation: 583
For people migrating apps from the deprecated :bot scope, the new scope is now ready.
Add chat:write.public
to your Bot Token Scopes
and the error not_in_channel
will not be returned anymore for public channels.
Good news: with two special scopes, you can gain those abilities by asking for them explicitly. Request the chat:write.public scope and chat:write.customize scope, respectively, to gain the ability post in all public channels and adjust your app's message authorship.
https://api.slack.com/authentication/quickstart#public
Upvotes: 8
Reputation: 53
I messaged Slack help, and it turns out this functionality isn't available with the new granular bot permissions yet. As per this Slack documentation:
Currently, your app must be a member of any channel it wishes to post messages to. To join a channel, request the channels:join scope and call the conversations.join method. However, apps will soon be able to post in any public channel, without gaining additional access to the channel, by requesting a new scope.
It looks like this won't be an issue when the functionality is added by Slack.
Upvotes: 2