Documentation ¶
Overview ¶
Package facebook is a Go library fully supports Facebook Graph API with file upload and batch request. It can be used in Google App Engine.
Library design is highly influenced by facebook official PHP/JS SDK. If you have experience with PHP/JS SDK, you may feel quite familiar with it.
Go to project home page to see samples. Link: https://github.com/huandu/facebook
Index ¶
- Constants
- Variables
- func SetHttpClient(client HttpClient)
- type AdAccountUsage
- type AdsInsightsThrottle
- type App
- func (app *App) AppAccessToken() string
- func (app *App) ExchangeToken(accessToken string) (token string, expires int, err error)
- func (app *App) GetCode(accessToken string) (code string, err error)
- func (app *App) ParseCode(code string) (token string, err error)
- func (app *App) ParseCodeInfo(code, machineID string) (token string, expires int, newMachineID string, err error)
- func (app *App) ParseSignedRequest(signedRequest string) (res Result, err error)
- func (app *App) Session(accessToken string) *Session
- func (app *App) SessionFromSignedRequest(signedRequest string) (session *Session, err error)
- type BatchResult
- type BinaryData
- type BinaryFile
- type BusinessUseCaseUsage
- type DebugInfo
- type DebugMessage
- type DebugMode
- type Error
- type Float32
- type Float64
- type HttpClient
- type Int
- type Int16
- type Int32
- type Int64
- type Int8
- type Method
- type PagingResult
- func (pr *PagingResult) Data() []Result
- func (pr *PagingResult) Decode(v interface{}) (err error)
- func (pr *PagingResult) HasNext() bool
- func (pr *PagingResult) HasPrevious() bool
- func (pr *PagingResult) Next() (noMore bool, err error)
- func (pr *PagingResult) Previous() (noMore bool, err error)
- func (pr *PagingResult) UsageInfo() *UsageInfo
- type Params
- type RateLimiting
- type Result
- func Api(path string, method Method, params Params) (Result, error)
- func Batch(batchParams Params, params ...Params) ([]Result, error)
- func BatchApi(accessToken string, params ...Params) ([]Result, error)
- func Delete(path string, params Params) (Result, error)
- func Get(path string, params Params) (Result, error)
- func MakeResult(jsonBytes []byte) (Result, error)
- func Post(path string, params Params) (Result, error)
- func Put(path string, params Params) (Result, error)
- func Request(request *http.Request) (Result, error)
- func (res Result) Batch() (*BatchResult, error)
- func (res Result) DebugInfo() *DebugInfo
- func (res Result) Decode(v interface{}) (err error)
- func (res Result) DecodeField(field string, v interface{}) error
- func (res Result) Err() error
- func (res Result) Get(field string) interface{}
- func (res Result) GetField(fields ...string) interface{}
- func (res Result) Paging(session *Session) (*PagingResult, error)
- func (res Result) UsageInfo() *UsageInfo
- type Session
- func (session *Session) AccessToken() string
- func (session *Session) Api(path string, method Method, params Params) (Result, error)
- func (session *Session) App() *App
- func (session *Session) AppsecretProof() string
- func (session *Session) Batch(batchParams Params, params ...Params) ([]Result, error)
- func (session *Session) BatchApi(params ...Params) ([]Result, error)
- func (session *Session) Context() context.Context
- func (session *Session) Debug() DebugMode
- func (session *Session) Delete(path string, params Params) (Result, error)
- func (session *Session) EnableAppsecretProof(enabled bool) error
- func (session *Session) Get(path string, params Params) (Result, error)
- func (session *Session) Inspect() (result Result, err error)
- func (session *Session) Post(path string, params Params) (Result, error)
- func (session *Session) Put(path string, params Params) (Result, error)
- func (session *Session) Request(request *http.Request) (res Result, err error)
- func (session *Session) SetAccessToken(token string)
- func (session *Session) SetDebug(debug DebugMode) DebugMode
- func (session *Session) User() (id string, err error)
- func (session *Session) Validate() (err error)
- func (session *Session) WithContext(ctx context.Context) *Session
- type Uint
- type Uint16
- type Uint32
- type Uint64
- type Uint8
- type UsageInfo
Constants ¶
const (
// ErrCodeUnknown is unknown facebook graph api error code.
ErrCodeUnknown = -1
)
Variables ¶
var ( // Version is the default facebook api version. // It can be any valid version string (e.g. "v2.3") or empty. // // See https://developers.facebook.com/docs/apps/versions for details. Version string // Debug is the app level debug mode. // After setting DebugMode, all newly created session will use the mode // to communicate with graph API. // // See https://developers.facebook.com/docs/graph-api/using-graph-api/v2.3#debugging Debug DebugMode // RFC3339Timestamps will cause all requests to return RFC3339 formatted timestamps. // RFC3339 is the timestamp format that the built in UnmarshalJSON expects. RFC3339Timestamps bool )
Functions ¶
func SetHttpClient ¶
func SetHttpClient(client HttpClient)
SetHttpClient updates the http client of default session.
Types ¶
type AdAccountUsage ¶
type AdAccountUsage struct {
AccIDUtilPCT float64 `json:"acc_id_util_pct"` // Percentage of calls made for this ad account.
}
AdAccountUsage is the rate limiting header for Ads API.
type AdsInsightsThrottle ¶
type AdsInsightsThrottle struct { AppIDUtilPCT float64 `json:"app_id_util_pct"` // The percentage of allocated capacity for the associated app_id has consumed. AccIDUtilPCT float64 `json:"acc_id_util_pct"` // The percentage of allocated capacity for the associated ad account_id has consumed. }
AdsInsightsThrottle is the rate limiting header for Ads Insights API.
type App ¶
type App struct { // Facebook app id AppId string // Facebook app secret AppSecret string // Facebook app redirect URI in the app's configuration. RedirectUri string // Enable appsecret proof in every API call to facebook. // Facebook document: https://developers.facebook.com/docs/graph-api/securing-requests EnableAppsecretProof bool }
App holds facebook application information.
func (*App) AppAccessToken ¶
AppAccessToken gets application access token, useful for gathering public information about users and applications.
func (*App) ExchangeToken ¶
ExchangeToken exchanges a short-lived access token to a long-lived access token. Return new access token and its expires time.
func (*App) GetCode ¶
GetCode gets code from a long lived access token. Return the code retrieved from facebook.
func (*App) ParseCode ¶
ParseCode redeems code for a valid access token. It's a shorthand call to ParseCodeInfo(code, "").
In facebook PHP SDK, there is a CSRF state to avoid attack. That state is not checked in this library. Caller is responsible to store and check state if possible.
func (*App) ParseCodeInfo ¶
func (app *App) ParseCodeInfo(code, machineID string) (token string, expires int, newMachineID string, err error)
ParseCodeInfo redeems code for access token and returns extra information. The machineId is optional.
See https://developers.facebook.com/docs/facebook-login/access-tokens#extending
func (*App) ParseSignedRequest ¶
ParseSignedRequest parses signed request.
func (*App) SessionFromSignedRequest ¶
SessionFromSignedRequest creates a session from a signed request. If signed request contains a code, it will automatically use this code to exchange a valid access token.
type BatchResult ¶
type BatchResult struct { StatusCode int // HTTP status code. Header http.Header // HTTP response headers. Body string // Raw HTTP response body string. Result Result // Facebook api result parsed from body. }
BatchResult represents facebook batch API call result. See https://developers.facebook.com/docs/graph-api/making-multiple-requests/#multiple_methods.
type BinaryData ¶
type BinaryData struct { Filename string // filename used in multipart form writer. Source io.Reader // file data source. ContentType string // content type of the data. }
BinaryData represents binary data from a given source.
func Data ¶
func Data(filename string, source io.Reader) *BinaryData
Data creates new binary data holder.
func DataWithContentType ¶
func DataWithContentType(filename string, source io.Reader, contentType string) *BinaryData
DataWithContentType creates new binary data holder with arbitrary content type.
type BinaryFile ¶
type BinaryFile struct { Filename string // filename used in multipart form writer. Path string // path to file. must be readable. ContentType string // content type of the file. }
BinaryFile represents a file on disk.
func FileAlias ¶
func FileAlias(filename, path string) *BinaryFile
FileAlias creates a binary file holder and specific a different path for reading.
func FileAliasWithContentType ¶
func FileAliasWithContentType(filename, path, contentType string) *BinaryFile
FileAliasWithContentType creates a new binary file holder with arbitrary content type.
type BusinessUseCaseUsage ¶
type BusinessUseCaseUsage map[string][]*RateLimiting
BusinessUseCaseUsage is the business use case usage data.
type DebugInfo ¶
type DebugInfo struct { Messages []DebugMessage // debug messages. it can be nil if there is no message. Header http.Header // all HTTP headers for this response. Proto string // HTTP protocol name for this response. // Facebook debug HTTP headers. FacebookApiVersion string // the actual graph API version provided by facebook-api-version HTTP header. FacebookDebug string // the X-FB-Debug HTTP header. FacebookRev string // the x-fb-rev HTTP header. }
DebugInfo is the debug information returned by facebook when debug mode is enabled.
type DebugMessage ¶
DebugMessage is one debug message in "__debug__" of graph API response.
type DebugMode ¶
type DebugMode string
DebugMode is the debug mode of Graph API. See https://developers.facebook.com/docs/graph-api/using-graph-api/v2.3#graphapidebugmode
type Error ¶
type Error struct { Message string Type string Code int ErrorSubcode int // subcode for authentication related errors. UserTitle string `json:"error_user_title,omitempty"` UserMessage string `json:"error_user_msg,omitempty"` IsTransient bool `json:"is_transient,omitempty"` TraceID string `json:"fbtrace_id,omitempty"` }
Error represents Facebook API error.
type Float32 ¶
type Float32 float32
Special number types which can be decoded from either a number or a string. If developers intend to use a string in JSON as a number, these types can parse string to a number implicitly in `Result#Decode` or `Result#DecodeField`.
Caveats: Parsing a string to a number may lose accuracy or shadow some errors.
type Float64 ¶
type Float64 float64
Special number types which can be decoded from either a number or a string. If developers intend to use a string in JSON as a number, these types can parse string to a number implicitly in `Result#Decode` or `Result#DecodeField`.
Caveats: Parsing a string to a number may lose accuracy or shadow some errors.
type HttpClient ¶
type HttpClient interface { Do(req *http.Request) (resp *http.Response, err error) Get(url string) (resp *http.Response, err error) Post(url string, bodyType string, body io.Reader) (resp *http.Response, err error) }
HttpClient is an interface to send http request. This interface is designed to be compatible with type `*http.Client`.
func DefaultHttpClient ¶
func DefaultHttpClient() HttpClient
DefaultHttpClient returns the http client for default session.
type Int ¶
type Int int
Special number types which can be decoded from either a number or a string. If developers intend to use a string in JSON as a number, these types can parse string to a number implicitly in `Result#Decode` or `Result#DecodeField`.
Caveats: Parsing a string to a number may lose accuracy or shadow some errors.
type Int16 ¶
type Int16 int16
Special number types which can be decoded from either a number or a string. If developers intend to use a string in JSON as a number, these types can parse string to a number implicitly in `Result#Decode` or `Result#DecodeField`.
Caveats: Parsing a string to a number may lose accuracy or shadow some errors.
type Int32 ¶
type Int32 int32
Special number types which can be decoded from either a number or a string. If developers intend to use a string in JSON as a number, these types can parse string to a number implicitly in `Result#Decode` or `Result#DecodeField`.
Caveats: Parsing a string to a number may lose accuracy or shadow some errors.
type Int64 ¶
type Int64 int64
Special number types which can be decoded from either a number or a string. If developers intend to use a string in JSON as a number, these types can parse string to a number implicitly in `Result#Decode` or `Result#DecodeField`.
Caveats: Parsing a string to a number may lose accuracy or shadow some errors.
type Int8 ¶
type Int8 int8
Special number types which can be decoded from either a number or a string. If developers intend to use a string in JSON as a number, these types can parse string to a number implicitly in `Result#Decode` or `Result#DecodeField`.
Caveats: Parsing a string to a number may lose accuracy or shadow some errors.
type PagingResult ¶
type PagingResult struct {
// contains filtered or unexported fields
}
PagingResult represents facebook API call result with paging information.
func (*PagingResult) Decode ¶
func (pr *PagingResult) Decode(v interface{}) (err error)
Decode decodes the current full result to a struct. See Result#Decode.
func (*PagingResult) HasNext ¶
func (pr *PagingResult) HasNext() bool
HasNext checks whether there is next page.
func (*PagingResult) HasPrevious ¶
func (pr *PagingResult) HasPrevious() bool
HasPrevious checks whether there is previous page.
func (*PagingResult) Next ¶
func (pr *PagingResult) Next() (noMore bool, err error)
Next reads next page.
func (*PagingResult) Previous ¶
func (pr *PagingResult) Previous() (noMore bool, err error)
Previous reads previous page.
func (*PagingResult) UsageInfo ¶
func (pr *PagingResult) UsageInfo() *UsageInfo
UsageInfo returns API usage information, including business use case, app, page, ad account rate limiting.
type Params ¶
type Params map[string]interface{}
Params is the params used to send Facebook API request.
For general uses, just use Params as an ordinary map.
For advanced uses, use MakeParams to create Params from any struct.
func MakeParams ¶
func MakeParams(data interface{}) (params Params)
MakeParams makes a new Params instance by given data. Data must be a struct or a map with string keys. MakeParams will change all struct field name to lower case name with underscore. e.g. "FooBar" will be changed to "foo_bar".
Returns nil if data cannot be used to make a Params instance.
type RateLimiting ¶
type RateLimiting struct { CallCount int `json:"call_count"` // Percentage of calls made for this business ad account. TotalTime int `json:"total_time"` // Percentage of the total CPU time that has been used. TotalCPUTime int `json:"total_cputime"` // Percentage of the total time that has been used. Type string `json:"type"` // Type of rate limit logic being applied. EstimatedTimeToRegainAccess int `json:"estimated_time_to_regain_access"` // Time in minutes to resume calls. }
RateLimiting is the rate limiting header for business use cases.
type Result ¶
type Result map[string]interface{}
Result is Facebook API call result.
func Api ¶
Api makes a facebook graph api call with default session.
Method can be GET, POST, DELETE or PUT.
Params represents query strings in this call. Keys and values in params will be encoded into the URL automatically, so there is no need to encode keys or values in params manually. Params can be nil.
If you want to get
https://graph.facebook.com/huandu?fields=name,username
Api should be called as following
Api("/huandu", GET, Params{"fields": "name,username"})
or in a simplified way
Get("/huandu", Params{"fields": "name,username"})
Api is a wrapper of Session.Api(). It's designed for graph api that doesn't require app id, app secret and access token. It can be called in multiple goroutines.
If app id, app secret or access token is required in graph api, caller should create a new facebook session through App instance instead.
func Batch ¶
Batch makes a batch facebook graph api call with default session. Batch is designed for more advanced usage including uploading binary files.
An uploading files sample
// equivalent to following curl command (borrowed from facebook docs) // curl \ // -F 'access_token=…' \ // -F 'batch=[{"method":"POST","relative_url":"me/photos","body":"message=My cat photo","attached_files":"file1"},{"method":"POST","relative_url":"me/photos","body":"message=My dog photo","attached_files":"file2"}]' \ // -F 'file1=@cat.gif' \ // -F 'file2=@dog.jpg' \ // https://graph.facebook.com Batch(Params{ "access_token": "the-access-token", "file1": File("cat.gif"), "file2": File("dog.jpg"), }, Params{ "method": "POST", "relative_url": "me/photos", "body": "message=My cat photo", "attached_files": "file1", }, Params{ "method": "POST", "relative_url": "me/photos", "body": "message=My dog photo", "attached_files": "file2", })
Facebook document: https://developers.facebook.com/docs/graph-api/making-multiple-requests
func BatchApi ¶
BatchApi makes a batch facebook graph api call with default session.
BatchApi supports most kinds of batch calls defines in facebook batch api document, except uploading binary data. Use Batch to do so.
Note: API response is stored in "body" field of a Result.
results, _ := BatchApi(accessToken, Params{...}, Params{...}) // Use first batch api response. var res1 *BatchResult var err error res1, err = results[0].Batch() if err != nil { // this is not a valid batch api response. } // Use BatchResult#Result to get response body content as Result. res := res1.Result
Facebook document: https://developers.facebook.com/docs/graph-api/making-multiple-requests
func MakeResult ¶
MakeResult makes a Result from facebook Graph API response.
func Request ¶
Request makes an arbitrary HTTP request with default session. It expects server responses a facebook Graph API response.
request, _ := http.NewRequest("https://graph.facebook.com/538744468", "GET", nil) res, err := Request(request) fmt.Println(res["gender"]) // get "male"
func (Result) Batch ¶
func (res Result) Batch() (*BatchResult, error)
Batch creates a BatchResult for this result and returns error if the Result is not a batch api response.
See BatchApi document for a sample usage.
func (Result) DebugInfo ¶
DebugInfo creates a DebugInfo for this result if this result has "__debug__" key.
func (Result) Decode ¶
Decode decodes full result to a struct. It only decodes fields defined in the struct.
As all facebook response fields are lower case strings, Decode will convert all camel-case field names to lower case string. e.g. field name "FooBar" will be converted to "foo_bar". The side effect is that if a struct has 2 fields with only capital differences, decoder will map these fields to a same result value.
If a field is missing in the result, Decode keeps it unchanged by default.
The decoding of each struct field can be customized by the format string stored under the "facebook" key or the "json" key in the struct field's tag. The "facebook" key is recommended as it's specifically designed for this package.
Examples:
type Foo struct { // "id" must exist in response. note the leading comma. Id string `facebook:",required"` // use "name" as field name in response. TheName string `facebook:"name"` // the "json" key also works as expected. Key string `json:"my_key"` // if both "facebook" and "json" key are set, the "facebook" key is used. Value string `facebook:"value" json:"shadowed"` }
To change default behavior, set a struct tag `facebook:",required"` to fields should not be missing.
Returns error if v is not a struct or any required v field name absents in res.
func (Result) DecodeField ¶
DecodeField decodes a field of result to any type, including struct. Field name format is defined in Result.Get().
More details about decoding struct see Result.Decode().
func (Result) Err ¶
Err returns an error if Result is a Graph API error.
The returned error can be converted to Error by type assertion.
err := res.Err() if err != nil { if e, ok := err.(*Error); ok { // read more details in e.Message, e.Code and e.Type } }
For more information about Graph API Errors, see https://developers.facebook.com/docs/reference/api/errors/
func (Result) Get ¶
Get gets a field from Result.
Field can be a dot separated string. If field name is "a.b.c", it will try to return value of res["a"]["b"]["c"].
To access array items, use index value in field. For instance, field "a.0.c" means to read res["a"][0]["c"].
It doesn't work with Result which has a key contains dot. Use GetField in this case.
Returns nil if field doesn't exist.
func (Result) GetField ¶
GetField gets a field from Result.
Arguments are treated as keys to access value in Result. If arguments are "a","b","c", it will try to return value of res["a"]["b"]["c"].
To access array items, use index value as a string. For instance, args of "a", "0", "c" means to read res["a"][0]["c"].
Returns nil if field doesn't exist.
func (Result) Paging ¶
func (res Result) Paging(session *Session) (*PagingResult, error)
Paging creates a PagingResult for this Result and returns error if the Result cannot be used for paging.
Facebook uses following JSON structure to response paging information. If "data" doesn't present in Result, Paging will return error.
{ "data": [...], "paging": { "previous": "https://graph.facebook.com/...", "next": "https://graph.facebook.com/..." } }
type Session ¶
type Session struct { HttpClient HttpClient Version string // facebook versioning. RFC3339Timestamps bool // set to true to send date_format=Y-m-d\TH:i:sP on every request which will cause RFC3339 style timestamps to be returned BaseURL string // set to override API base URL - trailing slash is required, e.g. http://127.0.0.1:53453/ // contains filtered or unexported fields }
Session holds a facebook session with an access token. Session should be created by App.Session or App.SessionFromSignedRequest.
func (*Session) AccessToken ¶
AccessToken gets current access token.
func (*Session) Api ¶
Api makes a facebook graph api call.
If session access token is set, "access_token" in params will be set to the token value.
Returns facebook graph api call result. If facebook returns error in response, returns error details in res and set err.
func (*Session) AppsecretProof ¶
AppsecretProof checks appsecret proof is enabled or not.
func (*Session) Batch ¶
Batch makes a batch facebook graph api call. Batch is designed for more advanced usage including uploading binary files.
If session access token is set, "access_token" in batchParams will be set to the token value.
Facebook document: https://developers.facebook.com/docs/graph-api/making-multiple-requests
func (*Session) BatchApi ¶
BatchApi makes a batch call. Each params represent a single facebook graph api call.
BatchApi supports most kinds of batch calls defines in facebook batch api document, except uploading binary data. Use Batch to upload binary data.
If session access token is set, the token will be used in batch api call.
Returns an array of batch call result on success.
Facebook document: https://developers.facebook.com/docs/graph-api/making-multiple-requests
func (*Session) Context ¶
Context returns the session's context. To change the context, use `Session#WithContext`.
The returned context is always non-nil; it defaults to the background context. For outgoing Facebook API requests, the context controls timeout/deadline and cancelation.
func (*Session) EnableAppsecretProof ¶
EnableAppsecretProof enables or disable appsecret proof status. Returns error if there is no App associated with this Session.
func (*Session) Inspect ¶
Inspect Session access token. Returns JSON array containing data about the inspected token. See https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow/#checktoken
func (*Session) Request ¶
Request makes an arbitrary HTTP request. It expects server responses a facebook Graph API response.
request, _ := http.NewRequest("https://graph.facebook.com/538744468", "GET", nil) res, err := session.Request(request) fmt.Println(res["gender"]) // get "male"
func (*Session) SetAccessToken ¶
SetAccessToken sets a new access token.
func (*Session) SetDebug ¶
SetDebug updates per session debug mode and returns old mode. If per session debug mode is DEBUG_OFF, session will use global Debug mode.
func (*Session) User ¶
User gets current user id from access token.
Returns error if access token is not set or invalid.
It's a standard way to validate a facebook access token.
type Uint ¶
type Uint uint
Special number types which can be decoded from either a number or a string. If developers intend to use a string in JSON as a number, these types can parse string to a number implicitly in `Result#Decode` or `Result#DecodeField`.
Caveats: Parsing a string to a number may lose accuracy or shadow some errors.
type Uint16 ¶
type Uint16 uint16
Special number types which can be decoded from either a number or a string. If developers intend to use a string in JSON as a number, these types can parse string to a number implicitly in `Result#Decode` or `Result#DecodeField`.
Caveats: Parsing a string to a number may lose accuracy or shadow some errors.
type Uint32 ¶
type Uint32 uint32
Special number types which can be decoded from either a number or a string. If developers intend to use a string in JSON as a number, these types can parse string to a number implicitly in `Result#Decode` or `Result#DecodeField`.
Caveats: Parsing a string to a number may lose accuracy or shadow some errors.
type Uint64 ¶
type Uint64 uint64
Special number types which can be decoded from either a number or a string. If developers intend to use a string in JSON as a number, these types can parse string to a number implicitly in `Result#Decode` or `Result#DecodeField`.
Caveats: Parsing a string to a number may lose accuracy or shadow some errors.
type Uint8 ¶
type Uint8 uint8
Special number types which can be decoded from either a number or a string. If developers intend to use a string in JSON as a number, these types can parse string to a number implicitly in `Result#Decode` or `Result#DecodeField`.
Caveats: Parsing a string to a number may lose accuracy or shadow some errors.
type UsageInfo ¶
type UsageInfo struct { App RateLimiting `json:"app"` // HTTP header X-App-Usage. Page RateLimiting `json:"page"` // HTTP header X-Page-Usage. AdAccount RateLimiting `json:"ad_account"` // HTTP header X-Ad-Account-Usage. AdsInsights AdsInsightsThrottle `json:"ads_insights"` // HTTP header x-fb-ads-insights-throttle BusinessUseCase BusinessUseCaseUsage `json:"business_use_case"` // HTTP header x-business-use-case-usage. }
UsageInfo is the app usage (rate limit) information returned by facebook when rate limits are possible.