在 Dashing.io 仪表板上自定义 Instagram 小部件

Customize Instagram widget on a Dashing.io dashboard

我已经使用 dashing 和许多(大部分)现有小部件设置了一个仪表板。到目前为止工作正常 - see production dashboard here (进行中).

现在我想要一个 Instagram 小部件来显示 nusername 拍摄的最新图像。 我找到了一个小部件,可以显示 longlat 的图像,并且还能够配置我的令牌,所以我可以与 Instagram API.

交谈

这是我当前小部件的代码 originally from @mjamieson's gist on 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 的理解还不足以弄清楚 Instagram API 文档要我做什么。

我找到了以下 url

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

并尝试了(填写了我的凭据)。它正确返回 json 数据,包括我的图像(以及其他数据)。

如何修改给定代码以按用户名而不是位置显示图像?

非常感谢任何帮助。

您需要 access_token 才能从某些用户那里获取内容。查看 gem 页面上的 sample application。 看来你需要这样的东西:

# 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

以及这个示例如何使用 OAuth2 浏览器授权和 sinatra 应用程序获得此 access_token:

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

解决方案

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_idclient_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

设置第二个缺失变量

现在调用获取按用户 ID 过滤的最近媒体并将其输出到 dashing 小部件中。

感谢您的参与和指点!这为我指明了文档的正确方向,并帮助我自己弄明白了。