npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

facebook-explorer

v1.2.6

Published

Javascript library for performing various searches using Facebook API

Downloads

60

Readme

facebook-explorer

Promise based library for performing various searches on Facebook (using Facebook Graph API). It utilizes various optimisation techniques to limit number of requests and amount of transfered data to minimum.

Table of contents

Quick start

Several quick start options are available:

Download the latest build
Development, unminified code
Production, minified code
Install from Bower
bower install facebook-explorer --save
Install from Npm
npm install facebook-explorer --save
Using Git repository

To clone the repository, use

git clone https://github.com/karenpommeroy/facebook-explorer.git

Build sources
grunt build

Done!

Usage

facebook-explorer comes as an UMD module which means you can use it as an AMD or CommonJS module as well as a standalone library.

Include as a module (require.js):
var FBExplorer = require("facebook-explorer"); // or whatever module name you assigned
Including files (standalone):
<script src="/path/to/facebook.explorer.js"></script>
<script>
	FBExplorer.doSomething();
</script>

Initialization

Before performing any operations you will need to provide your Application ID in order to get access to Facebook Graph API. Step by step instruction how to obtain one for your app can be found on Facebook for Developers

Once obtained id has to be set by invoking init method with appId (string) parameter:

FBExplorer.init({ appId: "YOUR_APP_ID" });

You can change it later by calling:

FBExplorer.setAppId("YOUR_APP_ID");

Options

facebook-explorer can be configured by invoking init() method with options object as it's parameter.

Here is the explanation of possible options:

Option | Type | Description | Default | Options --------------- | ------- | ---------------------------------------------------- | --------| -------------------------- appId | string | Facebook Application ID | | version | string | Facebook Graph API version to use | "v2.9" | profile | string | Name of the default search profile (explained below) | "brief" | "basic", "brief", "extended", "full" since | string | Default lower limit for time based searches | "now" | days | int | Default upper limit for time based searches (in days)| 30 | method | string | Default algorithm used when searching for events | "chunk" | "chunk", "multiple", "least" limit | int | Default limit for Facebook API requests | 100 |

Search profiles

Normally when using Facebook Graph API we often have to specify fields that will be returned in reponse. To make this easier facebook-explorer comes with few search profiles that have predefined field sets associated with them. Just a handy shorthand in place of listing all fields manually.

There are four profiles: "basic", "brief", "extended" and "full".

Profile "basic" is the most compact while "full" contains all possible fields (others fall somewhere in between) Here is the list of fields included in each profile listed by type of searched item:

"basic":

  • For each search type: id, name

"brief":

  • places: category, description, id, location, name, picture
  • pages: category, description, id, name, picture
  • events: category, cover, description, id, end_time, name, place, start_time

"extended":

  • places: category, description, hours, id, location, name, phone, picture, website
  • pages: category, cover, description, id, end_time, name, place, start_time
  • events: attending_count, category, cover, description, id, interested_count, end_time, maybe_count, name, place, start_time, type

"full":

FBExplorer.findPlaces({
	keywords: "Agrestic Shopping Mall",
    profile: "full"
});

Of course you can also specify fields manually without using profiles. To do this just include fields attribute (string) in your search options (nested queries are also allowed). If specified together with profile this attribute will take precedence and profile will be ignored.

FBExplorer.findPlaces({
	keywords: "Majestic Town Hall",
    fields: "id,name,photos.limit(1),location{latitude,longitude}"
});

Methods

void init(object config)

Initialises facebook-explorer should be called before any other methods.

FBExplorer.init({
	appId: "6661097367666",
    version: "v2.9",
    profile: "brief"
    since: "now",
    days: 30
});
string getAppId()

Returns currently set application id.

var appId = FBExplorer.getAppId();
void setAppId(string appId)

Sets new application id.

FBExplorer.setAppId("6661097367666");
Promise findEvents(object searchOptions, function partialResultCallback)

Performs search for events and returns promise for the result. First parameter is required and represents object containg search attributes. Second optional parameter is a function that will be invoked whenever new results are available.

var searchOptions = {
    center: {
    	latitude: 51.12456,
        longitude: -52.45444
    },
    distance: 100,
    keywords: "My Event Name",
    profile: "brief",
    until: "2017-12-02",
    sort: "time",
    order: "asc",
    methid: "multiple"
};

function partialResultsCallback(result, hasMore) {
	console.log(result);
};

FBExplorer.findEvents(searchOptions, partialResultsCallback)
.then(function(result) {
	// do something with the result
};
Promise findPages(object searchOptions, function partialResultCallback)

Performs search for pages and returns promise for the result. First parameter is required and represents object containg search attributes. Second optional parameter is a function that will be invoked whenever new results are available.

var searchOptions = {
    fields: "id,name",
    keywords: "My Page",
    sort: "name",
    order: "desc"
};

function partialResultsCallback(result, hasMore) {
	console.log(result);
};

FBExplorer.findPages(searchOptions, partialResultsCallback)
.then(function(result) {
	// do something with the result
};
Promise findPlaces(object searchOptions, function partialResultsCallback)

Performs search for places and returns promise for the result. First parameter is required and represents object containg search attributes. Second optional parameter is a function that will be invoked whenever new results are available.

var searchOptions = {
    center: {
    	latitude: 51.12456,
        longitude: -52.45444
    },
    distance: 500,
    keywords: "My Place",
    profile: "full",
    since: "2017-01-01",
    sort: "distance",
    order: "asc"
};

function partialResultsCallback(result, hasMore) {
	console.log(result);
};

FBExplorer.findPlaces(searchOptions, partialResultsCallback)
.then(function(result) {
	// do something with the result
};

Searching

Search Options

Possible search options vary a little depending on what are you actually searching for.

Option | Type | Description | Details --------- | ------- | ----------------------------------------------------- | --------------------------------------- fields | string | Comma separated field namse to be included in results | Possible items differ with search keywords | string | Keyword to search for (searches name, description) | Required when searching for pages profile | string | Name of predefined fields profile to use | check [SearchProfiles](Search Profiles) sort | string | Determines how should the results be sorted | check Sorting order | string | Sorting order | "asc" or "desc"

Below options are available only when searching for items that have location attributes (places, events).

Option | Type | Description | Details --------- | ------- | --------------------------------------------------------------- | ------------------------------ center | object | Center point containing latitude (float) and longitude (float) | Coordinates in EPSG:4326 distance | int | Search radius, distance from center (in metres) | Shouldn't exceed 50000 cityId | string | City id as defined by Facebook |

Below options are available only when searching only for events.

Option | Type | Description | Details --------- | ------- | ----------------------------------------------------- | -------------------------------- since | string | Lower time boundary, Unix timestamp or strtotime data value as accepted by FB Graph API. | Default is "now" until | string | Upper time boundary, Unix timestamp or strtotime data value as accepted by FB Graph API. | method | string | Type of search algorithm to use | check [SearchAlgorithms(Search Algorithms)

Search algorithms

After Facebook deprecated FQL support (since v2.1) searching for events by location became a little bit tricky. There are number of ways that such a search can be approached using FB Graph API alone and because of that facebook-explorer allows you to choose between three different algorithms. Each one has it's advantages and disadvantages and execution time can differ significantly under specific conditions.

Least number of requests ("least") - performs search using the least amount of requests possible but each response can be very large

  • search for places according to search parameters
  • include events information in response (using nested queries)

Multiple small requests ("multiple") - performs many smaller requests, each response is optimized in size

  • search for places according to search parameters
  • make a separate request for each place to obtain associated events data

Chunked requests ("chunked") - this one falls somewhere in between the above utilizing nested queries

  • search for places according to search parameters
  • make request for events from multiple places at once (combining up to 50 places per one request)

I noticed that sometimes a place may contain events that are hosted elsewhere (place location is different than the event location). Such events are filtered out if their location does not match specified search parameters.

Each algorithm removes duplicates before returning the results.

Sorting

Results can be returned in a specific order and this is determined by providing sort (string) and order (string) attributes along with search options.

You can sort results using sorts:

  • "name" - results are sorted alphabetically by name
  • "distance" - results are ordered depending on their distance from center point, applies only to items with location attributes (places, events)
  • "time" - results are sorted by their start time, applies only to events

Order can be one of two possibilities: "asc" or "desc".

Partial results

In some cases when searches are complicated (i.e. cover very large area or time range) there are multiple request sent to get the complete data and sometimes waiting for all of the results to be ready may take some time.

Nobody likes to wait so facebook-explorer provides a way to overcome this problem to some degree. Each find method has an optional second parameter that is a function with following definition:

function partialResultsCallback(Array result, bool hasMore) {
	// do something with partial results
};

This is called a partial result callback and will be called each time a new portion of data is available without having to wait for the complete item. First parameter contains new portion of data that was returned in the current search and second informs you if there will be more data available. This way it is for example possible to display some data imemdiately once it appears and load remaining in the background.

Known limitations

  • The Graph API has some "instabilities" with search results. It's possible that the amount of results returned can vary between calls within seconds
  • Rate limiting will apply, but it may happen only in rare cases and you should experience no call blocks within a reasonable amount of service requests. Be aware that the way this library works, allows for performing searched with potentially hundreds of (counted) Graph API calls per request to /events.

Copyright and license

Licensed under MIT license.

^ back to top