Проблемы при попытке загрузить изображение в Twitter через POST в Синатре - PullRequest
1 голос
/ 18 ноября 2011

Я использую Sinatra 1.2.6 в Ruby 1.8.7, и у меня есть что-то вроде клиента Twitter, который я пишу. Я использую Twitter gem версии 1.7.2, написанную Джоном Нунемейкером. Для базы данных ORM я использую Sequel 3.29.0.

В целом все работает отлично. У меня работает хорошая последовательность Oauth, и любой пользователь, который проходит через процесс Oauth, может публиковать твиты в моем приложении.

Однако я не могу на всю жизнь загрузить загрузку мультимедиа с использованием update_with_media. Я пытаюсь загрузить файл изображения с октетным потоком, состоящий из нескольких частей, сохранить его в памяти, а затем передать его в Twitter.

post '/file_upload' do
  user_name = params[:user]
  if params[:action] == "FILE-UPLOAD"
    unless params[:name].match(/\.jpg|png|jpeg/).nil?

          #Assume these 3 lines work, and properly authorize to Twitter
      current_user = User[:user_name => user_name, :current_account => "1"]
      client = current_user.authorize_to_twitter #Handles the Oauth keys/process
          client.update("Text status updates work properly") 

          #Something incorrect is happening in the next two lines. 
          #I'm either handling the file upload wrong, or posting wrong to Twitter
      datafile = params[:file]
      client.update_with_media("File upload from Skype: ", datafile)
      return "File uploaded ok"
    end
  end
end

Тем не менее, когда я пытаюсь это сделать, я получаю:

Twitter::Unauthorized - POST https://upload.twitter.com/1/statuses/update_with_media.json: 401: Could not authenticate with OAuth.

Это говорит, что строка, вызывающая эту ошибку, является строкой client.update_with_media.

Я пытаюсь использовать Rack :: RawUpload , но я не знаю, правильно ли я его использую. Если мне не нужно его использовать, я не буду, но я просто застрял. Единственная вещь вне этого фрагмента кода, которая использует это, - это вверху моего кода:

require 'rack/raw_upload'
use Rack::RawUpload

Любая помощь по этому вопросу будет очень цениться. Я также пытался возиться с Tempfile.new (), но это, похоже, не сильно помогло, и я получал либо 401, либо 403 ошибки. Я довольно новичок в Ruby, поэтому было бы полезно как можно точнее рассказать о необходимых изменениях.

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

1 Ответ

0 голосов
/ 01 октября 2012

Вам необходимо проверить, как HTTP-заголовки вашей библиотеки настроены и логически связаны с методом POST, который вы написали здесь.Дело в том, что для upload_with_media твиттер-API в этой версии гема требует, чтобы вы использовали http://upload.twitter.com конечную точку загрузки вместо конечной точки API по умолчанию.Драгоценный камень может форсировать сайт API, поэтому, хотя обновление статуса на основе OAuth работает нормально, оно вылетает, когда вы пробуете его с изображением.Вам нужно будет просмотреть документацию по гему, чтобы выяснить, как принудительно загрузить сайт Twitter в заголовки HTTP для этого метода.

В качестве альтернативы рассмотрите возможность обновления до последней версии гема Twitter.Это то, что я получил от http://rdoc.info/gems/twitter

Метод Twitter :: API # update_with_media больше не использует пользовательскую конечную точку upload.twitter.com, поэтому конфигурация media_endpoint была удалена.Аналогично, метод поиска Twitter :: API # больше не использует настраиваемую конечную точку search.twitter.com, поэтому конфигурация search_endpoint также была удалена.

...