2011-02-11 26 views
7

Me gustaría escribir un script en Ruby (usando la gema gdata, la gema rest-client o simplemente Net :: HTTP) para autenticar con mis documentos de google usando gmail-userid/password, y luego descargue una lista de documentos y documentos privados.Script de Ruby para descargar documentos privados de Google

La guía GData documents aclara cómo obtener documentos públicamente visibles, pero no está claro cómo puedo autenticarme en mi script para obtener acceso a documentos privados. El authentication methods they specify parece requerir intervención humana, ya sea con un Capcha o alguna forma de redirección de OAuth/OpenID.

¿Hay alguna forma de acceder a mis documentos privados con solo una combinación de ID de usuario/contraseña? ¿O tal vez eso junto con una clave API? Si es así, ¿alguien me puede mostrar cómo hacerlo?

Respuesta

0

Empecé en este mismo proyecto exactamente hoy y me he encontrado con el mismo problema. Me las he arreglado para usar OAuth o OpenID, pero aún estoy trabajando para obtener un archivo descargado ... lo cual parece ser la parte más fácil. De todos modos, esto es lo que hice:

Estoy usando la gema Mechanize para buscar en la página docs.google.com los formularios de nombre de usuario y contraseña. Presento mis credenciales a través de Mechanize y ahora tengo acceso a mis documentos de Google.

En este punto me parece que puedo utilizar la URL de descarga mencionados en esta documentación Google:

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

La URL se parece a esto (estoy trabajando con hojas de cálculo):

"http :? //spreadsheets.google.com/feeds/download/spreadsheets/Export key = "resource_id_goes_here" & ExportFormat = xls"

Para retoques/prueba, sólo estoy tomando el ID de recurso de mi spreadshe et desde la barra de direcciones de mi navegador web (cuando tengo la hoja de cálculo abierta en mi navegador) y conectándola a la URL anterior en otra pestaña de mi navegador. Esto parece funcionar porque cuando envío la URL la hoja de cálculo se descarga como un archivo .xls. Tenga en cuenta que esto es todo usando mi navegador web.

No he podido iniciar con éxito una descarga a través de mi secuencia de comandos de Ruby. Esa URL no es un enlace directo al archivo, así que no estoy muy seguro de cómo capturar correctamente los datos del archivo. La secuencia de comandos se ejecuta correctamente, pero si almaceno el resultado del método Ruby 'get' (que está usando esa URL como argumento) en un objeto, parece ser algo de redirección de JavaScript. Probablemente estoy pasando por alto algo obvio, pero ahí es donde estoy. Me culpo por estar atrapado en las horas que pasé leyendo sobre OAuth y OpenID ... eso no fue muy divertido.

Espero que algo de eso sea útil. Aquí hay otro interesante gema de rubíes me encontré en mi investigación sobre la materia de autenticación:

OAuth Gema de rubíes: http://oauth.rubyforge.org/

+0

Interesante ... ¿puede indicarme un fragmento de código que puedo ejecutar en irb? –

0

supuesto, aquí tienes una versión básica de lo que estoy haciendo:

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 

Si nos fijamos en test, verá el material de redirección de Java en lugar del archivo xls.

No he trabajado en ello en un par de días, pero tengo la ligera sensación de que recibo la redirección porque el script no está "correctamente" autenticado.Se supone que Mechanize maneja las cookies y las redirecciones, así que creo que esto simplemente debería funcionar, pero no es así.

ACTUALIZACIÓN:

de la URL de exportación son un poco más abajo en la misma página en la citada documentación se enlazó en su comentario. La URL para exportar una hoja de cálculo es el siguiente:

http://spreadsheets.google.com/feeds/download/spreadsheets/Export?key= "document_resource_id_goes_here" & ExportFormat = xls

Usted debe ser capaz de conectar que en un navegador y descargar un archivo (si está en el sistema, por supuesto) . La identificación del recurso del documento es simplemente la clave única para cualquier documento con el que esté trabajando, puede pegarlo manualmente en la URL para probarlo en un navegador.

Sin embargo, estoy bastante seguro de que ninguna de estas URL de la API funcionará en una secuencia de comandos a menos que se maneje correctamente la autenticación de la forma en que lo solicita Google. No estoy exactamente seguro de lo que estoy viendo, pero usando Wireshark para olfatear paquetes puedo ver algunos errores cuando uso un script que no obtengo cuando uso mi navegador. Estos errores parecen ocurrir cuando el servidor y el script están intercambiando algún tipo de información de certificado. De todos modos, he estado mirando la gema OAuth un poco más y creo que estoy empezando a comprenderlo mejor.

si vas aquí:

http://googlecodesamples.com/oauth_playground/

se puede jugar con las cosas de OAuth, que es una especie de locura cómo funciona. Usted solicita un token de solicitud con un conjunto de parámetros que deben ser 'simplemente' correctos. Envía el token de solicitud que luego utiliza para hacer referencia a una página de inicio de sesión donde ingresa sus credenciales de Google (como lo haría cuando trabaja manualmente con documentos de Google). Una vez que se verifican sus credenciales, le pide que otorgue permiso al token de solicitud. El token de solicitud se actualiza a un token de acceso y luego vuelve a su secuencia de comandos y luego puede comenzar a trabajar con el resto de la API al hacer referencia a este token de acceso ... parece exagerado, pero no soy un experto en seguridad.

Aquí es lo que estoy esperando hacer:

  • encontrar la manera de utilizar la gema OAuth Ruby a solicitar y enviar señales a Google.

  • Uso Mechanize para raspar la página de acceso a Google y escriba las credenciales de una vez lo puedo enviar la señal de petición que quiere

  • Uso Mechanize para hacer clic en el botón "Conceder acceso" una vez que se presentaron mis credenciales

  • Luego de esperar encontrar que realmente puedo usar el resto de la API para trabajar con archivos

(Grrr aprender cómo formatear correctamente el texto en esta página web es casi tan difícil !!:))

+0

Lo probé hasta "página = agente.enviar formulario", y obtuve resultados diferentes con un usuario/pase válido y un usuario/pase no válido. No estaba seguro de qué hacer después de eso. Intenté google_download_url = "https://docs.google.com/feeds/default/private/full", según http://code.google.com/apis/documents/docs/3.0/developers_guide_protocol.html#ListDocs, pero obtuve un error de 400 cuando lo hice "test = agent.get google_download_url". ¿Tiene alguna idea sobre cómo se vería la URL de descarga? –

5

Por lo tanto, a veces darse por vencido, pasar a otra cosa, y regresar con una nueva mentalidad puede hacer maravillas. Empecé a mirar esto nuevamente esta mañana y en un par de horas lo hice funcionar.

Abandoné OAuth porque la gema Ruby OAuth parece centrarse en aplicaciones basadas en web.Comencé a hurgar en Google Data on Rails y, al usar ClientLogin, no tuve problemas para autenticarme, y hasta donde puedo decir, no recibes solicitudes de CAPTCHA a menos que ingreses las credenciales incorrectas ... o al menos yo de otra manera no he visto ninguna.

Aquí es un simple fragmento de código para exportar un archivo de hoja de cálculo:

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 
+0

Esto no funcionó para mí hasta que utilicé el https: // url. –

0

El código en la primera respuesta no bastante trabajo para mí. Esto es lo que usé.

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 
Cuestiones relacionadas