DEV Community

Marcus Andrade
Marcus Andrade

Posted on

Adição de Alunos ao Google Classroom com Python

Olá pessoal tudo bem?,
Conteúdo com objetivo de explicar passo a passo o funcionamento de um script Python que autentica um usuário, lista cursos no Google Classroom e permite a adição de alunos aos cursos. Este script utiliza várias bibliotecas da API do Google para autenticação e acesso ao Google Classroom.

E com isto nos é exibido também o ID da sala criada.

  • Bibliotecas Utilizadas :

  • os.path: Para verificar a existência de arquivos.

  • google.auth.transport.requests.Request: Para fazer solicitações de autenticação.

  • google.oauth2.credentials.Credentials: Para gerenciar credenciais OAuth 2.0.

  • google_auth_oauthlib.flow.InstalledAppFlow: Para gerenciar o fluxo de OAuth 2.0.

  • googleapiclient.discovery.build: Para construir o serviço de API do Google.

  • googleapiclient.errors.HttpError: Para tratar erros da API do Google.

Escopos necessários para pesquisa de módulos de ensalamento :

SCOPES = [
    "https://www.googleapis.com/auth/classroom.courses.readonly",
    "https://www.googleapis.com/auth/classroom.rosters"
]

Enter fullscreen mode Exit fullscreen mode

Função Principal
Definição e Objetivo
A função main() é responsável por gerenciar todo o fluxo de autenticação e execução das ações principais do script:

def main():
    """
    Código usado para poder criar e exibir as salas do Google criadas e adicionar alunos aos cursos e exibir também o ID do curso criado.
    """

Enter fullscreen mode Exit fullscreen mode

Autenticação
Verificação de Credenciais Existentes:

  • Verifica se o arquivo token.json (contendo credenciais salvas) existe.

  • Se existir, carrega as credenciais a partir desse arquivo.

creds = None
if os.path.exists("token.json"):
    creds = Credentials.from_authorized_user_file("token.json", SCOPES)


Enter fullscreen mode Exit fullscreen mode

*A token JSON é gerada na hora de autorizar o aplicativo para tal, existe uma, as tokens são diferentes das chaves criadas no ambiente *

**Autenticação e Renovação de Credenciais:

**

  • Se as credenciais não existem ou são inválidas, o script solicita autenticação.

  • Utiliza o fluxo de autenticação OAuth 2.0 para obter novas credenciais e salva em token.json.

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)
    with open("token.json", "w") as token:
        token.write(creds.to_json())

Enter fullscreen mode Exit fullscreen mode

*Construção do Serviço e Listagem de Cursos
*

**Construção do Serviço:

**

  • Usa as credenciais para construir o serviço da API do Google Classroom.
service = build("classroom", "v1", credentials=creds)

Enter fullscreen mode Exit fullscreen mode

Listagem de Cursos:

  • Chama a API para listar até 1000 cursos. (lembrando que este valor de 1000, foi utilizado de exemplos, mas você pode definir qual valor quiser).

  • Verifica se há cursos e imprime os nomes e IDs dos cursos encontrados.

results = service.courses().list(pageSize=1000).execute()
courses = results.get("courses", [])

if not courses:
    print("No courses found.")
    return
print("Courses:")
for course in courses:
    print(f'{course["name"]} (ID: {course["id"]})')

Enter fullscreen mode Exit fullscreen mode

Adição de Aluno ao Curso

Solicitação de Dados do Usuário:

  • Solicita ao usuário o ID do curso e o e-mail do aluno a ser adicionado.
course_id = input("Digite o ID do curso para adicionar um aluno: ")
student_email = input("Digite o e-mail do aluno: ")

Enter fullscreen mode Exit fullscreen mode

Chamada da Função de Adição:

  • Chama a função add_student_to_course passando o serviço, o ID do curso e o e-mail do aluno.
add_student_to_course(service, course_id, student_email)


Enter fullscreen mode Exit fullscreen mode

Tratamento de Erros

  • Qualquer erro na execução da API é capturado e impresso no console.
except HttpError as error:
    print(f"An error occurred: {error}")

Enter fullscreen mode Exit fullscreen mode

Função para Adicionar Aluno

Definição e Execução

A função add_student_to_course adiciona um aluno a um curso específico:

def add_student_to_course(service, course_id, student_email):
    try:
        student = {
            'userId': student_email
        }
        student = service.courses().students().create(courseId=course_id, body=student).execute()
        print(f"Student {student_email} added to course {course_id}")
    except HttpError as error:
        print(f"An error occurred: {error}")

Enter fullscreen mode Exit fullscreen mode

Passos

  • Criação do Corpo da Requisição:

  • Define o corpo da requisição com o e-mail do aluno.

student = {
    'userId': student_email
}

Enter fullscreen mode Exit fullscreen mode

Chamada da API para Adicionar o Aluno:

  • Usa a API do Classroom para adicionar o aluno ao curso.
student = service.courses().students().create(courseId=course_id, body=student).execute()

Enter fullscreen mode Exit fullscreen mode

Execução do Script

  • Ao executar o script, ele primeiro remove qualquer arquivo token.json existente para forçar a reautenticação, garantindo que as credenciais estão atualizadas:
if __name__ == "__main__":
    if os.path.exists("token.json"):
        os.remove("token.json")
    main()

Enter fullscreen mode Exit fullscreen mode

CÓDIGO COMPLETO

import os.path
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

# Escopos necessários para listar cursos e adicionar alunos no Google Classroom
SCOPES = [
    "https://www.googleapis.com/auth/classroom.courses.readonly",
    "https://www.googleapis.com/auth/classroom.rosters"
]

def main():
    """
    Código usado para poder criar e exibir as salas do Google criadas e adicionar alunos aos cursos.
    """
    creds = None
    if os.path.exists("token.json"):
        creds = Credentials.from_authorized_user_file("token.json", SCOPES)
    # Vai pedir autenticação 
    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)
        # Salva as credenciais e mostra os cursos
        with open("token.json", "w") as token:
            token.write(creds.to_json())

    try:
        service = build("classroom", "v1", credentials=creds)

        # Chama a API Do classroom para ver os cursos deixar em 1000
        results = service.courses().list(pageSize=1000).execute()
        courses = results.get("courses", [])

        if not courses:
            print("No courses found.")
            return
        # Mostra na tela o nome dos cursos criados e salas
        print("Courses:")
        for course in courses:
            print(f'{course["name"]} (ID: {course["id"]})')

        # Adicionar aluno ao curso
        course_id = input("Digite o ID do curso para adicionar um aluno: ")
        student_email = input("Digite o e-mail do aluno: ")
        add_student_to_course(service, course_id, student_email)

    except HttpError as error:
        print(f"An error occurred: {error}")

def add_student_to_course(service, course_id, student_email):
    try:
        student = {
            'userId': student_email
        }
        student = service.courses().students().create(courseId=course_id, body=student).execute()
        print(f"Student {student_email} added to course {course_id}")
    except HttpError as error:
        print(f"An error occurred: {error}")

if __name__ == "__main__":
    # Apagar o arquivo token.json para forçar a reautenticação
    if os.path.exists("token.json"):
        os.remove("token.json")
    main()

Enter fullscreen mode Exit fullscreen mode

Exibição de Imagem com ID dos Cursos
Image description

Top comments (0)