Ruby on Rails - многочастная публикация OAuth 2 (загрузка в Facebook или Soundcloud) - PullRequest
4 голосов
/ 15 апреля 2011

Я работаю над приложением Rails, которое использует OmniAuth для сбора учетных данных Oauth / OAuth2 для моих пользователей, а затем публикует сообщения в этих службах от их имени.

Создание простых сообщений для обновления каналов статуса отлично работает ..Теперь я на грани необходимости загружать файлы.Facebook сообщает: «Чтобы опубликовать фотографию, отправьте запрос POST с вложением файла фотографии в виде multipart / form-data».http://developers.facebook.com/docs/reference/api/photo/

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

Я реализовал модуль здесь: Ruby: Как отправить файл через HTTP как multipart / form-data? чтобы получить заголовки и данные ...

if appearance.post.post_attachment_content_type.to_s.include?('image')

  fbpost = "https://graph.facebook.com/me/photos"

  data, headers = Multipart::Post.prepare_query("title" => appearance.post.post_attachment_file_name  , "document" => File.read(appearance.post.post_attachment.path))

  paramsarray = {:source=>data, :message=> appearance.post.content}
  response = access_token.request(:post, fbpost, paramsarray, headers)
  appearance.result = response
  appearance.save
end

Я, но я получаю OAuth2 :: HTTPError - Ошибка HTTP 400

Любая помощь будет невероятной ...Как я вижу, эта информация также понадобится для загрузки файлов в SoundCloud.

Спасибо,

Отметить

Ответы [ 2 ]

3 голосов
/ 29 апреля 2014

Боролся с этим сам.Библиотека oauth2 поддерживается Фарадеем для взаимодействия по HTTP.с небольшой настройкой он поддерживает загруженные файлы из коробки.Первым шагом является добавление соответствующего промежуточного программного обеспечения Фарадея при построении соединения.Пример из моего кода:

OAuth2::Client.new client_id, secret, site: site do |stack|
  stack.request :multipart
  stack.request :url_encoded
  stack.adapter  Faraday.default_adapter
end

Это добавляет поддержку многочастного кодирования к соединению Фарадея.Далее при выполнении запроса к вашему объекту токена доступа вы хотите использовать объект Faraday :: UploadIO.Итак:

upload = Faraday::UploadIO.new io, mime_type, filename
access_token.post('some/url', params: {url: 'params'}, body: {file: upload})

В приведенном выше коде:

io - объект ввода-вывода для файла, который вы хотите загрузить.Может быть объектом File или даже StringIO.

mime_type - тип mime загружаемого файла.Вы можете либо попытаться обнаружить эту серверную часть, либо, если пользователь загрузил вам файл, вы сможете извлечь тип mime из их запроса.

имя файла - Что это такое?вызов файла, который вы загружаете.Это также может быть определено по вашему собственному выбору, или вы можете просто использовать то, что пользователь, загружающий файл, называет его.

some / url - замените его URL-адресом, который вы хотите опубликовать

{url: 'params'} - замените его на любые URL-параметры, которые вы хотите предоставить

{file: upload} - замените его наваши данные из нескольких частей формы.Очевидно, одна (или более) из пар ключ / значение должны иметь экземпляр вашего файла загрузки.

0 голосов
/ 29 апреля 2013

Я на самом деле успешно использую этот код для загрузки фотографии на страницу fb:

dir = Dir.pwd.concat("/public/system/posts/images")
fb_url = URI.parse("https://graph.facebook.com/#{@page_id}/photos")
img = File.open("myfile.jpg")
req = Net::HTTP::Post::Multipart.new(
  "#{fb_url.path}?access_token=#{@token}", 
  "source" => UploadIO.new(img, "application/jpg", img.path),
  "message" => "some messsage"
) 
n = Net::HTTP.new(fb_url.host, fb_url.port)
n.use_ssl = true
n.verify_mode = OpenSSL::SSL::VERIFY_NONE
n.start do |http|
  @result = http.request(req)
end
...