Rails:在谷歌电子表格中导出数据

时间:2015-01-04 10:23:59

标签: ruby-on-rails ruby google-sheets google-oauth

我是Rails的新手,我想从我的网络应用程序中将数据导出到Google Spread Sheet。

  1. 我创建了一个应用程序来获取客户端ID和客户端密码,并为此启用了驱动器API。
  2. 我已经安装了google drive和google api client gem
  3. 我使用了here
  4. 所述的代码

    此代码成功运行,打开一个新的授权选项卡,并显示要粘贴的代码。这就是我陷入困境的地步。谷歌授权要求的代码在我的控制器代码中,因此我的用户可以将该代码粘贴到我的控制器中。我知道它的安静愚蠢的问题,但我没有找到一种方法来自动从api中获取代码以进一步执行,就像我们通常在facebook oauth应用程序中那样。所以你能指导我怎么做吗?代码看起来像

    def export_spred_sheet
      require 'rubygems'
      require 'google/api_client'
      require 'launchy'
    
      # Get your credentials from the console
      CLIENT_ID = 'YOUR_CLIENT_ID'
      CLIENT_SECRET = 'YOUR_CLIENT_SECRET'
      OAUTH_SCOPE = 'https://www.googleapis.com/auth/drive'
      REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob'
    
      # Create a new API client & load the Google Drive API
      client = Google::APIClient.new
      drive = client.discovered_api('drive', 'v2')
    
      # Request authorization
      client.authorization.client_id = CLIENT_ID
      client.authorization.client_secret = CLIENT_SECRET
      client.authorization.scope = OAUTH_SCOPE
      client.authorization.redirect_uri = REDIRECT_URI
    
      uri = client.authorization.authorization_uri
      Launchy.open(uri)
    
      # Exchange authorization code for access token
      $stdout.write  "Enter authorization code: "
      client.authorization.code = gets.chomp
      client.authorization.fetch_access_token!
    
      # Insert a file
      file = drive.files.insert.request_schema.new({
       'title' => 'My document',
       'description' => 'A test document',
       'mimeType' => 'text/plain'
     })
    
     media = Google::APIClient::UploadIO.new('document.txt', 'text/plain')
     result = client.execute(
       :api_method => drive.files.insert,
       :body_object => file,
       :media => media,
       :parameters => {
       'uploadType' => 'multipart',
       'alt' => 'json'})
    
      # Pretty print the API result
      jj result.data.to_hash
    end
    

    或者还有其他方法可以完成任务吗?如果我走错了路线?

1 个答案:

答案 0 :(得分:0)

我在我的一个项目中也反对这一点,最后我发现了如下情况:

您可以使用服务帐户下google developer console生成的P12密钥进行身份验证,而不是使用客户端ID和客户端密钥。在这种情况下,您不需要在控制器中粘贴任何代码。

生成p12键

  1. 转到Google developer console
  2. 然后 - > “API& Auth” - > “凭证”
  3. 创建“服务帐户”类型的新客户ID
  4. 生成新客户端ID后。在“服务帐户”部分,您将找到“生成新P12密钥”按钮。点击它会生成一个p12键。下载并将其安全地存储在您的应用程序中,并将其用于身份验证。
  5. 并使用以下代码段来获取访问令牌。

    key_file = p12_key_file_path
    key = Google::APIClient::KeyUtils.load_from_pkcs12(key_file, 'notasecret')
    client = Google::APIClient.new application_name: "abcd", application_version: "1.0.0"
    

    SERVICE_ACCOUNT_ID(在以下代码段中使用)将是google developer console中此“服务帐户”部分下生成的电子邮件地址。

    client.authorization = Signet::OAuth2::Client.new(
        :token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
        :audience => 'https://accounts.google.com/o/oauth2/token',
        :scope => 'https://www.googleapis.com/auth/analytics',
        :issuer => SERVICE_ACCOUNT_ID,
        :access_type => 'offline',
        :signing_key => key
      )
    
      client.authorization.fetch_access_token!
      client
    

    我希望它会对你有所帮助。