By Alexandra Mehlhase, PhD
This operation will take Canvas groups and create-and-populate corresponding private channels in a Slack workspace
SlackGroups_privateChannels.py
#Slack token create
#<https://api.slack.com/custom-integrations/legacy-tokens>
import subprocess
import json
import requests
import sys
with open('config.json') as f:
configData = json.load(f)
c_token = configData['c_token']
s_token = configData['s_token']
courseName = configData["courseName"]
groupCategory = configData['groupCategory']
canvas = configData["useCanvas"]
group_append = configData["group_append"]
###################### CANVAS ############################
if canvas:
# Read group information
header = {'Authorization': 'Bearer ' + c_token}
http = "<https://canvas.instructure.com/api/v1/>"
res = requests.get(http +'courses?page=1&per_page=100', headers = header)
data = res.json()
for i in range(0,len(data)):
if data[i]["course_code"] == courseName:
id = data[i]['id']
break;
res = requests.get(http +'courses/'+str(id)+'/group_categories/', headers = header)
groupData = res.json()
i=0
for i in range(0,len(groupData)):
if groupData[i]["name"] == groupCategory:
group_id = groupData[i]['id']
break;
if group_id == None:
sys.exit("Group Category not found")
res = requests.get(http +'group_categories/'+str(group_id)+'/groups?page=1&per_page=100', headers = header)
groups = res.json()
canvas_groups = {}
for i in range(0,len(groups)):
canvas_members = []
res = requests.get(http +'groups/'+str(groups[i]["id"])+'/users', headers = header)
members = res.json()
for j in range(0,len(members)):
canvas_members.append(members[j]["login_id"])
canvas_groups[groups[i]["name"]] = canvas_members
print(canvas_groups.keys())
print(canvas_groups)
else:
# Reading data and formatting it
canvas_groups = configData["groups"]
###################### SLACK ############################
#Get all team members:
res = requests.put('<https://slack.com/api/users.list?token='+s_token+'&pretty=1>')
data = res.json()
# map name to ids
members = data["members"]
nameToID = {}
for i in range(0, len(members)): #
nameToID[members[i]['name']] = members[i]['id']
print(nameToID)
#iterate through all groups
for key in canvas_groups:
#group name
name = key
groupMembers = canvas_groups[key]
# Create channel with an append if these were given in config (eg. instructor and general channels for same group)
channelIDs = []
if len(group_append) == 0:
res = requests.put('<https://slack.com/api/groups.create?token='+s_token+'&name='+name+'&pretty=1>')
data = res.json()
channelIDs.append(data["group"]['id'])
else:
for append in group_append:
res = requests.put('<https://slack.com/api/groups.create?token='+s_token+'&name='+name+append+'&pretty=1>')
print(name+append)
data = res.json()
channelIDs.append(data["group"]['id'])
#Set all team members:
for i in range(0, len(groupMembers)):
userID = nameToID[groupMembers[i]]
print(groupMembers[i])
for channelID in channelIDs:
res = requests.put('<https://slack.com/api/groups.invite?token='+s_token+'&channel='+channelID+'&user='+userID+'&pretty=1>')
{
"useCanvas": true,
"c_token": "CanvasTOKEN",
"courseName" : "CourseName",
"groupCategory": "GrouSetName",
"s_token": "Slack_TOKEN",
"groups": {"Group1": ["asurite1", "asurite2"], "Group2": ["asurite3", "asurite4"] },
"group_append":["_inst", "_gen"]
}
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/5118bf55-320a-4646-94f5-86f574af0815/SlackTeams.mp4