By Alexandra Mehlhase, PhD


This operation will take Canvas groups and create-and-populate corresponding private channels in a Slack workspace

1. Some Python code (linked and displayed below)

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>')

2. The JSON (linked and displayed below)

config.json

{
	"useCanvas": true,
    "c_token": "CanvasTOKEN", 	
    "courseName" : "CourseName",
    "groupCategory": "GrouSetName",
	"s_token": "Slack_TOKEN",
	"groups": {"Group1": ["asurite1", "asurite2"], "Group2": ["asurite3", "asurite4"] },
	"group_append":["_inst", "_gen"]
}

3. Video to show the process

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/5118bf55-320a-4646-94f5-86f574af0815/SlackTeams.mp4