3

Instagram gem とリアルタイム API で興味深い動作が見られました。サブスクリプションを作成し、Instagram の応答を処理するための基本的なアプリを作成しようとしています。以下は、サブスクリプションを作成し、タグ名をデータベースに保存するコードです。

  def create
    @subscription = Subscription.new params[:subscription]
    options = {:object_id => params[:subscription][:tag_name]}

    if @subscription.save
      Instagram.create_subscription('tag', "http://myapp.herokuapp.com/subscriptions/process_subscription/", aspect = 'media', options)
      redirect_to "/subscriptions/tag/#{@subscription.tag_name}"
  end

コールバック URL が到達可能な heroku にあることに注意してください。興味深いのはsubscriptions/new、heroku ドメインにアクセスすると、Instagram API から「Bad Request, Unable to reach callback URL」というメッセージが表示されることです。同じコールバック URL を使用して curl でサブスクリプションを作成すると、すべてが期待どおりに機能しsubscriptions/new、(同じコールバック URL が設定された) ローカルホストに移動すると、期待どおりに機能します。以下は process_subscription アクションです。

def process_subscription
  if params["hub.challenge"]
    render :text => params["hub.challenge"]
  else      
    PrivatePub.publish_to("/subscriptions/tag/#{params[:object_id]}", payload: params[:_json])
  end
end

最初の if ステートメントは、pubsubhubub チャレンジを処理します。サブスクリプションが実際に作成されると、ペイロードの受信と処理に問題はありません。だから今私が考えることができる唯一のことは、私がherokuドメインにいるとき、Instagramがそれに返信するときにサーバープロセスが何らかの形でビジーであることです.

サブスクリプションが成功した場合と失敗した場合のサーバー ログへのリンクを次に示します。これらのログで post パラメータをログアウトしていたことに注意してください。https://gist.github.com/4256108 .

4

1 に答える 1

5

多くの試行錯誤の後、Instagram がその「hub.challenge」をアプリに送り返し、「Bad Request, Unable to reach callback URL」というエラーが発生したときに、問題は Rails プロセスがビジー状態になっているように見えてきました。

私にとってうまくいったのは、別のスレッドを使用して Instagram サブスクリプションを作成することでした。このようにして、Instagram はほぼ瞬時にアプリをヒットし、コールバック URL に到達できます。このソリューションは最も速く、最も軽量でした。おそらく、Heroku でワーカーを 1 つほど購入し、これを Sidekiq などを介してバックグラウンド プロセスに移動することは有益ですが、ハブ チャレンジに対応するだけでは少しやり過ぎに思えます。

  def instagram_photos
    Thread.new do |t|
      options = {:object_id => params[:tag_name]}
      Instagram.create_subscription('tag', "http://myapp.herokuapp.com/subscriptions/process_subscription", aspect = 'media', options)
      t.exit
    end
    redirect_to root_path
  end
于 2012-12-18T18:43:58.917 に答える