Настройте виджет Instagram на панели инструментов Dashing.io

Я настроил панель инструментов, используя тире с несколькими (в основном) существующими виджетами. До сих пор это работало — см. производственную панель здесь (работа в процессе).

Теперь я хотел бы иметь виджет Instagram, который отображает n последние изображения, сделанные username. Я нашел виджет, который будет отображать изображения по long и lat, а также смог настроить свои токены, чтобы я мог общаться с API Instagram.

Вот код моего текущего виджета из статьи @mjamieson на github.

require 'instagram'
require 'rest-client'
require 'json'

# Instagram Client ID from http://instagram.com/developer
Instagram.configure do |config|
  config.client_id = ENV['INSTAGRAM_CLIENT_ID']
  config.client_secret = ENV['INSTAGRAM_CLIENT_SECRET']
end

# Latitude, Longitude for location
instadash_location_lat = '45.429522'
instadash_location_long = '-75.689613'


SCHEDULER.every '10m', :first_in => 0 do |job|
  photos = Instagram.media_search(instadash_location_lat,instadash_location_long)
  if photos
    photos.map do |photo|
      { photo: "#{photo.images.low_resolution.url}" }
    end
  end
  send_event('instadash', photos: photos)
end

Я заставил это работать, но хотел бы изменить данный вызов API, чтобы отображались только изображения, сделанные мной/пользователем по моему выбору. К сожалению, я недостаточно хорошо понимаю ruby ​​или json, чтобы понять, чего от меня требует документация API Instagram.

Я нашел следующий URL

https://api.instagram.com/v1/users/{user-id}/media/recent/?access_token={acces-token}

и попробовал (с заполненными моими учетными данными). Он правильно вернул данные json, включая мои изображения (среди прочих данных).

Как я могу изменить данный код для отображения изображений по имени пользователя, а не по местоположению?

Любая помощь приветствуется.


person dyscribe    schedule 29.09.2015    source источник


Ответы (2)


Вам понадобится access_token, чтобы получить контент от какого-либо пользователя. Взгляните на пример приложения на странице gem. Кажется, вам нужно что-то вроде этого:

# here we take access token from session, assuming you already got it
# sometime before and stored it there for future use
client = Instagram.client(:access_token => session[:access_token])
photos = client.user_recent_media

И этот пример, как получить этот access_token с помощью авторизации браузера OAuth2 и приложения sinatra:

require "sinatra"
require "instagram"

enable :sessions

CALLBACK_URL = "http://localhost:4567/oauth/callback"

Instagram.configure do |config|
  config.client_id = "YOUR_CLIENT_ID"
  config.client_secret = "YOUR_CLIENT_SECRET"
  # For secured endpoints only
  #config.client_ips = '<Comma separated list of IPs>'
end

get "/" do
  '<a href="/oauth/connect">Connect with Instagram</a>'
end

get "/oauth/connect" do
  redirect Instagram.authorize_url(:redirect_uri => CALLBACK_URL)
end

get "/oauth/callback" do
  response = Instagram.get_access_token(params[:code], :redirect_uri => CALLBACK_URL)
  session[:access_token] = response.access_token
  redirect "/nav"
end
person Alexey Shein    schedule 29.09.2015
comment
Привет. Спасибо за ваш ответ! Я посмотрю на это и посмотрю, смогу ли я заставить это работать. - person dyscribe; 29.09.2015
comment
Хорошо @Alexey-Shein У меня есть access_token, настроенный и сохраненный в моем локальном .env файле - я уже проверил данную часть документации, но нашел, что это не правильное решение - поскольку моя авторизация работает нормально, и я получаю пользовательские данные в формате json но не знаю, как выбрать правильные данные из этого json для помещения в send_event из scheduler из моего фрагмента кода. - person dyscribe; 29.09.2015

Решение

require 'sinatra'
require 'instagram'

# Instagram Client ID from http://instagram.com/developer
Instagram.configure do |config|
  config.client_id = ENV['INSTAGRAM_CLIENT_ID']
  config.client_secret = ENV['INSTAGRAM_CLIENT_SECRET']
  config.access_token = ENV['INSTAGRAM_ACCESS_TOKEN']
end

user_id = ENV['INSTAGRAM_USER_ID']

SCHEDULER.every '2m', :first_in => 0 do |job|
  photos = Instagram.user_recent_media("#{user_id}")
  if photos
    photos.map! do |photo|
      { photo: "#{photo.images.low_resolution.url}" }
    end
  end
  send_event('instadash', photos: photos)
end

Объяснение

1.) В дополнение к client_id и client_secret, которые я определил ранее, мне просто нужно было добавить access_token в раздел Instagram.configure.

2.) SCHEDULER работал правильно, но нужно было вызывать Instagram.user_recent_media("#{user_id}") вместо Instagram.media_search(instadash_location_lat,instadash_location_long)

3.) Для этого мне пришлось установить вторую отсутствующую переменную для user_id

Теперь вызов получает последние медиафайлы, отфильтрованные по идентификатору пользователя, и выводит их в виджет тире.

Спасибо за участие и подсказки! Это указало мне правильное направление документации и помогло мне разобраться в этом самому.

person dyscribe    schedule 30.09.2015