- Scala 2.12.x and 2.11.x
Add the following line to your sbt dependencies:
"com.github.vooolll" %% "facebook4s" % "0.2.7"
Note: make sure that you have in your build.sbt
resolvers += Resolver.sonatypeRepo("releases")
Add your client id
(application id
) and application secret
to your environment variables:
export FACEBOOK_CLIENT_ID='your client id'
export FACEBOOK_APP_SECRET='your application secret'
export FACEBOOK_REDIRECT_URI='http://localhost:9000/redirect'
or
you can use typesafe config, typically known as application.conf
facebook {
clientId = "your client id"
redirectUri = "http://localhost:9000/redirect"
appSecret = "your application secret"
}
In order to use api you need to create FacebookClient
all api is available via this object
import client.FacebookClient
val facebookClient = FacebookClient()
In example above FacebookClient
will use configured parameters, see Configuration.
If you want to specify client id and application secret explicitly you can do it as expected:
import client.FacebookClient
val facebookClient = FacebookClient("your client id", "your app secret")
or you can use types to your advantage:
import client.FacebookClient
import domain.{FacebookClientId, FacebookAppSecret}
val facebookClient = FacebookClient(FacebookClientId("your client id"), FacebookAppSecret("your app secret"))
FacebookClient
can be used to get authentication url for client. It is starting point if you want to use api.
import client.FacebookClient
import domain.permission.FacebookPermissions.UserDataPermissions.Posts
val facebookClient = FacebookClient()
val urlWithCodeAsQueryParam = facebookClient.authUrl(Seq(Posts))
println(urlWithCodeAsQueryParam) // prints url client needs to request to get credentials (client code by default)
Or you can tell to FacebookClient
that you want to receive access token
instead of client code
by passing specific argument:
import domain.permission.FacebookPermissions.UserDataPermissions.Posts
import domain.oauth.FacebookToken
val urlWithTokenAsQueryParam = facebookClient.authUrl(Seq(Posts), FacebookToken)
After client code
received, it can be exchanged to access token
.
import client.FacebookClient
import scala.util.{Success, Failure}
val facebookClient = FacebookClient()
val clientCode = "code from request"
facebookClient.userAccessToken(clientCode) onComplete {
case Success(token) => println(token)
case Failure(e) => println(e.getMessage)
}
In order to access api you typically need user access token, it is often obtained by client application, so assuming you already have one:
val shortLivedAccessToken = "user access token"
Then you may exchange it to long lived access token, you need to create FacebookClient
object:
import client.FacebookClient
import scala.util.{Success, Failure}
val facebookClient = FacebookClient()
facebookClient.extendUserAccessToken(shortLivedAccessToken) onComplete {
case Success(longLivedToken) => println(longLivedToken)
case Failure(e) => println(e.getMessage)
}
It is possible to obtain client code using api call and long lived token from previous auth:
import client.FacebookClient
import scala.util.{Success, Failure}
val facebookClient = FacebookClient()
val longLivedTokeValue = "long-lived-token-value"
facebookClient.clientCode(longLivedTokeValue) onComplete {
case Success(code) => println(code)
case Failure(e) => println(e.getMessage)
}
After obtaining client code you can send it to client over secure channel
In some cases you may need your application access token, you can get it using appAccessToken
api call:
import client.FacebookClient
import scala.util.{Success, Failure}
val facebookClient = FacebookClient()
facebookClient.appAccessToken() onComplete {
case Success(appAccessToken) => println(appAccessToken)
case Failure(e) => println(e.getMessage)
}
Supported fields - id
, story
, created_time
, object_id
, picture
, from
facebookClient.post(FacebookPostId("499313270413277_527696260908311"), facebookAccessToken).map { post =>
println("Post: " + post)
}
FacebookFeed
includes List[FacebookPost]
. So the same fields supported as listed in post api section.
import domain.feed._
import domain.profile._
import domain.oauth._
import client.FacebookClient
import scala.concurrent.ExecutionContext.Implicits.global
val facebookClient = FacebookClient()
val
8000
facebookAccessToken: FacebookAccessToken = ??? // your token
// Feed
facebookClient.feed(FacebookUserId("499283963749541"), facebookAccessToken) map(feed =>
println(feed)
)
// or you can use raw string
facebookClient.feed(FacebookUserId("499283963749541"), "your user access token") map(feed =>
println(feed))
Supported fields - id
, name
, picture
, locale[depricated]
, first_name
, last_name
, link
, gender
, cover[depricated]
, updated_time[depricated]
Note: Summary(total friends count) and paging will be returned ass well
facebookClient.friends(FacebookUserId("499283963749541"), facebookAccessToken) map(friends =>
println(friends)
)
Supported like
fields - id
, name
Supported summary
(optional) fields - total_count
, can_like
, has_liked
facebookClient.likes(FacebookPostId("499313270413277_527696260908311"), facebookAccessToken, summary = true).map { likes =>
println("Like: " + likes)
}
Supported comment
fields - id
, from
, created_time
, message
, parent
, object
, attachment
Supported summary
(optional) fields - total_count
, order
, can_comment
facebookClient.comments(FacebookPostId("499313270413277_527696260908311"), facebookAccessToken, summary = true).map { comments =>
println("Comments: " + comments)
}
Supported fields - id
, name
, picture
, locale[depricated]
, first_name
, last_name
, verified[depricated]
, link
, timezone[depricated]
, gender
,
age_range
, cover[depricated]
, updated_time[depricated]
facebookClient.userProfile(FacebookUserId("499283963749541"), facebookAccessToken) map(user =>
println(user)
)
//raw string value supported as well
facebookClient.userProfile(FacebookUserId("499283963749541"), "your user access token") map(user =>
println(user)
)
Supported fields - id
, created_time
, images
, album
facebookClient.photo(FacebookPhotoId("some photo id"), facebookAccessToken) map { photo =>
println("Photo: " + photo)
}
Supported fields - id
, created_time
, name
facebookClient.albums(profileId, userTokenRaw) map { albums =>
println("Albums: " + albums)
}
facebookClient.application(FacebookConfig.clientId, facebookAccessToken) map(application =>
println("Application: " + application)) //Application: FacebookApplication(FacebookAppId(1969406143275709),https://www.facebook.com/games/?app_id=1969406143275709,testing_app)
//or
facebookClient.application(FacebookAppId("1969406143275709"), facebookAccessToken) map(application =>
println("Application: " + application) //Application: FacebookApplication(FacebookAppId(1969406143275709),https://www.facebook.com/games/?app_id=1969406143275709,testing_app)
)
Note: in terms of facebook4s there is no difference between client_id
and application_id
.
In case you want to use Result
(Either
) based api you can use Result suffixed methods, for example if facebookClient.userProfile
return Future[FacebookUser]
, then facebookClient.userProfileResult
returns Future[Either[FacebookError, FacebookUser]]
Example:
facebookClient.userProfileResult(userId, facebookAccessToken) map {
case Right(user) => println("Success: " + user)
case Left(error) => println("Failure: " + error)
}
List of supported errorType
's of FacebookError
Set(InvalidApiKey, Session, Unknown, ServiceDown, TooManyCalls, UserTooManyCalls, PermissionDenied,
AccessTokenHasExpired, ApplicationLimitReached, Blocked, DuplicatePost,
ErrorPostingLink, PermissionNotGrantedOrRemoved, InvalidVerificationCodeFormat, SpecifiedObjectNotFound)
The list is not full, feel free to contribute by adding new error types.
- Update
build.sbt
with new version - Enter
sbt
shell - Run
publishSigned
- Run
sonatypeRelease
Facebook4s is released under the Apache 2 License.