A Scala library for the Instagram API. An asynchronous non-blocking Scala Instagram API Wrapper, implemented using play-json.
Scala 2.11.+ is supported.
- Go to https://www.instagram.com/developer/clients/manage/, login with your instagram account and register your application to get a client id and a client secret.
- Once the app has been created, register callback.
If you don't have it already, make sure you add the Maven Central as resolver in your SBT settings:
resolvers += Resolver.sonatypeRepo("releases")
Also, you need to include the library as your dependency:
libraryDependencies += "com.yukihirai0505" % "sinstagram_2.11" % "0.1.8"
http://mvnrepository.com/artifact/com.yukihirai0505/sinstagram_2.11/0.1.8
Add your client id and client secret as either environment variables or as part of your configuration. sInstagram will look for the following environment variables:
export INSTAGRAM_CLIENT_ID='my-instagram-client-id'
export INSTAGRAM_SECRET='my-instagram-secret'
export INSTAGRAM_CALLBACK_URL='my-instagram-callback-url'
You can also add them to your configuration file,
usually called application.conf
:
instagram {
client = {
id = "my-instagram-client-id"
secret = "my-instagram-secret"
}
callbackUrl = "my-instagram-callback-url"
}
These configurations will be automatically loaded when creating a instagram client, so all you have to do is to initialize your clients as following:
import com.yukihirai0505.sInstagram.InstagramAuth
import com.yukihirai0505.sInstagram.model.{ResponseType, Scope}
val instagramAuth = new InstagramAuth
val scopes: Seq[Scope] = Seq(Scope.BASIC)
val authUrl = instagramAuth.authURL(scopes = scopes)
val accessTokenFuture = instagramAuth.requestToken(code = "the-code-from-callback")
Alternatively, you can also specify your tokens directly when creating the client:
import com.yukihirai0505.sInstagram.model.{ResponseType, Scope}
import com.yukihirai0505.sInstagram.responses.auth.{AccessToken, Auth}
import com.yukihirai0505.sInstagram.{Instagram, InstagramAuth}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Failure, Success}
val clientId = "client-id"
val clientSecret = "client-secret"
val callbackUrl = "callback-URI"
val instagramAuth = new InstagramAuth
val scopes: Seq[Scope] = Seq(Scope.BASIC) // other: Scope.FOLLOWER_LIST, Scope.PUBLIC_CONTENT, Scope.COMMENTS, Scope.LIKES, Scope.RELATIONSHIPS
// Server-Side login
// Step 1: Get a URL to call. This URL will return the CODE to use in step 2
val authUrl = instagramAuth.authURL(clientId, callbackUrl, ResponseType.CODE, scopes)
// Step 2: Use the code to get an AccessToken
val accessTokenFuture = instagramAuth.requestToken(clientId, clientSecret, callbackUrl, "the-code-from-step-1")
val accessToken = accessTokenFuture onComplete {
case Success(Some(token: AccessToken)) => token
case Failure(t) => println("An error has occured: " + t.getMessage)
}
// Making an authenticated call
val auth: Auth = AccessToken("an-access-token")
// If you want to use signed access token
// val auth: Auth = SignedAccessToken("an-access-token", clientSecret)
val instagram: Instagram = new Instagram(auth)
// The library is asynchronous by default and returns a promise.
val future = instagram.getRecentMediaFeed()
import scala.language.postfixOps
future onComplete {
case Success(body) =>
body.fold()(b => b.data.foreach(println))
case Failure(t) => println("An error has occured: " + t.getMessage)
}
Please look at this file to see all available methods:
inspired by following source code