Google cloud platform 谷歌课堂API:无法接收课程作业和学生提交的推送通知(课程\工作\更改)

Google cloud platform 谷歌课堂API:无法接收课程作业和学生提交的推送通知(课程\工作\更改),google-cloud-platform,google-oauth,google-cloud-pubsub,service-accounts,google-classroom,Google Cloud Platform,Google Oauth,Google Cloud Pubsub,Service Accounts,Google Classroom,我们被严重封锁了。我们遵循下面的文档(以及许多其他文档)来设置发布/订阅管道、创建服务帐户、分配权限以及使用正确的作用域和提要类型进行注册 因此,通过编程,我们可以在.net中使用API执行以下操作: 我们可以创建课程 我们可以为给定的courseid创建注册 我们为已创建注册的课程创建/更新课程工作 到目前为止一切都很好 但是,我们不会收到创建/更新课程工作的通知 为了清晰起见,有一些代码: ServiceAccountCredential credential = new

我们被严重封锁了。我们遵循下面的文档(以及许多其他文档)来设置发布/订阅管道、创建服务帐户、分配权限以及使用正确的作用域和提要类型进行注册

因此,通过编程,我们可以在.net中使用API执行以下操作:

  • 我们可以创建课程

  • 我们可以为给定的courseid创建注册

  • 我们为已创建注册的课程创建/更新课程工作

  • 到目前为止一切都很好

    但是,我们不会收到创建/更新课程工作的通知

    为了清晰起见,有一些代码:

            ServiceAccountCredential credential = new ServiceAccountCredential(
            new ServiceAccountCredential.Initializer("sa-something@precise-asset-259113.iam.gserviceaccount.com")
           {
              User = "impersonated user",
              Scopes = new string[] { "https://www.googleapis.com/auth/classroom.coursework.students" ,
                                      "https://www.googleapis.com/auth/classroom.courses",
                                      "https://www.googleapis.com/auth/classroom.push-notifications" }}
           .FromPrivateKey("My private key"));
    
            //Authorize request
            var result = credential.RequestAccessTokenAsync(CancellationToken.None).Result;
    
            var service = new ClassroomService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
            });
    
            // We get courses
            var courses = service.Courses.List().Execute();
    
            // We get one course for registration
            var course = courses.Courses.First();
    
            // We create registration
            var registration = service.Registrations.Create(new Google.Apis.Classroom.v1.Data.Registration()
            {
                Feed = new Google.Apis.Classroom.v1.Data.Feed()
                {
                    FeedType = "COURSE_WORK_CHANGES",
                    CourseWorkChangesInfo = new Google.Apis.Classroom.v1.Data.CourseWorkChangesInfo()
                    {
                        CourseId = course.Id
                    },
                },
                CloudPubsubTopic = new Google.Apis.Classroom.v1.Data.CloudPubsubTopic()
                {
                    TopicName = "projects/precise-asset-259113/topics/test"
                },
    
            });
    
            //Successful response - We get a registrationID
            var response = registration.Execute();
    
            var courseWork = new CourseWork()
            {
                     CourseId = course.Id,
                     Title = "Ver Test",
                     Description = "Calculus",
                     WorkType = "ASSIGNMENT",
                     MaxPoints = 20.0,
                     State = "PUBLISHED",
                     AlternateLink = "www.uni.com",
                     CreatorUserId = course.OwnerId,
                     CreationTime = DateTime.UtcNow,
                     DueTime = new TimeOfDay() { Hours = 5, Minutes = 10, Nanos = 10, Seconds = 10 },
                     DueDate = new Date() { Day = 3, Month = 12, Year = 2019 },
                     Assignment = new Assignment() { StudentWorkFolder = new DriveFolder() { AlternateLink = "Somewhere", Title = "My Calculus" } }
            };
    
            //Create course work for the course that we registered
            var courseWorkResponse = service.Courses.CourseWork.Create(courseWork, course.Id).Execute();
    
           SubscriberServiceApiClient subscriber = SubscriberServiceApiClient.Create();
           SubscriptionName subscriptionName = new SubscriptionName("precise-asset-259113", "test");
    
             PullResponse pullResponse = subscriber.Pull(
                subscriptionName, returnImmediately: true, maxMessages: 20);
    
           // Check for push notifications BUT ....NADA!!!
            foreach (ReceivedMessage msg in pullResponse.ReceivedMessages)
            {
                string text = Encoding.UTF8.GetString(msg.Message.Data.ToArray());
                Console.WriteLine($"Message {msg.Message.MessageId}: {text}");
            }
    
    你能帮忙吗


    谢谢

    为了确保收到通知,您需要更改以下几项:

  • 在发送将生成发布/订阅消息的请求之前,需要创建订阅。只有成功创建订阅后发布的消息才能保证该订阅的订阅方收到
  • returninstally
    设置为true的单个拉取请求不太可能返回任何消息,即使消息已发布。设置此属性后,如果服务器内存中没有立即到达的消息,则返回空响应。您应该始终将
    returninstally
    设置为false。这仍然不能保证在单个请求/响应中返回消息,即使存在可用的消息,但这将使返回的可能性更大
  • 理想情况下,您可以使用,它会打开到云发布/订阅服务的流,并在消息可用时立即接收消息。如果要直接使用synchronous
    Pull
    方法,则需要同时保持其中许多方法处于未完成状态,以确保以最小的延迟交付消息。一旦收到任何未完成请求的
    PullResponse
    ,您应该立即打开另一个请求以替换它。异步客户机库的目标是避免必须手动执行所有这些步骤以确保高效交付

  • 非常感谢你的回复。请注意,我们已经尝试了1和2。我们当然可以尝试库的异步版本,但我相信上面的代码版本应该适用于我们最初的“概念验证”版本。我们认为这是一个非常奇怪的权限错误。我们已经立即关闭了“返回”“。此外,我们知道订阅早在我们开始创建注册和课程作品之前就存在了。我们是否可以联系Google Clouds平台的人员,查看我们创建服务帐户和权限的方式。我们真的走到了死胡同。更多信息。我们已经创建了一个G套件服务帐户,并启用了域用户域委派。我们正在使用一个“模拟用户”,如上面的代码所示。我们已经为谷歌课堂通知等分配了权限。我们确实遵守了所有可用的文档。我们的整个架构都基于一个组件,该组件应该处理推送通知。出于测试目的,为了验证我们是否正确设置了pubsub管道和服务帐户,我们使用Google云控制台手动添加了消息。我们使用我们的g套件服务帐户访问控制台。这些测试信息正在通过。订阅已经存在,然后我们开始添加注册课程的课程作品和学生提交。然而,除了我们自己手动创建的消息之外,没有其他消息。我们目前唯一的行动计划是浏览谷歌文档,回顾我们的设置。非常感谢您的帮助。