質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.37%

  • API

    1021questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

InstagramのAccess_tokenを取得する

解決済

回答 1

投稿 2017/12/08 01:26 ・編集 2017/12/08 13:23

  • 評価
  • クリップ 0
  • VIEW 65

odawarakouta

score 1

お手数かけますが、開発の手助けよろしくお願い致します。

 開発環境

ruby 2.4.0
rails 5.0.1

 実現したいこと

access_tokenを取得したい

 現状 

instagramのapiを使用しています。
sandboxuserで申請を出そうと実装しています。
client_idとclient_secret_idは取得できています。
callbackのurlにはしっかりとaccess_tokenが取得できています。
しかし、それの値がどこに格納されているかわからず、またどのように取得できるのかわからないです

 ソースコード
require "instagram"

CALLBACK_URL = "http://localhost:3000/api/instagram/callback"

Instagram.configure do |config|
  config.client_id = "xxxxxxxxxxxxxxxx"
  config.client_secret ="xxxxxxxxxxxxxxx"
end
class Api::InstagramsController < ApplicationController

  def get_json_test
    auth = request.env["omniauth.auth"]
    p auth
    binding.pry    #access_tokenが取得できているかデバッグしています
  end
end
確認方法
Instagram.client_id
=> "xxxxxxxxxxxxxxxxxxxx"

access_tokenだけがnilになります。

エラーメッセージ
Instagram.access_token
=> nil

試したこと

gem 'instagram'を使用して記事通りに記述
request.env["omniauth.auth"] => nil

参考記事(https://reviewlog.info/rails-instagram-api/)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

具体的に どのようなソースコードをお使いかわからないのですが、access_token が、取得できないというのは、Instagram にリダイレクトされた後、callback の URL に戻ってきているのでしょうか?


gem 'instagram' ということなので、ruby の ライブラリと判断して、facebookarchive/instagram-ruby-gem のサンプルが、ほぼそのまま動きそうな感じだったので、 CALLBACK_URL / client_id / client_secret あたりを変更して、実行してみた感じでは、問題なく access_token が、取得できています。

Sandbox Mode で使えない機能はダメですが、自分の画像は表示できました。


(2017.12.08 20:50追記)

質問に記載されている URL のサンプルがうまく動かなかったので、修正しようかと思ったのですが、書き直す方が早そうだったので、最低限の確認できるだけの内容で書き直してます。
rails 5.0.1 で動作確認しました。

index で、@a_token を使っていますが、アクセストークンを確認のために view に表示したいだけなので、確認が済んだら消してOKです。

1.Rails プロジェクトを作成

rails new app1

2.Gemfile の最後にに以下を追加

gem 'instagram'

3.Gemのインストール

bundle install --path vendor/bundle/

4.Instagram の client_id / client_secret を設定

config/initializers/instagram.rb

require "instagram"

Instagram.configure do |config|
  config.client_id = "INSTAGRAM_CLIENT_ID"
  config.client_secret = "INSTAGRAM_CLIENT_SECRET"
end

5.Home Controller を作成

rails g controller Home index

6.app/controllers/home_controller.rb を編集

class HomeController < ApplicationController
  require "instagram"

  # Callback URL (環境に合わせて変える)
  CALLBACK_URL = "http://example.com:3000/auth/instagram/callback"

  def index
    if session.key? :access_token
      @a_token = session[:access_token]
    end
  end

  # トークン発行URLへのリダイレクト
  def token
    redirect_to Instagram.authorize_url(:redirect_uri => CALLBACK_URL)
  end

  # access_tokenを取得 (コールバック)
  def get_token
    response = Instagram.get_access_token(params[:code], :redirect_uri => CALLBACK_URL)
    session[:access_token] = response.access_token
    redirect_to "/"
  end

  # メディアの表示
  def user_recent_media
    client = Instagram.client(:access_token => session[:access_token])
    @medias = client.user_recent_media
  end
end

7.ビューの作成

app/views/home/index.html.erb

<p><%= link_to "instagramにサインイン", "/auth/instagram" %></p>
<p><%= link_to "User Recent Media", "/user_recent_media" %> - ユーザーのメディアを表示</p>

<% if @a_token.present? %>
  <p>Instagram Access Token : <%= @a_token %> </p>
<% end %>

app/views/home/user_recent_media.html.erb

<p><%= link_to "Home", "/" %></p>

<% if @medias.present? %>
  <% @medias.each do |media| %>
    <%= link_to media.link, :target => "_blank" do %>
      <%= image_tag(media.images.low_resolution.url) %>
    <% end %>
  <% end %>
<% end %>

8.ルート定義

config/routes.rb 

Rails.application.routes.draw do
  root 'home#index'

  get "/auth/instagram"          => "home#token"
  get "/auth/instagram/callback" => "home#get_token"
  get "/user_recent_media"       => "home#user_recent_media"
end

9.サーバを実行

bundle exec rails s

webブラウザで、RailsアプリのURL( http://example.com:3000/ )に接続すると 一番上に「instagramにサインイン」のリンクがあると思うので、クリックすると Instagram の画面になって、アプリへの許可画面になるので、許可をしてください。
callback に戻って、最下行に 取得できたアクセストークンが、「Instagram Access Token : xxxxxxxxx」と表示されると思います。

「User Recent Media」のリンクをクリックすると ユーザーの画像を表示できると思います。(エラーチェックとかしていないので、Instagram にサインインしていない状態で、User Recent Media をクリックするとエラー画面になります。)

投稿 2017/12/08 12:15

編集 2017/12/08 20:57

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/08 13:04

    ご回答ありがとうございます。
    callbackのurlにはしっかりと帰ってきています。
    access_tokenがパラメーターとして返ってくると思っているのですが、Instagram.access_tokenがnilと出力されています。
    callbackのurlにはしっかりとaccess_tokenが存在しているのでどこかに存在はしていると思うのですが、どこに格納されているのかがわかりません。

    お手数おかけしますが、ご教授お願い致します。

    キャンセル

  • 2017/12/08 13:07

    お使いのソースコードを質問を編集して、記載していただけないでしょうか。

    キャンセル

  • 2017/12/08 13:24

    何度も有難うございます。
    修正いたしましたので確認よろしくお願いいたします

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.37%

関連した質問

同じタグがついた質問を見る

  • API

    1021questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。