'Slack API - chat_deleteScheduledMessage not working
I have been trying to make a chatbot that schedules a message and then deletes the message before it would sent to the channel. Although, the scheduled message id and the responded id are identical, chat_deleteScheduledMessage does not seem to work.
Here is my script written in python.
import slack
import os
from pathlib import Path
from dotenv import load_dotenv
from flask import Flask,request,Response
from slackeventsapi import SlackEventAdapter
import string
from datetime import datetime, timedelta
import time
import pprint
printer = pprint.PrettyPrinter()
env_path = Path('.') / '.env'
load_dotenv(dotenv_path=env_path)
app = Flask(__name__)
slack_event_adapter = SlackEventAdapter(
os.environ['SIGNING_SECRET_'], '/slack/events', app)
client = slack.WebClient(token=os.environ['SLACK_TOKEN_'])
BOT_ID = client.api_call("auth.test")['user_id']
message_counts = {}
welcome_messages = {}
BAD_WORDS = ['hmm', 'no', 'tim']
SCHEDULED_MESSAGES = [
{'text': 'First message', 'post_at': str(int((
datetime.now() + timedelta(seconds=20)).timestamp())), 'channel': 'C02BT07KS8N'},
{'text': 'Second Message!', 'post_at': str(int((
datetime.now() + timedelta(seconds=30)).timestamp())), 'channel': 'C02BT07KS8N'}
]
class WelcomeMessage:
START_TEXT = {
'type': 'section',
'text': {
'type': 'mrkdwn',
'text': (
'Welcome to this awesome channel! \n\n'
'*Get started by completing the tasks!*'
)
}
}
DIVIDER = {'type': 'divider'}
def __init__(self, channel):
self.channel = channel
self.icon_emoji = ':robot_face:'
self.timestamp = ''
self.completed = False
def get_message(self):
return {
'ts': self.timestamp,
'channel': self.channel,
'username': 'Welcome Robot!',
'icon_emoji': self.icon_emoji,
'blocks': [
self.START_TEXT,
self.DIVIDER,
self._get_reaction_task()
]
}
def _get_reaction_task(self):
checkmark = ':white_check_mark:'
if not self.completed:
checkmark = ':white_large_square:'
text = f'{checkmark} *React to this message!*'
return {'type': 'section', 'text': {'type': 'mrkdwn', 'text': text}}
def send_welcome_message(channel, user):
if channel not in welcome_messages:
welcome_messages[channel] = {}
if user in welcome_messages[channel]:
return
welcome = WelcomeMessage(channel)
message = welcome.get_message()
response = client.chat_postMessage(**message)
welcome.timestamp = response['ts']
welcome_messages[channel][user] = welcome
def list_scheduled_messages(channel):
response = client.chat_scheduledMessages_list(channel=channel)
messages = response.data.get('scheduled_messages')
ids = []
for msg in messages:
ids.append(msg.get('id'))
return ids
def schedule_messages(messages):
ids = []
for msg in messages:
response = client.chat_scheduleMessage(
channel=msg['channel'], text=msg['text'], post_at=msg['post_at']).data
printer.pprint(response)
id_ = response.get('scheduled_message_id')
ids.append(id_)
print(ids)
return ids
def delete_scheduled_messages(ids, channel):
print(ids)
for _id in ids:
try:
client.chat_deleteScheduledMessage(
channel=channel, scheduled_message_id=_id)
except Exception as e:
print(e)
def check_if_bad_words(message):
msg = message.lower()
msg = msg.translate(str.maketrans('', '', string.punctuation))
return any(word in msg for word in BAD_WORDS)
@ slack_event_adapter.on('message')
def message(payload):
event = payload.get('event', {})
channel_id = event.get('channel')
user_id = event.get('user')
text = event.get('text')
if user_id != None and BOT_ID != user_id:
if user_id in message_counts:
message_counts[user_id] += 1
else:
message_counts[user_id] = 1
if text.lower() == 'start':
send_welcome_message(f'@{user_id}', user_id)
elif check_if_bad_words(text):
ts = event.get('ts')
client.chat_postMessage(
channel=channel_id, thread_ts=ts, text="THAT IS A BAD WORD!")
@ slack_event_adapter.on('reaction_added')
def reaction(payload):
event = payload.get('event', {})
channel_id = event.get('item', {}).get('channel')
user_id = event.get('user')
if f'@{user_id}' not in welcome_messages:
return
welcome = welcome_messages[f'@{user_id}'][user_id]
welcome.completed = True
welcome.channel = channel_id
message = welcome.get_message()
updated_message = client.chat_update(**message)
welcome.timestamp = updated_message['ts']
@ app.route('/message-count', methods=['POST'])
def message_count():
data = request.form
user_id = data.get('user_id')
channel_id = data.get('channel_id')
message_count = message_counts.get(user_id, 0)
client.chat_postMessage(
channel=channel_id, text=f"Message: {message_count}")
return Response(), 200
if __name__ == "__main__":
ids = schedule_messages(SCHEDULED_MESSAGES)
#ids = list_scheduled_messages('C02BT07KS8N')
delete_scheduled_messages(ids, 'C02BT07KS8N')
app.run(debug=True)
The error message is here:
['Q02CZ2M312L', 'Q02CFKHES5S']
['Q02CZ2M312L', 'Q02CFKHES5S']
The request to the Slack API failed. The server responded with:
{'ok': False, 'error': 'invalid_scheduled_message_id'}
The request to the Slack API failed. The server responded with:
{'ok': False, 'error': 'invalid_scheduled_message_id'}
Solution 1:[1]
there is Restrictions https://api.slack.com/methods/chat.deleteScheduledMessage
Restrictions
You cannot delete scheduled messages that have already been posted to Slack or that will be posted to Slack within 60 seconds of the delete request. If attempted, this method will respond with an invalid_scheduled_message_id error.
you scheduled too short time to delete. so better to schedule more than 60 seconds later.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Joy Jo |