Ruby скрипт для скачивания приватных гугл документов - PullRequest
7 голосов
/ 11 февраля 2011

Я хотел бы написать скрипт на Ruby (используя гем gdata, гем rest-client или просто прямой Net :: HTTP) для аутентификации в моих документах google с использованием gmail-userid / password, а затем загрузить список личныхдокументы и документы.

Руководство GData Documents разъясняет, как получить общедоступные документы, но не ясно, как я могу аутентифицировать себя в своем сценарии, чтобы получить доступ к личным документам.Все методы аутентификации , которые они задают , похоже, требуют вмешательства человека, либо с помощью Capcha, либо с помощью некоторой формы перенаправления OAuth / OpenID.

Есть ли какой-нибудь способ доступа к моим личным документам только с помощью комбинации имени пользователя и пароля?Или, может быть, это вместе с ключом API?Если да, может кто-нибудь показать мне, как это сделать?

Ответы [ 4 ]

5 голосов
/ 05 марта 2011

Итак, иногда сдаваясь, переходя к чему-то другому и возвращаясь со свежим мышлением, можно творить чудеса.Сегодня утром я снова начал смотреть на это, и через пару часов все заработало.

Я отказался от OAuth, потому что гем Ruby OAuth, похоже, сосредоточен вокруг веб-приложений.Я начал ковыряться в Google Data on 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  
0 голосов
/ 08 февраля 2012

Код в первом ответе у меня не совсем сработал. Вот что я использовал.

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
0 голосов
/ 14 февраля 2011

Конечно, вот базовая версия того, что я делаю:

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.

Я не работал над этим в течение нескольких дней, но у меня есть небольшое ощущение, что я получаю перенаправление, потому что сценарий не "должным образом" аутентифицирован.Механизация должна обрабатывать файлы cookie и перенаправления, поэтому я думаю, что это должно просто работать, но это не так.

ОБНОВЛЕНИЕ:

URL-адреса экспорта расположены немного дальшена той же странице в той документации, на которую вы ссылались в своем комментарии.URL для экспорта электронной таблицы выглядит следующим образом:

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

Вы должны иметь возможность подключить его к браузеру и загрузить файл (если вы вошли в систему, конечно).Идентификатор ресурса документа - это просто уникальный ключ для любого документа, с которым вы работаете, вы можете вручную вставить его в URL для тестирования в браузере.

Однако я почти уверен, что ни один из этих URL API не будетработать в сценарии, если он не обрабатывает аутентификацию так, как запрашивает Google.Я не совсем уверен, что я смотрю, но при использовании Wireshark для перехвата пакетов я вижу некоторые ошибки при использовании скрипта, который не получается при использовании моего браузера.Эти ошибки возникают, когда сервер и скрипт обмениваются какой-либо информацией о сертификате.В любом случае, я немного больше смотрю на камень OAuth и думаю, что начинаю понимать его лучше.

Если вы идете сюда:

http://googlecodesamples.com/oauth_playground/

Вы можете поиграть с вещами OAuth, это как-то безумно, как это работает.Вы запрашиваете токен запроса с набором параметров, которые должны быть «правильными».Он отправляет маркер запроса, который вы затем используете для ссылки на страницу входа в систему, где вы вводите свои учетные данные Google (как это было бы при ручной работе с документами Google).Как только ваши учетные данные проверены, он попросит вас предоставить разрешение токену запроса.Токен запроса обновляется до токена доступа, а затем передается обратно в сценарий, после чего вы можете начать работу с остальным API, ссылаясь на этот токен доступа ... кажется излишним, но я не эксперт по безопасности.

Вот что я надеюсь сделать:

  • Узнайте, как использовать гем OAuth Ruby для запроса и отправки токенов в Google.

  • Используйте Mechanize, чтобы очистить страницу входа в Google и ввести учетные данные, как только я смогу отправить ему токен запроса, который он хочет

  • Используйте Mechanize, чтобы нажать кнопку «Предоставить доступ», как только яУчетные данные отправляются

  • Затем, надеюсь, я обнаружу, что на самом деле могу использовать оставшуюся часть API для работы с файлами

(Grrr! учимсяправильно отформатировать текст на этом сайте примерно так же сложно !!:))

0 голосов
/ 12 февраля 2011

Я начал работать над этим же проектом сегодня и столкнулся с той же проблемой.Мне удалось обойти использование OAuth или OpenID, но я все еще работаю над тем, чтобы фактически загрузить файл ... который, кажется, должен быть легкой частью.В любом случае, вот что я сделал:

Я использую гем Mechanize, чтобы очистить страницу docs.google.com для форм имени пользователя и пароля.Я отправляю свои учетные данные через Mechanize и теперь имею доступ к своим документам Google.

На данный момент я обнаружил, что могу использовать URL-адрес для загрузки, упомянутый в этой документации Google:

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

URL выглядит следующим образом (я работаю с электронными таблицами):

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

Для настройки / тестирования я просто беру идентификатор ресурса своей электронной таблицы из адресной строкимоего веб-браузера (когда у меня открыта электронная таблица в моем браузере) и подключите ее к указанному выше URL-адресу на другой вкладке моего браузера. Это, похоже, работает, поскольку при отправке URL-адреса электронная таблица загружается в виде файла .xls. Примечаниеэто все с использованием моего веб-браузера.

Я не смог успешно начать загрузку с помощью сценария Ruby. Этот URL-адрес не является прямой ссылкой на файл, поэтому я не совсем уверен, как это сделать.правильно записать данные файла. Сценарий успешно выполняется, но если я сохраню выходные данные метода get (который использует этот URL-адрес в качестве аргумента) в Ruby, он выглядит какПеренаправление Javascript.Я, наверное, упускаю из виду что-то очевидное, но это то, где я нахожусь.Я виню то, что застрял в часах, которые я потратил на чтение OAuth и OpenID ... это было не очень весело.

Надеюсь, что-то из этого будет полезно.Вот еще один интересный драгоценный камень Ruby, с которым я столкнулся в своем исследовании аутентификации:

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

...