Instagram从网址嵌入代码(Rails)

时间:2016-02-04 10:30:37

标签: ruby-on-rails rubygems instagram instagram-api

在我的应用程序中,我想允许用户引入一个Instagram的URL,然后自动检索它的嵌入代码。

我找到了这个参考: https://www.instagram.com/developer/embedding/#oembed

当我在Chrome浏览器中尝试给定示例(https://api.instagram.com/oembed?url=http://instagr.am/p/fA9uwTtkSN)时,我会获得带有我正在寻找的代码的json。

但是,如果我从rails控制台尝试这个:

Net::HTTP.get_response(URI("https://api.instagram.com/oembed?url=http://instagr.am/p/fA9uwTtkSN"))

我明白了:

#<Net::HTTPMovedPermanently 301 MOVED PERMANENTLY readbody=true> 

我看到Instagram有一个新的API,但我不想让用户通过Instagram进行身份验证。

有办法吗?

2 个答案:

答案 0 :(得分:3)

您可以oembed gem使用soulim。很好,干净的方式来嵌入代码

如果是Instagram,就像

在您的宝石文件中包含以下行

gem 'oembed'

bundle install

创建一个帮助类

class InstaApi
  include Oembed::Client

  def endpoint_uri
    'http://api.instagram.com/oembed'
  end
end

现在你可以使用

instClient = InstaApi.new
info = instClient.fetch('http://instagr.am/p/BUG/')

获取嵌入代码

embed_code = info["html"]

答案 1 :(得分:1)

使用docs

def fetch(uri_str, limit = 10)
  # You should choose a better exception.
  raise ArgumentError, 'too many HTTP redirects' if limit == 0

  response = Net::HTTP.get_response(URI(uri_str))

  case response
  when Net::HTTPSuccess then
    response
  when Net::HTTPRedirection then
    location = response['location']
    warn "redirected to #{location}"
    fetch(location, limit - 1)
  else
    response.value
  end
end

str = "https://api.instagram.com/oembed?url=http://instagr.am/p/fA9uwTtkSN"
response = fetch(str)
redirected to https://api.instagram.com/publicapi/oembed/?url=http://instagr.am/p/fA9uwTtkSN
redirected to https://www.instagram.com/publicapi/oembed/?url=http://instagr.am/p/fA9uwTtkSN
redirected to https://api.instagram.com/oembed/?url=http://instagr.am/p/fA9uwTtkSN
=> #<Net::HTTPOK 200 OK readbody=true>

response.body
=> # JSON response

所以只需按照重定向即可。