“学生”和“教师”是用户个人资料与课程之间的特定映射,表示用户在课程中的角色。学生和教师身份并非全局性:用户可以在一个课程中被指定为教师,而在另一个课程中被指定为学生。“学生”或“教师”身份代表特定课程中特定用户的一组权限。
- 学生
- Student 资源表示以学生身份注册特定课程的用户。学生可以查看课程详细信息和该课程的教师。
- 教师
- 教师资源表示教授特定课程的用户。教师可以查看和更改课程详情、查看教师和学生,以及管理其他教师和学生。
学生和教师是通过用户的唯一 ID 或电子邮件地址(由 Directory API 返回)进行标识的。当前用户还可以使用 "me"
缩写来引用自己的 ID。
直接添加
网域管理员可以绕过邀请流程,直接将网域内的用户添加为网域内课程的教师或学生。如果课程的所有者位于管理员的网域中,则该课程会被视为位于管理员的网域中。对于经过身份验证的网域管理员网域之外的用户或课程,应用必须使用 invitations.create()
方法发送邀请,以征得用户同意。
添加或移除教师
网域管理员可以使用 teachers.create()
直接将网域内的教师添加到课程中,如以下示例所示:
.NET
using Google.Apis.Auth.OAuth2; using Google.Apis.Classroom.v1; using Google.Apis.Classroom.v1.Data; using Google.Apis.Services; using System; using System.Net; using Google; namespace ClassroomSnippets { // Class to demonstrate the use of Classroom Create Teacher API public class AddTeacher { /// <summary> /// Add teacher to the Course /// </summary> /// <param name="courseId"></param> /// <param name="teacherEmail"></param> /// <returns></returns> public static Teacher ClassroomAddTeacher( string courseId, string teacherEmail) { try { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredential credential = GoogleCredential.GetApplicationDefault() .CreateScoped(ClassroomService.Scope.ClassroomRosters); // Create Classroom API service. var service = new ClassroomService(new BaseClientService.Initializer { HttpClientInitializer = credential, ApplicationName = "Classroom API Snippet" }); var teacher = new Teacher { UserId = teacherEmail }; // Add the teacher to the course. teacher = service.Courses.Teachers.Create(teacher, courseId).Execute(); Console.WriteLine( "User '{0}' was added as a teacher to the course with ID '{1}'.\n", teacher.Profile.Name.FullName, courseId); return teacher; } catch (Exception e) { // TODO(developer) - handle error appropriately if (e is AggregateException) { Console.WriteLine("Credential Not found"); } else if (e is GoogleApiException) { Console.WriteLine("Failed to Add the teacher. Error message: {0}", e.Message); } else { throw; } } return null; } } }
Java
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Teacher; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.ArrayList; import java.util.Arrays; /* Class to demonstrate the use of Classroom Add Teacher API */ public class AddTeacher { /* Scopes required by this API call. If modifying these scopes, delete your previously saved tokens/ folder. */ static ArrayList<String> SCOPES = new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); /** * Add teacher to a specific course. * * @param courseId - Id of the course. * @param teacherEmail - Email address of the teacher. * @return newly created teacher * @throws IOException - if credentials file not found. * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ public static Teacher addTeacher(String courseId, String teacherEmail) throws GeneralSecurityException, IOException { // Create the classroom API client. final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); Classroom service = new Classroom.Builder( HTTP_TRANSPORT, GsonFactory.getDefaultInstance(), ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) .setApplicationName("Classroom samples") .build(); Teacher teacher = new Teacher().setUserId(teacherEmail); try { // Add a teacher to a specified course teacher = service.courses().teachers().create(courseId, teacher).execute(); // Prints the course id with the teacher name System.out.printf( "User '%s' was added as a teacher to the course with ID '%s'.\n", teacher.getProfile().getName().getFullName(), courseId); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 409) { System.out.printf("User '%s' is already a member of this course.\n", teacherEmail); } else if (error.getCode() == 403) { System.out.println("The caller does not have permission.\n"); } else { throw e; } } return teacher; } }
PHP
use Google\Client; use Google\Service\Classroom; use Google\Service\Classroom\Teacher; use Google\service\Exception; function addTeacher($courseId, $teacherEmail) { /* Load pre-authorized user credentials from the environment. TODO (developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ $client = new Client(); $client->useApplicationDefaultCredentials(); $client->addScope("https://www.googleapis.com/auth/classroom.profile.photos"); $service = new Classroom($client); $teacher = new Teacher([ 'userId' => $teacherEmail ]); try { // calling create teacher $teacher = $service->courses_teachers->create($courseId, $teacher); printf("User '%s' was added as a teacher to the course with ID '%s'.\n", $teacher->profile->name->fullName, $courseId); } catch (Exception $e) { if ($e->getCode() == 409) { printf("User '%s' is already a member of this course.\n", $teacherEmail); } else { throw $e; } } return $teacher; }
Python
import google.auth from googleapiclient.discovery import build from googleapiclient.errors import HttpError def classroom_add_teacher(course_id): """ Adds a teacher to a course with specific course_id. Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for the application. """ creds, _ = google.auth.default() # pylint: disable=maybe-no-member service = build("classroom", "v1", credentials=creds) teacher_email = "gduser1@workspacesamples.dev" teacher = {"userId": teacher_email} try: teachers = service.courses().teachers() teacher = teachers.create(courseId=course_id, body=teacher).execute() print( "User %s was added as a teacher to the course with ID %s" % (teacher.get("profile").get("name").get("fullName"), course_id) ) except HttpError as error: print('User "{%s}" is already a member of this course.' % teacher_email) return error return teachers if __name__ == "__main__": # Put the course_id of course for which Teacher needs to be added. classroom_add_teacher(453686957652)
如果您要代表已通过身份验证的教师添加其他教师,则必须使用 invitations.create()
方法。
您可以使用 teachers.delete()
方法从课程中移除其他教师。这只会将指定教师从课程中移除,不会影响其在其他课程中的授课身份或用户个人资料。
注册或移除学生
网域管理员可以使用 students.create()
方法直接在其网域中添加学生,如以下示例所示:
.NET
using Google.Apis.Auth.OAuth2; using Google.Apis.Classroom.v1; using Google.Apis.Classroom.v1.Data; using Google.Apis.Services; using System; using System.Net; using Google; namespace ClassroomSnippets { // Class to demonstrate the use of Classroom Create Student API public class AddStudent { public static Student ClassroomAddStudent(string courseId, string enrollmentCode) { try { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredential credential = GoogleCredential.GetApplicationDefault() .CreateScoped(ClassroomService.Scope.ClassroomRosters); var service = new ClassroomService(new BaseClientService.Initializer { HttpClientInitializer = credential, ApplicationName = "Classroom API .NET Quickstart" }); var student = new Student { UserId = "me" }; var request = service.Courses.Students.Create(student, courseId); request.EnrollmentCode = enrollmentCode; student = request.Execute(); Console.WriteLine( "User '{0}' was enrolled as a student in the course with ID '{1}'.\n", student.Profile.Name.FullName, courseId); } catch (Exception e) { // TODO(developer) - handle error appropriately if (e is AggregateException) { Console.WriteLine("Credential Not found"); } else if (e is GoogleApiException) { Console.WriteLine("Failed to Add the Student. Error message: {0}", e.Message); } else { throw; } } return null; } } }
Java
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Student; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.ArrayList; import java.util.Arrays; /* Class to demonstrate the use of Classroom Add Student API */ public class AddStudent { /* Scopes required by this API call. If modifying these scopes, delete your previously saved tokens/ folder. */ static ArrayList<String> SCOPES = new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); /** * Add a student in a specified course. * * @param courseId - Id of the course. * @param enrollmentCode - Code of the course to enroll. * @return newly added student * @throws IOException - if credentials file not found. * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ public static Student addStudent(String courseId, String enrollmentCode, String studentId) throws GeneralSecurityException, IOException { // Create the classroom API client. final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); Classroom service = new Classroom.Builder( HTTP_TRANSPORT, GsonFactory.getDefaultInstance(), ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) .setApplicationName("Classroom samples") .build(); Student student = new Student().setUserId(studentId); try { // Enrolling a student to a specified course student = service .courses() .students() .create(courseId, student) .setEnrollmentCode(enrollmentCode) .execute(); // Prints the course id with the Student name System.out.printf( "User '%s' was enrolled as a student in the course with ID '%s'.\n", student.getProfile().getName().getFullName(), courseId); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 409) { System.out.println("You are already a member of this course."); } else if (error.getCode() == 403) { System.out.println("The caller does not have permission.\n"); } else { throw e; } } return student; } }
PHP
use Google\Client; use Google\Service\Classroom; use Google\Service\Classroom\Student; use Google\Service\Exception; function enrollAsStudent($courseId,$enrollmentCode) { /* Load pre-authorized user credentials from the environment. TODO (developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ $client = new Client(); $client->useApplicationDefaultCredentials(); $client->addScope("https://www.googleapis.com/auth/classroom.profile.emails"); $service = new Classroom($client); $student = new Student([ 'userId' => 'me' ]); $params = [ 'enrollmentCode' => $enrollmentCode ]; try { $student = $service->courses_students->create($courseId, $student, $params); printf("User '%s' was enrolled as a student in the course with ID '%s'.\n", $student->profile->name->fullName, $courseId); } catch (Exception $e) { if ($e->getCode() == 409) { print "You are already a member of this course.\n"; } else { throw $e; } } return $student; }
Python
import os from google.auth.transport.requests import Request from google.oauth2.credentials import Credentials from google_auth_oauthlib.flow import InstalledAppFlow from googleapiclient.discovery import build from googleapiclient.errors import HttpError SCOPES = ["https://www.googleapis.com/auth/classroom.coursework.students"] def classroom_add_student_new(course_id): """ Adds a student to a course, the teacher has access to. The file token.json stores the user's access and refresh tokens, and is created automatically when the authorization flow completes for the first time. Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for the application. """ creds = None # The file token.json stores the user's access and refresh tokens, and is # created automatically when the authorization flow completes for the first # time. if os.path.exists("token.json"): creds = Credentials.from_authorized_user_file("token.json", SCOPES) # If there are no (valid) credentials available, let the user log in. if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) else: flow = InstalledAppFlow.from_client_secrets_file( "credentials.json", SCOPES ) creds = flow.run_local_server(port=0) # Save the credentials for the next run with open("token.json", "w", encoding="utf8") as token: token.write(creds.to_json()) enrollment_code = "abc-def" student = {"userId": "gduser1@workspacesamples.dev"} try: service = build("classroom", "v1", credentials=creds) student = ( service.courses() .students() .create( courseId=course_id, enrollmentCode=enrollment_code, body=student ) .execute() ) print( '''User {%s} was enrolled as a student in the course with ID "{%s}"''' % (student.get("profile").get("name").get("fullName"), course_id) ) return student except HttpError as error: print(error) return error if __name__ == "__main__": # Put the course_id of course for which student needs to be added. classroom_add_student_new(478800920837)
如果您要代表已通过身份验证的教师添加学生,则必须使用 invitations.create()
方法。
您可以使用 students.delete()
方法从课程中移除学生。这只会将指定学生从课程中移除,不会影响他们在其他课程中的注册或用户个人资料。
检索用户的课程
如需检索学生或教师的课程列表,请调用 courses.list()
并提供相应用户的 studentId
或 teacherId
。
检索用户的个人资料
如需检索用户的简要个人资料(包括 ID 和姓名),请使用用户的 ID、电子邮件地址或请求用户的“我”调用 userProfiles.get()
。
如需检索 emailAddress
字段,您必须添加 classroom.profile.emails
作用域。
返回的 ID 对应于包含匹配 studentId
或 teacherId
的 Directory API Users 资源。
管理课程所有者
网域管理员可以在教师之间转移课程所有权。如需了解重要详情,请参阅转移课程所有权部分。