Slack Events API - Only able to subscribe to messages posted in public channels? - ruby

I just finished integrating a Slack app into my Slack workspace, and now I'm trying to simply subscribe to events so that I can respond to certain types of messages. However, I noticed that the POST request from the Slack Event Subscription process is only occurring when a message in a public channel is being posted, not private channels.
The bot user is in both the public and the private channel, so I'm not quite sure why this is happening. The only thing that I can see in the documentation (https://api.slack.com/apis/connections/events-api) is this:
Permission model
The Events API leverages Slack's existing object-driven OAuth scope
system to control access to events. For example, if your app has
access to files through the files:read scope, you can choose to
subscribe to any or none of the file-related events like file_created
and file_deleted.
You will only receive events that users who've authorized your app can
"see" on their workspace (that is, if a user authorizes access to
private channel history, you'll only see the activity in private
channels they are a member of, not all private channels across the
workspace).
Bot users may also subscribe to events on their own behalf. The bot
scope requested when workspaces install your bot covers events access
for both the Events API and the Real Time Messaging API.
but this still doesn't clarify why it's not subscribing to private channels, only public channels.

Assuming you are subscribed to 'Message' event.
To receive 'message' event from different conversation types, you need different scopes.
https://api.slack.com/events/message
Required scopes : channels:history, groups:history, im:history, mpim:history
Scope required for Private channel is groups:history

Related

Retrieve Slack private channels without adding bot to them

I want to retrieve all channels in my workspace using Slack API but my private channels are not listed unless I add my bot to them using Slack desktop/mobile app
Is this even possible to accomplish? Since the scope for reading private channels states:
View basic information about private channels that your slack app has been added to
which implies I should add my bot to the channel before reading it.
Bot users behave similarly to regular Slack users in that they only have visibility into conversations they are members of. Unfortunately, there is no way to gather private channel data without the bot being in the channel.

app_mention not firing in private message

I have a bot with event scopes app_mention and messages.im. It also has OAuth scopes app_mentions.read, channels.history, chat.write, groups.history, and im.history.
If I # mention my bot in a public channel, a thread off of a public channel, or directly message my bot I get an event. But if I'm in a private message with someone else and # mention my bot, I don't get any events from the #mention.
What is the correct event scope to enable to get the event?
you can't unfortuantly. app_mention only works in conversations the bot would have access to. You would need each user to directly give you access to im history and monitor every message event for a mention of the bot itself (probably either some regex or similar to look for the <#bot_name>.
I know there was a link_names part of the json object being sent for message events but you'd still need to check the message body to make sure its your bot being mentioned and not another user

Slack Events API not working for normal users

I'm using slack api to send reply whenever there is any direct message to authenticated user. So I created app, enabled events api and verified webhook url and subscribed to messages.im event
I use regular oauth flow with scope(chat:write:user,users:read) to get the access token.
First I tried with the admin of the workspace and everything worked fine. Whenever there is a direct message between admin user and any other user, i'm receiving events to my callback.
NOW
when I tried same with normal user(user2) i'm not receiving any events back when there is direct message between user2 and some other user. I followed the same steps above.
User2 went through same oauth flow with same scopes and got the access token of his own. As I subscribed to events api, I should be able to received event callbacks to the url I mentioned.
Is there any issue here? Is this not how things work?
This is not supposed to work.
Your Slack app will only receive message events from channels / conversations, which the installing user is a member of (e.g. the admin is member of the direct messaging conversation between him and others). But it's not possible to get direct messages between other users.
This is how Slack's security architecture is designed. In general it is not possible for any Slack app to monitor all private and direct messaging channel, even if the installing use is an admin / owner.
A common workaround for private channels is to retrieve messages for a bot user and make sure that bot user is a member of all private channels you need to monitor. However, this workaround is not very practical for direct message conversations.
Turns out it is an issue with scopes, following is the message I received from slack support team, they are awesome.
Hi Sasikanth,
Thanks for getting back to me. I took a look and it seems that there was some change with the scopes requested when user2 installed the "My App Name" app.
Here are the scopes that each of these users received upon installing the "My App Name":
user1: im:history,users:read,chat:write:user
user2: users:read,chat:write:user
You'll notice that user 1 above has the im:history scope, whereas user 2 above does not. It's mentioned on the doc for the message.im event type (https://api.slack.com/events/message.im) that the im:history scope is needed.
That's the reason why you're not receiving the message.im event type for DMs sent to user 2.
I hope that helps to explain the issue. What you'll need to do is remove the authorization for user2 from: (my dev app url) and have that user reinstall the app with the appropriate scopes.

How to see that someone made public channel private in Slack?

I have no idea how to do it using EventsAPI from Slack.
So, our bot does this:
Creates public channel #test
Invites the bot to the channel using user token
From now on, we are using bot token to post messages on the channel
The problem happens when someone converts public channel to private. The ID of the channel changes and the bot gets error channel_not_found.
Do you have an idea how to track this change and update ID on our system automatically? Bot is still the member of the channel!
I found a way and it was also confirmed by Slack Help team.
Basically when channel is converted to private, you get these events:
channel_deleted with id of your public channel
member_joined_channel with id of new private channel and bot_id
When you get member_joined_channel, retrieve from Slack the name of new channel and if it matches your previous public channel then you know it is the same one but private now.
Slack does not allow to create channels with the same name so this is the indicator.
I just tested it with production app and it works! :)
I don't think that is currently possible.
Naturally, you would expect a specific Slack event for that case to fire, when a channel is converted, but there does not appear to be one. If you need this I would suggest to write a request they add an event for it.
One thing you can do is restricted who can create private channels in your Slack workplace to limit the risk of unintended use.
However, you can prevent this error from occurring by checking which public and private channels exist with conversations.list, and which channels you bot is a member with conversations.member.

How do I receive only the messages that are direct messages to my bot user?

I have successfully setup my slack bot app, have enabled events etc. I want to receive any direct messages that the members of my slack team send to my bot. For this, I have only enabled Bot Events and No Team Events like below
However, I do not get any event on my webhook on this setting.
If I enable message.im event under Team Events, then I start getting events. But then, I get every message that the user (who has installed the app) sends to any other user in the team.
How do I get only the messages that are sent to my bot user?
Update 1
Based on this SO question I created a private channel with the bot user. Even then, the messages in the private channel do not arrive in my webhook with the above event subscriptions.
Update 2
After reinstalling the app, it seems to be working fine. I have only used it for few minutes after the reinstall so far. I will keep posting here how it goes. It would still be interesting to know what went wrong where.
It is normal behavior that your script receives all messages (for every channel your bot is a member of), not only the messages sent directly to your bot. At this time you can not filter further in the event configuration. So you need to filter out any unwanted message in your script handling the event.
See also this answer.

Resources