What is this article about?
This document gives an example on how to extract facebook events using a Drupal 7 module
What does this document cover?
Why do I need to extract facebook events?
I have built a website devote to Turkish Jazz. I am listing Jazz events in town, doing that manually is a lot of work. Since nearly all the venues are sharing the events on FB, I have decided to grab the data from their facebook pages. Using a single API (facebook graph API) also reduces the amount of work for different venues.
Requirements
- You need to register an app to Facebook.
- Install Facebook OAuth module for drupal and configure the module as described.
- Associate your drupal user with your drupal user from the /user page. This will give authentication to make calls to facebook.
The module
function YOUR_MODULE_menu(){
$items = array();
$items['events_importer'] = array(
'title' => 'event importer',
'description' => 'super event importer',
'page callback' => 'YOUR_MODULE_event_importer',
'access callback' => TRUE,
'type' => MENU_NORMAL_ITEM,
);
return $items;
}
YOUR_MODULE_menu
will create a url like /events_importer
/**
* Implements hook_fboauth_actions().
*/
function YOUR_MODULE_fboauth_actions() {
$actions['YOUR_MODULE_event_import'] = array(
'title' => t('Event import'),
'callback' => 'YOUR_MODULE_fboauth_action_event_import',
);
return $actions;
}
YOUR_MODULE_fboauth_actions
hooks an action, you may leave it as it is.
function YOUR_MODULE_fboauth_action_event_import($app_id, $access_token) {
$venues = YOUR_MODULE_venue_fb_ids();
$tsv = "venue title musicians image startdate enddate description cost id\n";
foreach ($venues as $venue_name=>$venue_fb_id) {
$page_events = fboauth_graph_query('/'.$venue_fb_id.'/events?time_filter=upcoming&fields=id,cover,description,end_time,start_time,name', $access_token);
foreach ($page_events->data as $event_obj) {
$event_data = YOUR_MODULE_individual_event($venue_name,$event_obj,$access_token);
if($event_data["musicians"]!=="") {
$tsv .= $event_data["venue"] . "\t" . $event_data["name"] . "\t" . $event_data["musicians"] . "\t" . $event_data["picture"] . "\t" . $event_data["start_time"] . "\t" . $event_data["end_time"] . "\t" . /*$event_data["description"]*/ " " . "\t" . $event_data["cost"] . "\t" . $event_data["id"] . "\n";
}
}
}
file_save_data($tsv,'public://event_importer.tsv',$replace = FILE_EXISTS_RENAME);
drupal_goto("/events_importer");
}
YOUR_MODULE_fboauth_action_event_import
hook action, trig this function where all the magic happens.
- We got the venue IDs,
- Set a tsv file header,
- Make a request to FB to get the list of events per each venue
- Format the event data by sending it to
YOUR_MODULE_individual_event
- Registers a line to the tsv file for the event detail
- Save the tsv file
function YOUR_MODULE_individual_event($venue,$event_obj,$access_token) {
$description = trim(preg_replace('/\s+/', ' ', $event_obj->description));
$musicians = YOUR_MODULE_populate_musicians($description);
$cost = YOUR_MODULE_populate_cost($description);
$event_data = array(
"description" => $description,
"end_time" => $event_obj->end_time,
"start_time" => $event_obj->start_time,
"name" => $event_obj->name,
"id" => $event_obj->id,
"picture" => $event_obj->cover->source,
"venue" => $venue,
"musicians" => $musicians,
"cost" => $cost
);
return $event_data;
}
YOUR_MODULE_individual_event
format the event data.
- Get the list of the musicians from the json view, i do this because if there are no jazz musicians mentioned in the event description, I filter that event as a none jazz event.
- Get the cost from the description,
- Format the data end return
function YOUR_MODULE_populate_musicians($description) {
$raw = drupal_http_request("https://www.turkishjazz.org/artists-json");
$raw_arr = json_decode($raw->data);
$musicians = "";
foreach ($raw_arr as $artist) {
if(strpos($description,$artist->title) !== false) {
$musicians .= $artist->title . ",";
}
}
$musicians = rtrim($musicians,",");
return $musicians;
}
YOUR_MODULE_populate_musicians
format the event data.
- I have created a JSON view in /artists-json so I get a list of the musicians from my database and return the data
function YOUR_MODULE_populate_cost($description) {
$event_cost_data = preg_match_all("/(:|\s|:\s|;|;\s)(\d{2,3})(\s|.|.-|\s.-|\s.-\s)TL/i",$description,$matches);
$event_cost = "-";
if($matches[2][0]>0) {
$event_cost = $matches[2][0] . "USD";
}
return $event_cost;
}
YOUR_MODULE_populate_cost
format the event data.
- Get the cost from the description by a regular expression
function YOUR_MODULE_event_importer() {
return fboauth_action_display('YOUR_MODULE_event_import');
}
YOUR_MODULE_event_importer
the event importer page.
function YOUR_MODULE_venue_fb_ids() {
$venues = array(
"The Badau İstanbul" => 167317496965160,
"Nardis Jazz" => 8482520218,
"Kaset Mitanni" => 215803695103308,
"Tamirane" => 210613578979409,
"DasDas" => 136827509664438,
"Zorlu PSM Studio" => 132312760706407,
"Jazz Company/ Elite World İstanbul Hotel" => 272245359480852,
"Moda Kayıkhane" => 141314409760781,
"Living Room" => 169035839811731,
"BOVA" => 179019409325003
);
return $venues;
}
YOUR_MODULE_venue_fb_ids
manually enter the venue FB IDs in this array.
Now visit /events_importer, click on the button, then it will create a file called “event_importer.tsv” in your public files directory. You can use this tsv file to create a feed to automate the import process by using Drupal Feeds module.