6 if 'SLACK_SIGNING_SECRET' in os.environ:
7 slack_signing_secret = os.environ['SLACK_SIGNING_SECRET']
9 ssm = boto3.client('ssm')
10 response = ssm.get_parameter(Name='SLACK_SIGNING_SECRET',
12 slack_signing_secret = response['Parameter']['Value']
13 os.environ['SLACK_SIGNING_SECRET'] = slack_signing_secret
15 slack_signing_secret = bytes(os.environ['SLACK_SIGNING_SECRET'], 'utf-8')
17 def slack_is_valid_request(slack_signature, timestamp, body):
18 """Returns True if the timestamp and body correspond to signature.
20 This implements the Slack signature verification using the slack
21 signing secret (obtained via an SSM parameter in code above)."""
23 content = "v0:{}:{}".format(timestamp, body).encode('utf-8')
25 signature = 'v0=' + hmac.new(slack_signing_secret,
27 hashlib.sha256).hexdigest()
29 if hmac.compare_digest(signature, slack_signature):
32 print("Bad signature: {} != {}".format(signature, slack_signature))
35 def slack_channel_members(slack_client, channel_id):
41 response = slack_client.conversations_members(channel=channel_id,
44 response = slack_client.conversations_members(channel=channel_id)
47 members += response['members']
49 print("Error querying members of channel {}: {}"
50 .format(channel_id, response['error']))
54 if 'next_cursor' in response['response_metadata']:
55 cursor = response['response_metadata']['next_cursor']
57 if not cursor or cursor == '':
62 def slack_send_message(slack_client, channel_id, text, blocks=None):
64 slack_client.chat_postMessage(channel=channel_id,
65 text=text, blocks=blocks)
67 slack_client.chat_postMessage(channel=channel_id, text=text)