LoginSignup
23
19

More than 5 years have passed since last update.

RailsでInstagramのハッシュタグ検索を作る

Last updated at Posted at 2016-06-21

2016年6月からInstagramの仕様が変更となり、審査に通らないと自動的にsandboxモードになるようになりました。
詳しくは以下の様なサイトを参照してください。

https://dandashokai.com/1315
http://outof-rails.seesaa.net/article/432446339.html

自分のページだけで使用するアプリにInstagramAPIを利用する場合、審査に通らない可能性が非常に高いので、ここではsandboxモードで使用することを前提に書きます。

最終目的としては、特定のハッシュタグでの投稿を集めることです。
下記の猫stagramみたいな感じです。

http://blog.ruedap.com/2011/02/28/instagram-api-of-exclusive-use-for-cat-lovers-nekostagram

基本的には上記の猫stagramのページのままなのですが、初心者用の詳しい内容などが載っているページが見つからなかったので、今後の自分のメモとしても残します。

必要となるgemは'instagram'のみです。

環境

Ruby 2.3.0
Rails 4.2.3

1.Gemファイルに gem 'instagram' を追加する

gem 'instagram'

2.bundle install実行

普通に「bundle install」を実行します。

3.config > initializersにconstants.rbファイルを作成

Railsコマンドを使わずに「constants.rb」という名前のファイルを作るだけです。

4.作成したconstants.rbファイルを編集

constants.rb
module Constants

  # instagram
  ACCESS_TOKEN = "******"
end

その他も設定したい方はこちら↓

constants.rb
module Constants

  # instagram
  CLIENT_ID = "******"
  CLIENT_SECRET = "******"
  ACCESS_TOKEN = "******"
  REDIRECT_URL = '******'
  TAG_NAME = '******'
end

各項目の取得方法は以下URL参照

http://magicalsally.net/instagram-api-access-token/

確か上記ページの通りにするとエラーが出たと思うのですが、その時はエラーメッセージの最後の文章でググったらすぐ出てきたと思います。

「CLIENT_ID」とか「CLIENT_SECRET」は変数なので分かりやすければ何でもいいです。
twitterとかfacebookとか他のSNSの情報も持たせたい場合は「TW_CLIENT_ID」とかにすると分かりやすいです。
ただしコントローラーと整合性は持たせてくださいね(^o^)

5.コントローラ(app > controllers > top_controller.rb)の設定

top_controller.rb
class TopController < ApplicationController
  require 'instagram'
  require 'json'

  def index
    Instagram.access_token = "#{Constants::ACCESS_TOKEN}"

    unless Instagram.tag_recent_media("はんにゃらばんばんばん")
      @medias = ""
    else
      @medias = Instagram.tag_recent_media("はんにゃらばんばんばん")
    end
  end
end

嫌だー!access_token以外も使いたいんだー!という方はこちら↓

top_controller.rb
class TopController < ApplicationController
  require 'instagram'
  # require 'uri'
  require 'json'

  def index
    Instagram.configure do |config|
      config.client_id = "#{Constants::CLIENT_ID}"
      config.client_secret = "#{Constants::CLIENT_SECRET}"
      config.access_token = "#{Constants::ACCESS_TOKEN}"
    end

    unless Instagram.tag_recent_media("はんにゃらばんばんばん")
      @medias = ""
    else
      @medias = Instagram.tag_recent_media("はんにゃらばんばんばん")
    end
  end
end

6.view(app > views > top > index.html.erb)の編集

index.html.erb

<% if @medias == nil %>
  <%= "投稿がありません" %>
<% else %>

<% @medias.each do |media| %>
<!-- 投稿画像 -->
  <%= link_to image_tag(media.images.low_resolution.url, :class => "img- rounded" ), media.link, :target=>["_blank"] %><br>
<!-- 投稿者名 -->
  <%= media['caption']['from']['full_name'] %><br>
<!-- コメント -->
  <%= media.caption.text %><br>
<!-- いいねカウント -->
  <img src = "/images/heart.gif"><%= media['likes']['count'] %><br>
<!-- コメントカウント -->
  <img src = "/images/comment.gif"><%= media['comments']['count'] %><br>
  <% end %>
<% end %>

完成

これで完成です。
全然成形していないので、縦にダラダラでてきますのでCSSとかで適当にいじって下さい。
その他の情報を記載したい場合はindex.html.erbの中に「<%= @medias %>」を置けば、JSONが表示されるので、表示したい内容を探して付け加えて下さい。

全然出ないじゃねーか!と突っ込まれる前にAPIにユーザーを登録したか確認してくださいね(^^;)
sandboxモードだと登録済みユーザーの中でハッシュタグ検索した結果しか出ませんから(ToT)
非常に使いにくいAPIになってしまいましたね・・・

23
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
19