Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google api 谷歌教室API补丁_Google Api_Google Oauth_Google Classroom - Fatal编程技术网

Google api 谷歌教室API补丁

Google api 谷歌教室API补丁,google-api,google-oauth,google-classroom,Google Api,Google Oauth,Google Classroom,在谷歌教室API中执行课程.courseWork.studentSubmissions.patch方法时,当我尝试更新学生提交的内容时,返回403错误。下面是我的代码 from googleapiclient.discovery import build from oauth2client import client import simplejson as json class Google: SCOPE = { "profile": {"scope": "profi

在谷歌教室API中执行
课程.courseWork.studentSubmissions.patch
方法时,当我尝试更新学生提交的内容时,返回403错误。下面是我的代码

from googleapiclient.discovery import build
from oauth2client import client
import simplejson as json

class Google:
    SCOPE = {
        "profile": {"scope": "profile email", "access_type": "offline"},
        "classroom": {"scope": 'https://www.googleapis.com/auth/classroom.courses.readonly '
                               'https://www.googleapis.com/auth/classroom.rosters.readonly '
                                'https://www.googleapis.com/auth/classroom.profile.emails '
                                'https://www.googleapis.com/auth/classroom.profile.photos ',
                    "access_type": "offline"},
        "classwork":{
            "scope": "https://www.googleapis.com/auth/classroom.coursework.students https://www.googleapis.com/auth/classroom.coursework.me",
            "access_type":"offline"
        },
        "submission":{
            "scope": "https://www.googleapis.com/auth/classroom.coursework.me https://www.googleapis.com/auth/classroom.coursework.students profile email",
            "access_type":"offline"
        }
    }
    ERRORS = {
                "invalid_request":{"code":"invalid_request","msg":"Invalid request. Please Try with login again."},
                "account_used":{"code":"account_used","msg":"Google account is already configured with different PracTutor Account."},
                "assignment_permission_denied":{"code":"assignment_permission_denied","msg":"permission denied"},
                "unknown_error":{"code":"unknown_error","msg":"something went wrong."}
              }

    def __init__(self, code = "", genFor = "profile"):
        if code:
            genFor = genFor if genFor else "profile"
            self.credentials = client.credentials_from_clientsecrets_and_code(pConfig['googleOauthSecretFile'],self.SCOPE[genFor]["scope"], code)
            self.http_auth = self.credentials.authorize(httplib2.Http())
            cred_json = self.credentials.to_json()
            idinfo = json.loads(cred_json)["id_token"]
        else:
            raise ValueError(Google.ERRORS["invalid_request"])

    def getUserInfo(self):
        service = build(serviceName='oauth2', version='v2', http=self.http_auth)
        idinfo = service.userinfo().get().execute()
        return idinfo

    def getClasses(self):
        courses = []
        page_token = None
        service = build('classroom', 'v1', http=self.http_auth)
        while True:
            response = service.courses().list(teacherId="me",pageToken=page_token,
                                              pageSize=100).execute()
            courses.extend(response.get('courses', []))
            page_token = response.get('nextPageToken', None)
            if not page_token:
                break
        return courses

    def getStudent(self,course_id):
        students = []
        page_token = None
        service = build('classroom', 'v1', http=self.http_auth)
        while True:
            response = service.courses().students().list(courseId=course_id, pageToken=page_token,
                                              pageSize=100).execute()
            students.extend(response.get('students', []))
            page_token = response.get('nextPageToken', None)
            if not page_token:
                break
        return students

    def createAssignment(self,course_id,**kwargs):
        service = build('classroom', 'v1', http=self.http_auth)
        date, time = kwargs["dueDate"].split(" ")
        yy,mm,dd = date.split("-")
        h,m,s = time.split(":")
        courseWork = {
            'title': kwargs["title"],
            'description': kwargs["desc"],
            'materials': [
                {'link': { 'url': kwargs["link"] } },
            ],
            'dueDate': {
                "month": mm,
                "year": yy,
                "day": dd
            },
            'dueTime':{
                "hours": h,
                "minutes": m,
                "seconds": s
              },
            'workType': 'ASSIGNMENT',
            'state': 'PUBLISHED',
        }
        courseWork = service.courses().courseWork().create(courseId=course_id, body=courseWork).execute()
        return courseWork

    def submitAssignment(self,**kwargs):
        service = build('classroom', 'v1', http=self.http_auth)
        course_id = kwargs["courseId"]
        courseWorkId = kwargs["courseWorkId"]
        score = kwargs["score"]
        studentSubmission = {
            'assignedGrade': score,
            'draftGrade': score,
            'assignmentSubmission': {
                'attachments': [
                    {
                        'link': {
                            "url": "demo.com",
                            "title": "Assignment1",
                            "thumbnailUrl": "demo.com",
                        }
                    }
                ],
            },
            'state': 'TURNED_IN',
        }
        gCredentials = json.loads(self.credentials.to_json())
        userGId = gCredentials["id_token"]["sub"]
        studentSubmissionsData = service.courses().courseWork().studentSubmissions().list(
            courseId=course_id,
            courseWorkId=courseWorkId,
            userId=userGId).execute()
        studentSubmissionId = studentSubmissionsData["studentSubmissions"][0]["id"]
        courseWorkRes = service.courses().courseWork().studentSubmissions().patch(
                    courseId=course_id,
                    courseWorkId=courseWorkId,
                    id=studentSubmissionId,
                    updateMask='assignedGrade,draftGrade',
                    body=studentSubmission).execute()
        return courseWorkRes


Method Calling     
g = Google()
kwargs = {"courseId":courseId,"courseWorkId":courseWorkId,"score":80}
courseworkResponse = g.submitAssignment(**kwargs)
错误:

https://classroom.googleapis.com/v1/courses/{courses_id}/courseWork/{courseWork_id}/studentSubmissions/{studentSubmissions_id}?alt=json&updateMask=assignedGrade%2CdraftGrade 返回“呼叫方没有权限”>

学生提交的内容包含以下字段assignedGrade、draftGrade、附件(链接资源)和state

正在从经过身份验证的学生帐户进行呼叫。开发者控制台项目启用了Google教室API,对Google教室API的其他调用工作正常,例如courses.courseWork.create和courses.courseWork.studentSubmissions.list。此外,我正在从课程工作项关联/创建的同一开发人员控制台项目发出请求

当我从谷歌API浏览器尝试时,返回了相同的错误403错误和不同的消息

{
  "error": {
    "code": 403,
    "message": "@ProjectPermissionDenied The Developer Console project is not permitted to make this request.",
    "status": "PERMISSION_DENIED"
  }
}

任何帮助都将不胜感激,谢谢

该错误消息基本上意味着您无权执行您正试图执行的操作。权限与您对用户进行身份验证的作用域有关。这是一个完整的列表

需要以下作用域

授权

需要以下OAuth作用域之一:

https://www.googleapis.com/auth/classroom.coursework.students
https://www.googleapis.com/auth/classroom.coursework.me
在修补程序之前使用列表和获取

使用list和get-before-patch确保您拥有corect ID


如果您让用户先预成型a,然后找到您要的用户,然后再预成型a,那么您可以在get中对对象进行更改,然后在该对象上运行更新。这样做可以确保您传递的所有ID都是正确的,并且用户确实可以访问他们试图更新的内容。

您对所述学生进行身份验证的范围是什么?是的,我使用这两个范围进行身份验证。当它弹出并请求对用户进行身份验证时。是要求课程范围吗?我没有python的能力,但通常情况下,你把作用域作为数组发送,而不是像那样拆分。是的,它要求的是课程作用域<代码>管理你的课程作业并在谷歌教室查看你的成绩。在您所教的Google教室班级中管理学生的课程作业和成绩,并查看您所管理班级的课程作业和成绩。