8000 GitHub - mnd999/facebook4s: An asynchronous non-blocking Scala client for Facebook Graph API (Facebook api REST)
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

mnd999/facebook4s

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

facebook4s

Codacy Badge Build Status codecov.io License Join the chat at https://gitter.im/facebook4s

Prerequisites

  • Scala 2.12.x and 2.11.x

Installation

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")

Useful links

User guide

Configuration

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"
}

Create FacebookClient

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"))

Getting authentication uri

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)

Exchanging client code to access token

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)
}

Exchange short lived to long lived token

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)
}

Exchange long-lived token to client code

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

Obtaining app access token

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)
}

Post api

Supported fields - id, story, created_time, object_id, picture, from

facebookClient.post(FacebookPostId("499313270413277_527696260908311"), facebookAccessToken).map { post =>
  println("Post: " + post)
}

Feed api

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

Friends api

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

Like api

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)
}

Comment api

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)
}

User api

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

Photo api

Supported fields - id, created_time, images, album

facebookClient.photo(FacebookPhotoId("some photo id"), facebookAccessToken) map { photo =>
  println("Photo: " + photo)
}

Albums api

Supported fields - id, created_time, name

facebookClient.albums(profileId, userTokenRaw) map { albums =>
  println("Albums: " + albums)
}

Application api

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.

Either based api

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)
}

Error support in Result api

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.

Release process

  • Update build.sbt with new version
  • Enter sbt shell
  • Run publishSigned
  • Run sonatypeRelease

License

Facebook4s is released under the Apache 2 License.

About

An asynchronous non-blocking Scala client for Facebook Graph API (Facebook api REST)

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Scala 100.0%
0