当前位置: 首页 > 知识库问答 >
问题:

如何将google-api-ruby-Client与Google Calendar API一起使用?

刁英朗
2023-03-14

我一直在阅读Google日历API和Google API ruby客户端库的文档,但我在理解它们时遇到了很多困难。

我有一个Rails应用程序,它有一个前端,允许用户创建名为Events的对象,并将它们保存在我服务器上的数据库中。我想要的是,在这些事件保存在数据库中之后,我想调用Google Calendar API在Google日历上创建一个事件(服务器创建的,只有服务器有权修改该日历)。

我在弄清楚如何使用ruby库通过API进行身份验证时遇到了很多问题。使用OAuth2对我来说没有意义,因为我不需要向用户授权任何东西,因为我对他们的数据不感兴趣。我查过服务账户(http://code.google.com/p/google-api-ruby-client/wiki/ServiceAccounts),但服务帐户似乎不支持谷歌日历。

有人有什么想法吗?这是我正在试验的代码(使用服务帐户):

@client = Google::APIClient.new(:key => 'my_api_key')
path_to_key_file = '/somepath/aaaaaa-privatekey.p12'
passphrase = 'my_pass_phrase'
key = Google::APIClient::PKCS12.load_key(path_to_key_file, passphrase)
asserter = Google::APIClient::JWTAsserter.new(
        'blah_blah@developer.gserviceaccount.com',
        'https://www.googleapis.com/auth/calendar',
        key)
# To request an access token, call authorize:
@client.authorization = asserter.authorize()

calendar = @client.discovered_api('calendar', 'v3')

event = {
  'summary' => 'Appointment',
  'location' => 'Somewhere',
  'start' => {
      'dateTime' => '2012-06-03T10:00:00.000-07:00'
   },
   'end' => {
      'dateTime' => '2012-06-03T10:25:00.000-07:00'
    },
    'attendees' => [
        {
          'email' => 'attendeeEmail'
        },
        #...
      ]
   }

result = @client.execute!(:api_method => calendar.events.insert,
                            :parameters => {'calendarId' => 'primary'},
                            :body => JSON.dump(event),
                            :headers => {'Content-Type' => 'application/json'})

然后我当然会收到这个错误消息:Google::APIClient::ClientError(用户必须注册Google日历。),因为服务帐户不支持Google日历。

共有3个答案

游鸣
2023-03-14

我在这方面也遇到了麻烦,最后终于解决了。归根结底,Google Calendar API v3需要OAuth,您需要通过Google开发者控制台设置一个应用程序/项目,然后在目标Google帐户上请求OAuth权限。一旦授权被授予,您将希望保存刷新令牌,并在后续调用中使用它来获取新的访问令牌(过期!)。我在这里写了一篇详细的博客文章:http://www.geekytidbits.com/google-calendar-api-from-ruby/这是我的示例脚本,希望能帮助您理解流程:

#gem install 'google-api-client'

require 'google/api_client'

#Setup auth client
client_secrets = Google::APIClient::ClientSecrets.load #client_secrets.json must be present in current directory!
auth_client = client_secrets.to_authorization
auth_client.update!(
  :scope => 'https://www.googleapis.com/auth/calendar',
  :access_type => "offline", #will make refresh_token available
  :approval_prompt =>'force',
  :redirect_uri => 'http://www.myauthorizedredirecturl.com'
)

refresh_token_available = File.exist?('refresh_token.txt')

if !refresh_token_available
 #OAuth URL - this is the url that will prompt a Google Account owner to give access to this app.
 puts "Navigate browser to: '#{auth_client.authorization_uri.to_s}' and copy/paste auth code after redirect."

 #Once the authorization_uri (above) is followed and authorization is given, a redirect will be made 
 #to http://www.myauthorizedredirecturl.com (defined above) and include the auth code in the request url.
 print "Auth code: "
 auth_client.code = gets
else 
 #If authorization has already been given and refresh token saved previously, simply set the refresh code here.
 auth_client.refresh_token = File.read('refresh_token.txt')
end

#Now, get our access token which is what we will need to work with the API.
auth_client.fetch_access_token!

if !refresh_token_available
    #Save refresh_token for next time
    #Note: auth_client.refresh_token is only available the first time after OAuth permission is granted.  
    #If you need it again, the Google Account owner would have deauthorize your app and you would have to request access again.
    #Therefore, it is important that the refresh token is saved after authenticating the first time!
    File.open('refresh_token.txt', 'w') { |file| file.write(auth_client.refresh_token) }
    refresh_token_available = true
end

api_client = Google::APIClient.new
cal = api_client.discovered_api('calendar', 'v3')

#Get Event List
puts "Getting list of events..."
list = api_client.execute(:api_method => cal.events.list, 
    :authorization => auth_client,
    :parameters => {
        'maxResults' => 20, 
        'timeMin' => '2014-06-18T03:12:24-00:00', 
        'q' => 'Meeting', 
        'calendarId' => 'primary'})

puts "Fetched #{list.data.items.count} events..."

#Update Event
puts "Updating first event from list..."
update_event = list.data.items[0]
update_event.description = "Updated Description here"
result = api_client.execute(:api_method => cal.events.update, 
    :authorization => auth_client,
    :parameters => { 'calendarId' => 'primary', 'eventId' => update_event.id}, 
    :headers => {'Content-Type' => 'application/json'},
    :body_object => update_event)
puts "Done with update."

#Add New Event
puts "Inserting new event..."
new_event = cal.events.insert.request_schema.new
new_event.start = { 'date' => '2015-01-01' } #All day event
new_event.end = { 'date' => '2015-01-01' } 
new_event.description = "Description here"
new_event.summary = "Summary here"
result = api_client.execute(:api_method => cal.events.insert, 
    :authorization => auth_client,
    :parameters => { 'calendarId' => 'primary'}, 
    :headers => {'Content-Type' => 'application/json'},
    :body_object => new_event)
puts "Done with insert."
孔建柏
2023-03-14

我对Ruby一无所知。但似乎理解底层REST查询将有助于调试您的问题。我在这里记录了它们:http://www.tqis.com/eloquency/googlecalendar.htm

陆琦
2023-03-14

我认为您仍然需要一个真正的google用户来托管日历实例。但是,一旦您以自己的身份创建了日历,您就可以与服务帐户共享它。在日历的共享设置中,只需使用服务帐户的电子邮件地址(我的服务帐户以@developer.gserviceaccount.com结尾)。使用正确的共享权限,您的服务帐户可以创建/更改事件信息,而不会影响您的特定身份。从那里,您可以与更多人(或公众)共享日历,以便他们使用镜像事件。

我遇到的另一个问题是,似乎每个过期期只能对服务帐户授权()一次。您必须保存您获得的令牌,并在接下来的一个小时内重用它,然后再获取一个新的令牌。

 类似资料:
  • google-api-ruby-client-samples 是 Google API Ruby 客户端的示例。   

  • 该项目是 Google Cloud 官方的 Ruby 客户端开发包。 安装:$ gem install google-cloud 示例代码: require "google/cloud/bigquery"bigquery = Google::Cloud::Bigquery.new(  project: "my-todo-project",  keyfile: "/path/to/keyfile.j

  • 我一直在尝试遵循这个网站和其他网站上的食谱,了解如何将log4j2 FileAppender实例添加到使用SLF4J API进行整体日志记录的类中,但我运气不佳。有人能告诉我下面的代码哪里出错了吗? assertTrue语句通过,因此文件由FileAppender创建,但assertEquals失败,因为日志线的长度为零(即日志文件没有内容)。 有什么想法吗?

  • 我想使用的与chrome API,但我遇到了一个问题... 我尝试了以下操作,但chrome API无法将识别为函数,因此我尝试先将保存为变量。。。 但是当我尝试以下操作时,仍然是一个空字符串。我不明白为什么,因为被设置为。我怎样才能解决这个问题? 编辑 我把剧本叫做... 在剧本里我有以下内容... 其中函数只返回一个字符串。它是由我的捕获的,我通过打印到if语句内的控制台来验证它。 我注意到是

  • 我很难弄清楚如何使用Postman进行测试的Marketo REST API。 到目前为止,我可以进行身份验证并获取access_token, 但当我尝试创建文件夹时…(正确验证) endpoint: 身体: 我得到: 我不知道我做错了什么。

  • 看起来Google Calendar API的当前版本是v3,我相信它在过去支持用于JavaScript/Browser实现的OAuth和简单API密钥。 截至2017年2月2日:是否仍然可以使用带有API Key的Google日历API,或者需要通过OAuth2.0访问API(甚至访问公共日历)? 根据Google日历API,“您的应用程序必须使用OAuth 2.0来授权请求”(https://