A Ruby wrapper for the Instagram REST and Search APIs
gem install instagram
You should follow @instagramapi on Twitter for announcements, updates, and news about the Instagram gem.
https://groups.google.com/group/instagram-ruby-gem
Add it to the apps wiki!
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"
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 "/feed"
end
get "/feed" do
client = Instagram.client(:access_token => session[:access_token])
user = client.user
html = "<h1>#{user.username}'s recent photos</h1>"
for media_item in client.user_recent_media
html << "<img src='#{media_item.images.thumbnail.url}'>"
end
html
end
require "rubygems"
require "instagram"
# All methods require authentication (either by client ID or access token).
# To get your Instagram OAuth credentials, register an app at http://instagr.am/oauth/client/register/
Instagram.configure do |config|
config.client_id = YOUR_CLIENT_KEY
config.access_token = YOUR_ACCESS_TOKEN
end
# Get a list of a user's most recent media
puts Instagram.user_recent_media(777)
# Use pagination data from a response to get the next page
page_1 = Instagram.user_recent_media(777)
page_2_max_id = page_1.pagination.next_max_id
page_2 = Instagram.user_recent_media(777, :max_id => page_2_max_id ) unless page_2_max_id.nil?
# Get the currently authenticated user's media feed
puts Instagram.user_media_feed
# Get a list of recent media at a given location, in this case, the Instagram office
puts Instagram.location_recent_media(514276)
# Get a list of media close to a given latitude and longitude
puts Instagram.media_search("37.7808851","-122.3948632")
# Get a list of the overall most popular media items
puts Instagram.media_popular
# Search for users on instagram, by name or username
puts Instagram.user_search("shayne sweeney")
# Search for a location by lat/lng
puts Instagram.location_search("37.7808851","-122.3948632")
# Search for a location by Fousquare ID (v2)
puts Instagram.location_search("3fd66200f964a520c5f11ee3")
When you are 'unit testing' your code maybe you need to stub http requests to test how your application behaves with different responses (and maybe you don't want to automize the whole Instagram sign-in process in order to get the necessary access token).
You can have this gem to respond with pre-defined responses so you don't have to stub them yourself.
Note: you need to 'gem install webmock'.
#Activation (ie: in your spec_helper)
Instagram.activate_test_bed
#NOTE: only requests shown here are stubbed; any other request will still connect to Instagram (-> WebMock.allow_net_connect!)
#Authentication
response = Instagram.get_access_token("test_bed", :redirect_uri => CALLBACK_URL)
response.user.username #=> "steookk"
response.access_token #=> "test_bed_at"
#unit test your callback action
expect(session[:access_token]).to match response.access_token #=> "test_bed_at"
#if you need to simulate a problem in Instagram (it doesn't respond)
response = Instagram.get_access_token("test_bed_not_respond", :redirect_uri => CALLBACK_URL)
#response => nil
client = Instagram.client(:access_token => 'test_bed_at')
#Media
client.media_item('18600493') #18600493 is the only stubbed id
client.media.media_popular
#User's media
client.user_media_feed
client.user_recent_media
#User
client.user('4') #4 is the only stubbed id
#Tags
client.tag_search('tag')
client.tag('tag')
client.tag_recent_media('tag')
If for some reason you need to disable WebMock, just write in your tests:
WebMock.disable!
In the spirit of free software, everyone is encouraged to help improve this project.
Here are some ways you can contribute:
- by using alpha, beta, and prerelease versions
- by reporting bugs
- by suggesting new features
- by writing or editing documentation
- by writing specifications
- by writing code (no patch is too small: fix typos, add comments, clean up inconsistent whitespace)
- by refactoring code
- by closing issues
- by reviewing patches
Submitting an Issue ------------------- t We use the GitHub issue tracker to track bugs and features. Before submitting a bug report or feature request, check to make sure it hasn't already been submitted. You can indicate support for an existing issuse by voting it up. When submitting a bug report, please include a Gist that includes a stack trace and any details that may be necessary to reproduce the bug, including your gem version, Ruby version, and operating system. Ideally, a bug report should include a pull request with failing specs.
- Fork the project.
- Create a topic branch.
- Implement your feature or bug fix.
- Add documentation for your feature or bug fix.
- Run rake doc:yard. If your changes are not 100% documented, go back to step 4.
- Add specs for your feature or bug fix.
- Run rake spec. If your changes are not 100% covered, go back to step 6.
- Commit and push your changes.
- Submit a pull request. Please do not include changes to the gemspec, version, or history file. (If you want to create your own version for some reason, please do so in a separate commit.)
Copyright (c) 2011 Instagram (Burbn, Inc). See LICENSE for details.