Ruby脚本下载私人谷歌文档

时间:2011-02-11 18:08:35

标签: ruby oauth google-docs gdata

我想在Ruby中编写脚本(使用gdata gem,rest-client gem或直接使用Net :: HTTP),使用gmail-userid / password对我的google文档进行身份验证,然后下载私有列表文件和文件。

GData documents指南明确了如何获取公开可见的文档,但我不清楚如何在脚本中对自己进行身份验证以访问私有文档。 authentication methods they specify似乎都需要人工干预,无论是使用Capcha还是某种形式的OAuth / OpenID重定向。

有没有办法只使用用户ID /密码组合来访问我的私人文档?或者也许与API密钥一起?如果是这样,任何人都可以告诉我如何做到这一点吗?

4 个答案:

答案 0 :(得分:5)

因此,有时放弃,继续前进,以新的心态回归可以创造奇迹。我今天早上又开始看这个,并在几个小时内就开始工作了。

我放弃了OAuth,因为Ruby OAuth gem似乎以基于Web的应用程序为中心。我开始在谷歌数据上使用Rails,并使用ClientLogin,进行身份验证是没问题的,据我所知,除非你输入错误的凭据,否则你不会收到CAPTCHA请求......或者至少我还没有看到任何其他的。

以下是导出电子表格文件的简单代码段:

require 'gdata/client'  
require 'gdata/http'  
require 'gdata/auth'  
client = GData::Client::Spreadsheets.new  
client.clientlogin('username', 'password')  
test = client.get("http://spreadsheets.google.com/feeds/download/spreadsheets/Export?key="resource_ID"&fmcmd&exportFormat=xls")  
file = File.new("spreadsheet.xls", "wb")  
file.write test.body  
file.close  

答案 1 :(得分:0)

我今天开始使用这个完全相同的项目并遇到了同样的问题。我已经设法使用OAuth或OpenID,但仍在努力实际上下载文件......这似乎应该是容易的部分。无论如何,这就是我所做的:

我正在使用Mechanize gem来刮取docs.google.com页面以获取用户名和密码表单。我通过Mechanize提交了凭据,现在可以访问我的Google文档了。

此时我发现我可以使用此Google文档中提到的下载网址:

http://code.google.com/apis/documents/docs/3.0/developers_guide_protocol.html#DownloadingDocs

网址如下(我正在使用电子表格):

“http://spreadsheets.google.com/feeds/download/spreadsheets/Export?key=” resource_id_goes_here “&安培; exportFormat = XLS”

对于修补/测试,我只是从我的网络浏览器的地址栏获取电子表格的资源ID(当我在浏览器中打开电子表格时)并将其插入到我的另一个标签中的上述URL中浏览器。这似乎有效,因为当我提交URL时,电子表格将作为.xls文件下载。请注意,这都是使用我的网络浏览器。

我无法通过Ruby脚本成功启动下载。该URL不是文件的直接链接,因此我不太确定如何正确捕获文件数据。该脚本运行成功,但如果我将Ruby'get'方法的输出(使用该URL作为参数)存储在对象中,它似乎是一些javascript重定向的东西。我可能忽略了一些显而易见的事情,但那就是我所处的位置。我责备被困在阅读有关OAuth和OpenID的时间......这不是很有趣。

希望其中一些有用。这是我在认证方面的研究中遇到的另一个有趣的Ruby gem:

OAuth Ruby Gem: http://oauth.rubyforge.org/

答案 2 :(得分:0)

当然,这是我正在做的基本版本:

require 'mechanize'  
agent = Mechanize.new  
page = agent.get "https://docs.google.com"  
form = page.forms.first  
form.Email = "your_username"  
form.Passwd = "your_password"   
page = agent.submit form      
test = agent.get "google_download_url_goes_here"  
puts test.body

如果查看test,您将看到Java重定向内容而不是xls文件。

我在几天内没有使用它,但我有一种轻微的感觉,我正在获得重定向,因为脚本没有“正确”验证。 Mechanize应该处理cookie和重定向,所以我认为这应该只是工作,但不是。

<强>更新

导出网址在您评论中链接到的文档中的同一页面上稍微偏远。导出电子表格的URL如下所示:

http://spreadsheets.google.com/feeds/download/spreadsheets/Export?key= “document_resource_id_goes_here” &安培; exportFormat = XLS

您应该能够将其插入浏览器并下载文件(当然,如果您已登录)。文档资源ID只是您正在使用的任何文档的唯一键,您可以手动将其粘贴到URL中以便在浏览器中进行测试。

但是,我非常确定这些API网址都不会在脚本中运行,除非它按照Google要求的方式正确处理身份验证。我不确定我在看什么,但是使用Wireshark来嗅探数据包我在使用我在浏览器时无法获得的脚本时会看到一些错误。当服务器和脚本交换某种证书信息时,似乎会发生这些错误。无论如何,我一直在关注OAuth gem,并认为我开始更好地理解它。

如果你去这里:

http://googlecodesamples.com/oauth_playground/

你可以玩OAuth的东西,它的工作方式有点疯狂。你要求一个带有一堆必须“正确”的参数的请求令牌。它会发送请求令牌,您可以使用该令牌来引用您输入Google凭据的登录页面(就像您手动使用Google文档时一样)。验证凭据后,它会要求您授予请求令牌的权限。请求令牌升级为访问令牌,然后传递回您的脚本,然后您可以通过引用此访问令牌开始使用其余API ...看起来有点矫枉过正,但我​​不是安全专家。

这是我希望做的事情:

  • 了解如何使用OAuth Ruby gem请求并向Google发送令牌。

  • 使用Mechanize抓取Google登录页面并输入凭据一旦我可以发送所需的请求令牌

  • 提交凭据后,使用Mechanize点击“授予访问权限”按钮

  • 然后希望我发现我可以使用其余的API来处理文件

(Grrr!学习如何正确地格式化本网站上的文字!!):))

答案 3 :(得分:0)

第一个答案中的代码对我来说并不适用。这是我用的。

require 'gdata/client'
require 'gdata/http'
require 'gdata/auth'

KEY = 'YOUR_DOCUMENT_KEY'
URL = "https://docs.google.com/feeds/download/spreadsheets"

client = GData::Client::Spreadsheets.new
client.clientlogin('REPLACE_WITH_LOGIN', 'REPLACE_WITH_PASSWORD')

#Change the csw at the end to match your required format
test = client.get("#{URL}/Export?key=#{KEY}&fmcmd&exportFormat=csv")

puts test.body